ZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsMzUgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IENyZWF0ZSBhIHJlcG9ydCB0byBoZWxwIHVzIGltcHJvdmUKK3RpdGxlOiAnJworbGFiZWxzOiAnJworYXNzaWduZWVzOiAnJworCistLS0KKworKipDYXV0aW9uKioKK1RoZSBJc3N1ZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgZm9yIHRoZSByZXBvcnRpbmcgb2YgcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHByb2plY3QuCitGb3IgYW55IG90aGVyIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgU1RNMzIgcHJvZHVjdCwgdGhlIHBlcmZvcm1hbmNlLCB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzIGFuZCBib2FyZHMsIHRoZSB0b29scyB0aGUgZW52aXJvbm1lbnQgaW4gZ2VuZXJhbCwgcGxlYXNlIHBvc3QgYSB0b3BpYyBpbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykgCisKKyoqRGVzY3JpYmUgdGhlIHNldC11cCoqCisgKiBUaGUgYm9hcmQgKGVpdGhlciBTVCBSUE4gcmVmZXJlbmNlIG9yIHlvdXIgY3VzdG9tIGJvYXJkKQorICogSURFIG9yIGF0IGxlYXN0IHRoZSBjb21waWxlciBhbmQgaXRzIHZlcnNpb24KKworKipEZXNjcmliZSB0aGUgYnVnKioKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgYnVnIGlzLgorCisqKkhvdyBUbyBSZXByb2R1Y2UqKgorMS4gSW5kaWNhdGUgdGhlIGdsb2JhbCBiZWhhdmlvciBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QKKworMi4gVGhlIG1vZHVsZXMgdGhhdCB5b3Ugc3VzcGVjdCB0byBiZSB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0gKERyaXZlciwgQlNQLCBNVyAuLi4pCisKKzMuIFRoZSB1c2UgY2FzZSB0aGF0IGdlbmVyYXRlcyB0aGUgcHJvYmxlbQorCis0LiBIb3cgd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbQorCisKKyoqQWRkaXRpb25hbCBjb250ZXh0KioKK0lmIHlvdSBoYXZlIGEgZmlyc3QgYW5hbHlzaXMgb3IgcGF0Y2ggY29ycmVjdGlvbiwgdGhhbmsgeW91IHRvIHNoYXJlIHlvdXIgcHJvcG9zYWwuCisKKyoqU2NyZWVuc2hvdHMqKgorSWYgYXBwbGljYWJsZSwgYWRkIHNjcmVlbnNob3RzIHRvIGhlbHAgZXhwbGFpbiB5b3VyIHByb2JsZW0uCmRpZmYgLS1naXQgYS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL290aGVyLWlzc3VlLm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApAQCAtMCwwICsxLDIyIEBACistLS0KK25hbWU6ICdPdGhlciBJc3N1ZSAnCithYm91dDogR2VuZXJpYyBpc3N1ZSBkZXNjcmlwdGlvbgordGl0bGU6ICcnCitsYWJlbHM6ICcnCithc3NpZ25lZXM6ICcnCisKKy0tLQorCisqKkNhdXRpb24qKgorVGhlIElzc3VlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBwcm9ibGVtIGVuY291bnRlcmVkIHdpdGggdGhlIHNvZnR3YXJlIHByb3ZpZGVkIGluIHRoaXMgcHJvamVjdC4KK0ZvciBhbnkgb3RoZXIgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBTVE0zMiBwcm9kdWN0LCB0aGUgcGVyZm9ybWFuY2UsIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGJvYXJkcywgdGhlIHRvb2xzIHRoZSBlbnZpcm9ubWVudCBpbiBnZW5lcmFsLCBwbGVhc2UgcG9zdCBhIHRvcGljIGluIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKSAKKworKipEZXNjcmliZSB0aGUgc2V0LXVwKioKKyAqIFRoZSBib2FyZCAoZWl0aGVyIFNUIFJQTiByZWZlcmVuY2Ugb3IgeW91ciBjdXN0b20gYm9hcmQpCisgKiBJREUgb3IgYXQgbGVhc3QgdGhlIGNvbXBpbGVyIGFuZCBpdHMgdmVyc2lvbgorCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIGEgcGF0Y2ggcHJvcG9zYWwsIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKQEAgLTAsMCArMSw4IEBACisjIyBJTVBPUlRBTlQgSU5GT1JNQVRJT04gCisKKyMjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKQorKiBUaGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyBvbmx5IGFmdGVyIGEgKipDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSoqIG1lY2hhbmlzbSBoYXMgYmVlbiBkZXBsb3llZC4KKyogV2UgYXJlIGN1cnJlbnRseSB3b3JraW5nIG9uIHRoZSBzZXQtdXAgb2YgdGhpcyBwcm9jZWR1cmUuIAorICAKKworCmRpZmYgLS1naXQgYS9DT0RFX09GX0NPTkRVQ1QubWQgYi9DT0RFX09GX0NPTkRVQ1QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MmIwNAotLS0gL2Rldi9udWxsCisrKyBiL0NPREVfT0ZfQ09ORFVDVC5tZApAQCAtMCwwICsxLDc2IEBACisjIENvbnRyaWJ1dG9yIENvdmVuYW50IENvZGUgb2YgQ29uZHVjdAorCisjIyBPdXIgUGxlZGdlCisKK0luIHRoZSBpbnRlcmVzdCBvZiBmb3N0ZXJpbmcgYW4gb3BlbiBhbmQgd2VsY29taW5nIGVudmlyb25tZW50LCB3ZSBhcworY29udHJpYnV0b3JzIGFuZCBtYWludGFpbmVycyBwbGVkZ2UgdG8gbWFraW5nIHBhcnRpY2lwYXRpb24gaW4gb3VyIHByb2plY3QgYW5kCitvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keQorc2l6ZSwgZGlzYWJpbGl0eSwgZXRobmljaXR5LCBzZXggY2hhcmFjdGVyaXN0aWNzLCBnZW5kZXIgaWRlbnRpdHkgYW5kIGV4cHJlc3Npb24sCitsZXZlbCBvZiBleHBlcmllbmNlLCBlZHVjYXRpb24sIHNvY2lvLWVjb25vbWljIHN0YXR1cywgbmF0aW9uYWxpdHksIHBlcnNvbmFsCithcHBlYXJhbmNlLCByYWNlLCByZWxpZ2lvbiwgb3Igc2V4dWFsIGlkZW50aXR5IGFuZCBvcmllbnRhdGlvbi4KKworIyMgT3VyIFN0YW5kYXJkcworCitFeGFtcGxlcyBvZiBiZWhhdmlvciB0aGF0IGNvbnRyaWJ1dGVzIHRvIGNyZWF0aW5nIGEgcG9zaXRpdmUgZW52aXJvbm1lbnQKK2luY2x1ZGU6CisKKyogVXNpbmcgd2VsY29taW5nIGFuZCBpbmNsdXNpdmUgbGFuZ3VhZ2UKKyogQmVpbmcgcmVzcGVjdGZ1bCBvZiBkaWZmZXJpbmcgdmlld3BvaW50cyBhbmQgZXhwZXJpZW5jZXMKKyogR3JhY2VmdWxseSBhY2NlcHRpbmcgY29uc3RydWN0aXZlIGNyaXRpY2lzbQorKiBGb2N1c2luZyBvbiB3aGF0IGlzIGJlc3QgZm9yIHRoZSBjb21tdW5pdHkKKyogU2hvd2luZyBlbXBhdGh5IHRvd2FyZHMgb3RoZXIgY29tbXVuaXR5IG1lbWJlcnMKKworRXhhbXBsZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIGJ5IHBhcnRpY2lwYW50cyBpbmNsdWRlOgorCisqIFRoZSB1c2Ugb2Ygc2V4dWFsaXplZCBsYW5ndWFnZSBvciBpbWFnZXJ5IGFuZCB1bndlbGNvbWUgc2V4dWFsIGF0dGVudGlvbiBvcgorIGFkdmFuY2VzCisqIFRyb2xsaW5nLCBpbnN1bHRpbmcvZGVyb2dhdG9yeSBjb21tZW50cywgYW5kIHBlcnNvbmFsIG9yIHBvbGl0aWNhbCBhdHRhY2tzCisqIFB1YmxpYyBvciBwcml2YXRlIGhhcmFzc21lbnQKKyogUHVibGlzaGluZyBvdGhlcnMnIHByaXZhdGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBwaHlzaWNhbCBvciBlbGVjdHJvbmljCisgYWRkcmVzcywgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCisqIE90aGVyIGNvbmR1Y3Qgd2hpY2ggY291bGQgcmVhc29uYWJseSBiZSBjb25zaWRlcmVkIGluYXBwcm9wcmlhdGUgaW4gYQorIHByb2Zlc3Npb25hbCBzZXR0aW5nCisKKyMjIE91ciBSZXNwb25zaWJpbGl0aWVzCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGFyaWZ5aW5nIHRoZSBzdGFuZGFyZHMgb2YgYWNjZXB0YWJsZQorYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluCityZXNwb25zZSB0byBhbnkgaW5zdGFuY2VzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvci4KKworUHJvamVjdCBtYWludGFpbmVycyBoYXZlIHRoZSByaWdodCBhbmQgcmVzcG9uc2liaWxpdHkgdG8gcmVtb3ZlLCBlZGl0LCBvcgorcmVqZWN0IGNvbW1lbnRzLCBjb21taXRzLCBjb2RlLCB3aWtpIGVkaXRzLCBpc3N1ZXMsIGFuZCBvdGhlciBjb250cmlidXRpb25zCit0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yCitwZXJtYW5lbnRseSBhbnkgY29udHJpYnV0b3IgZm9yIG90aGVyIGJlaGF2aW9ycyB0aGF0IHRoZXkgZGVlbSBpbmFwcHJvcHJpYXRlLAordGhyZWF0ZW5pbmcsIG9mZmVuc2l2ZSwgb3IgaGFybWZ1bC4KKworIyMgU2NvcGUKKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyBib3RoIHdpdGhpbiBwcm9qZWN0IHNwYWNlcyBhbmQgaW4gcHVibGljIHNwYWNlcword2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZgorcmVwcmVzZW50aW5nIGEgcHJvamVjdCBvciBjb21tdW5pdHkgaW5jbHVkZSB1c2luZyBhbiBvZmZpY2lhbCBwcm9qZWN0IGUtbWFpbAorYWRkcmVzcywgcG9zdGluZyB2aWEgYW4gb2ZmaWNpYWwgc29jaWFsIG1lZGlhIGFjY291bnQsIG9yIGFjdGluZyBhcyBhbiBhcHBvaW50ZWQKK3JlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlCitmdXJ0aGVyIGRlZmluZWQgYW5kIGNsYXJpZmllZCBieSBwcm9qZWN0IG1haW50YWluZXJzLgorCisjIyBFbmZvcmNlbWVudAorCitJbnN0YW5jZXMgb2YgYWJ1c2l2ZSwgaGFyYXNzaW5nLCBvciBvdGhlcndpc2UgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIG1heSBiZQorcmVwb3J0ZWQgYnkgY29udGFjdGluZyB0aGUgcHJvamVjdCB0ZWFtIGF0IGh0dHBzOi8vd3d3LnN0LmNvbS9jb250ZW50L3N0X2NvbS9lbi9jb250YWN0LXVzLmh0bWwuIEFsbAorY29tcGxhaW50cyB3aWxsIGJlIHJldmlld2VkIGFuZCBpbnZlc3RpZ2F0ZWQgYW5kIHdpbGwgcmVzdWx0IGluIGEgcmVzcG9uc2UgdGhhdAoraXMgZGVlbWVkIG5lY2Vzc2FyeSBhbmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNpcmN1bXN0YW5jZXMuIFRoZSBwcm9qZWN0IHRlYW0gaXMKK29ibGlnYXRlZCB0byBtYWludGFpbiBjb25maWRlbnRpYWxpdHkgd2l0aCByZWdhcmQgdG8gdGhlIHJlcG9ydGVyIG9mIGFuIGluY2lkZW50LgorRnVydGhlciBkZXRhaWxzIG9mIHNwZWNpZmljIGVuZm9yY2VtZW50IHBvbGljaWVzIG1heSBiZSBwb3N0ZWQgc2VwYXJhdGVseS4KKworUHJvamVjdCBtYWludGFpbmVycyB3aG8gZG8gbm90IGZvbGxvdyBvciBlbmZvcmNlIHRoZSBDb2RlIG9mIENvbmR1Y3QgaW4gZ29vZAorZmFpdGggbWF5IGZhY2UgdGVtcG9yYXJ5IG9yIHBlcm1hbmVudCByZXBlcmN1c3Npb25zIGFzIGRldGVybWluZWQgYnkgb3RoZXIKK21lbWJlcnMgb2YgdGhlIHByb2plY3QncyBsZWFkZXJzaGlwLgorCisjIyBBdHRyaWJ1dGlvbgorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBpcyBhZGFwdGVkIGZyb20gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF1baG9tZXBhZ2VdLCB2ZXJzaW9uIDEuNCwKK2F2YWlsYWJsZSBhdCBodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzQvY29kZS1vZi1jb25kdWN0Lmh0bWwKKworW2hvbWVwYWdlXTogaHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnCisKK0ZvciBhbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjb2RlIG9mIGNvbmR1Y3QsIHNlZQoraHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnL2ZhcQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YWRiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyMSBAQAorIyMgQ29udHJpYnV0aW5nIGd1aWRlCitUaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGNoZWNrbGlzdCBiZWZvcmUgY29udHJpYnV0aW5nIHRvIHRoaXMgcmVwb3NpdG9yeS4KK0l0IGluY2x1ZGVzIGxpbmtzIHRvIHJlYWQgdXAgb24gaWYgdG9waWNzIGFyZSB1bmNsZWFyIHRvIHlvdS4KKworVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCisKKyMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQorVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKKyhleGFtcGxlIGZvciBbc3RtMzJnMHh4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJnMHh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KK0J1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorCistIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCistIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgorLSBbIF0gYE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbHJlYWR5IHJlcG9ydGVkL2ZpeGVkIG9uIEdpdEh1YiBvciBkaXNjdXNzZWQgb24gYSBwcmV2aW91cyBJc3N1ZS5gIFBsZWFzZSByZWZlciB0byB0aGlzIFtkYXNoYm9hcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1NUTWljcm9lbGVjdHJvbmljcy9wcm9qZWN0cy8yKSBmb3IgdGhlIGxpc3Qgb2YgaXNzdWVzIGFuZCBwdWxsLXJlcXVlc3RzLiBEbyBub3QgZm9yZ2V0IHRvIGJyb3dzZSBpbnRvIHRoZSAqKmNsb3NlZCoqIGlzc3Vlcy4KKworCisjIyMgMi4gUG9zdGluZyB0aGUgaXNzdWUKK1doZW4geW91IGhhdmUgY2hlY2tlZCB0aGUgcHJldmlvdXMgYm94ZXMuIFlvdSB3aWxsIGZpbmQgdHdvIHRlbXBsYXRlcyBJc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIHJlcG8KKworIyMjIDMuIFB1bGwgUmVxdWVzdHMKK0ZvciB0aGUgbW9tZW50LCB0aGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgaXMgbm90IGRlcGxveWVkLiBTVE1pY3JvbGVjdHJvbmljcyBpcyB3b3JraW5nIG9uIGEgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgcHJvY2VkdXJlCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWQ2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaApAQCAtMCwwICsxLDM1MTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9oYWxfbGVnYWN5LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGlhc2VzIGRlZmluaXRpb24gZm9yIHRoZSBTVE0zMkN1YmUgSEFMIGNvbnN0YW50cworICAqICAgICAgICAgIG1hY3JvcyBhbmQgZnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyX0hBTF9MRUdBQ1kKKyNkZWZpbmUgU1RNMzJfSEFMX0xFR0FDWQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FFU19BbGlhc2VkX0RlZmluZXMgSEFMIENSWVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQUVTX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfUkRFUlIKKyNkZWZpbmUgQUVTX0ZMQUdfV1JFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfV1JFUlIKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19DQ0YgICAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19DQ0YKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19SREVSUiAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19SREVSUgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1dSRVJSICAgICAgICAgICAgIENSWVBfQ0xFQVJGTEFHX1dSRVJSCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX0RlZmluZXMgSEFMIEFEQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTjEyYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEyQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjEwYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEwQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjhiICAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzhCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9ONmIgICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fNkIKKyNkZWZpbmUgT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgICAgICAgICBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyNkZWZpbmUgT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgICAgICAgICBBRENfT1ZSX0RBVEFfUFJFU0VSVkVECisjZGVmaW5lIEVPQ19TSU5HTEVfQ09OViAgICAgICAgICAgICAgICAgQURDX0VPQ19TSU5HTEVfQ09OVgorI2RlZmluZSBFT0NfU0VRX0NPTlYgICAgICAgICAgICAgICAgICAgIEFEQ19FT0NfU0VRX0NPTlYKKyNkZWZpbmUgRU9DX1NJTkdMRV9TRVFfQ09OViAgICAgICAgICAgICBBRENfRU9DX1NJTkdMRV9TRVFfQ09OVgorI2RlZmluZSBSRUdVTEFSX0dST1VQICAgICAgICAgICAgICAgICAgIEFEQ19SRUdVTEFSX0dST1VQCisjZGVmaW5lIElOSkVDVEVEX0dST1VQICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX0dST1VQCisjZGVmaW5lIFJFR1VMQVJfSU5KRUNURURfR1JPVVAgICAgICAgICAgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAKKyNkZWZpbmUgQVdEX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX0VWRU5UCisjZGVmaW5lIEFXRDFfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgQURDX0FXRDFfRVZFTlQKKyNkZWZpbmUgQVdEMl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEMl9FVkVOVAorI2RlZmluZSBBV0QzX0VWRU5UICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0QzX0VWRU5UCisjZGVmaW5lIE9WUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgQURDX09WUl9FVkVOVAorI2RlZmluZSBKUU9WRl9FVkVOVCAgICAgICAgICAgICAgICAgICAgIEFEQ19KUU9WRl9FVkVOVAorI2RlZmluZSBBTExfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgIEFEQ19BTExfQ0hBTk5FTFMKKyNkZWZpbmUgUkVHVUxBUl9DSEFOTkVMUyAgICAgICAgICAgICAgICBBRENfUkVHVUxBUl9DSEFOTkVMUworI2RlZmluZSBJTkpFQ1RFRF9DSEFOTkVMUyAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9DSEFOTkVMUworI2RlZmluZSBTWVNDRkdfRkxBR19TRU5TT1JfQURDICAgICAgICAgIEFEQ19GTEFHX1NFTlNPUgorI2RlZmluZSBTWVNDRkdfRkxBR19WUkVGX0FEQyAgICAgICAgICAgIEFEQ19GTEFHX1ZSRUZJTlQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMSAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjYKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWOCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjgKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzBfVDZfVFJHTyAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcxX1QyMV9DQzIgICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHMl9UMl9UUkdPICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzNfVDJfQ0M0ICAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzRfVDIyX1RSR08gICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMjJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHN19FWFRfSVQxMSAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQyAgICAgICAgICAgICAgICAgQURDX0NMT0NLX0FTWU5DX0RJVjEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX05PTkUgICAgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX0ZBTExJTkcgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HRkFMTElORyBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORworI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVfNSAgICAgICAgIEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNQorCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9SRUcgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWQorI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5KICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfUkVHICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfSU5KICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUiAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWSAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9BV0QxCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZCQVRfRElWNCAgICAgICAgICAgQURDX0NIQU5ORUxfVkJBVAorI2VuZGlmIC8qIFNUTTMySDcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NFQ19BbGlhc2VkX0RlZmluZXMgSEFMIENFQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfSVQgX19IQUxfQ0VDX0dFVF9GTEFHCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFRCAgICAgICBDT01QX1dJTkRPV01PREVfRElTQUJMRQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFRCAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRQorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMV9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDEKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDJfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAyCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAzX0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QMworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNF9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDQKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDVfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVA1CisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA2X0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QNgorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QN19FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDcKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAgICAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIGlucHV0IDEgZm9yIENPTVAxLCBMUFRJTSBpbnB1dCAyIGZvciBDT01QMiAqLworI2VuZGlmCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVA2VElNMk9DUkVGQ0xSICBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxICAgICAgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM09DUkVGQ0xSCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFICAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OCisKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICBDT01QX0lOUFVUX1BMVVNfSU8xCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPMgorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMyAgICAgIENPTVBfSU5QVVRfUExVU19JTzMKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzQgICAgICBDT01QX0lOUFVUX1BMVVNfSU80CisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU81ICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPNQorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPNiAgICAgIENPTVBfSU5QVVRfUExVU19JTzYKKworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQgICAgIENPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMiAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKy8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovCisvKiBJTzIgd2FzIHdyb25nbHkgYXNzaWduZWQgdG8gSU8gc2hhcmVkIHdpdGggREFDIGFuZCBJTzMgd2FzIGNvcnJlc3BvbmRpbmcgICAqLworLyogdG8gdGhlIHNlY29uZCBkZWRpY2F0ZWQgSU8gKG9ubHkgZm9yIENPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8zICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNlbHNlCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMworI2VuZGlmCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU80ICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzUgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPNQorCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XICAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfTE9XCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfSElHSCAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfSElHSAorCisvKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVG8gY2hlY2sgQ09NUCBsb2NrIHN0YXRlLCB1c2UgbWFjcm8gIl9fSEFMX0NPTVBfSVNfTE9DS0VEKCkiLiAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0xPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9MT0NLCisjZWxpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVAxTE9DSykKKyNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxTE9DSworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeExPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeExPQ0sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1X0NPTVAxCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzMgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDEKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMyAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19OT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQKKyNkZWZpbmUgQ09NUF9NT0RFX0xPV1NQRUVEICAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisjZGVmaW5lIENPTVBfTU9ERV9VTFRSQUxPV1BPV0VSICAgICAgICAgIENPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyNlbmRpZgorCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPUlRFWF9BbGlhc2VkX0RlZmluZXMgSEFMIENPUlRFWCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRUQgICAgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUKKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0VOQUJMRUQgICAgIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfRGVmaW5lcyBIQUwgREFDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgREFDMV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NIQU5ORUxfMQorI2RlZmluZSBEQUMxX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ0hBTk5FTF8yCisjZGVmaW5lIERBQzJfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DSEFOTkVMXzEKKyNkZWZpbmUgREFDX1dBVkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgREFDX1dBVkVfTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzAKKyNkZWZpbmUgREFDX1dBVkVfVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzEKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfTk9ORQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9OT0lTRQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9UUklBTkdMRQorCisjaWYgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJHMCkKKyNkZWZpbmUgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRCAgICAgICBIQUxfREFDX01TUElOSVRfQ0JfSUQKKyNkZWZpbmUgSEFMX0RBQ19NU1BfREVJTklUX0NCX0lEICAgICBIQUxfREFDX01TUERFSU5JVF9DQl9JRAorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RNQV9BbGlhc2VkX0RlZmluZXMgSEFMIERNQSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfQURDX0RNQV9DSDIgICAgICAgICAgICAgICAgRE1BX1JFTUFQX0FEQ19ETUFfQ0gyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfVFhfRE1BX0NINCAgICAgICAgICBETUFfUkVNQVBfVVNBUlQxX1RYX0RNQV9DSDQKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1VTQVJUMV9SWF9ETUFfQ0g1ICAgICAgICAgIERNQV9SRU1BUF9VU0FSVDFfUlhfRE1BX0NINQorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINCAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE2X0RNQV9DSDQKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDIgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xN19ETUFfQ0gyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDNfRE1BX0NIMzIgICAgICAgICAgICBETUFfUkVNQVBfVVNBUlQzX0RNQV9DSDMyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xNl9ETUFfQ0g2ICAgICAgICAgICAgICBETUFfUkVNQVBfVElNMTZfRE1BX0NINgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTdfRE1BX0NINyAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE3X0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1NQSTJfRE1BX0NINjcgICAgICAgICAgICAgIERNQV9SRU1BUF9TUEkyX0RNQV9DSDY3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDJfRE1BX0NINjcgICAgICAgICAgICBETUFfUkVNQVBfVVNBUlQyX0RNQV9DSDY3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX0RNQV9DSDc2ICAgICAgICAgICAgICBETUFfUkVNQVBfSTJDMV9ETUFfQ0g3NgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMV9ETUFfQ0g2ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTFfRE1BX0NINgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMl9ETUFfQ0g3ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTJfRE1BX0NINworI2RlZmluZSBIQUxfUkVNQVBETUFfVElNM19ETUFfQ0g2ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTNfRE1BX0NINgorCisjZGVmaW5lIElTX0hBTF9SRU1BUERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRE1BX1JFTUFQCisjZGVmaW5lIF9fSEFMX1JFTUFQRE1BX0NIQU5ORUxfRU5BQkxFICAgICAgICAgICAgX19IQUxfRE1BX1JFTUFQX0NIQU5ORUxfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JFTUFQRE1BX0NIQU5ORUxfRElTQUJMRSAgICAgICAgICAgX19IQUxfRE1BX1JFTUFQX0NIQU5ORUxfRElTQUJMRQorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMSAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTIgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkyCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkzICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNCAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTUgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk1CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk2ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNyAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTggICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk4CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk5ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEyICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTMgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEzCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxNCAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTE1ICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDBfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gxX0VWVCAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDJfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIM19FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMV9PVVQgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9URSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfVEUKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRFNJX0VPVCAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RTSV9FT1QKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BMkRfRU9UICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQTJEX0VPVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MVERDX0lUICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFREQ19JVAorCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fTk9fRVZFTlQgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HICAgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX0ZBTExJTkcgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HX0ZBTExJTkcgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HCisKKyNlbmRpZiAvKiBTVE0zMkw0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMSBETUFfUkVRVUVTVF9EQUMxX0NIMQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUMyIERNQV9SRVFVRVNUX0RBQzFfQ0gyCisKKyNkZWZpbmUgQkRNQV9SRVFVRVNUX0xQX1VBUlQxX1JYIEJETUFfUkVRVUVTVF9MUFVBUlQxX1JYCisjZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9UWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9UWAorCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gwX0VWVCAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMV9FVlQgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDJfRVZUICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDJfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMV9PVVQgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTNfT1VUICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTNfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX1RJTTEyX1RSR08gICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX1RJTTEyX1RSR08KKworI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIMF9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDFfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0gyX0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIM19FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIM19FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDRfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDRfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0g1X0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0g1X0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NINl9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9XS1VQICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9SWF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfVFhfV0tVUCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfVFhfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTJfV0tVUCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNM19XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19PVVQgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNM19PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU00X1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU00X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU01X1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU01X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fSTJDNF9XS1VQICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fSTJDNF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfV0tVUCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1NQSTZfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9DT01QMV9PVVQgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9DT01QMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQ09NUDJfT1VUICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQ09NUDJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1JUQ19XS1VQICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1JUQ19XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkyICAgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0VYVEkyCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0kyQzRfSVRfRVZUICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0kyQzRfSVRfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfSVQgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1NQSTZfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9UWF9JVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9UWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1JYX0lUICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1JYX0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0FEQzNfSVQgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0FEQzNfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQURDM19BV0QxX09VVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQURDM19BV0QxX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9CRE1BX0NIMF9JVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9CRE1BX0NIMV9JVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMV9JVAorCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fTk9fRVZFTlQgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9SSVNJTkcgICAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9GQUxMSU5HICAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HX0ZBTExJTkcgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcKKworI2RlZmluZSBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0xICAgICAgICAgICAgICAgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMV9PVVQKKyNkZWZpbmUgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMiAgICAgICAgICAgICAgIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTJfT1VUCisjZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTMgICAgICAgICAgICAgICBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0zX09VVAorCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9GTEFTSF9BbGlhc2VkX0RlZmluZXMgSEFMIEZMQVNIIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgVFlQRVBST0dSQU1fQllURSAgICAgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fQllURQorI2RlZmluZSBUWVBFUFJPR1JBTV9IQUxGV09SRCAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTV9XT1JEICAgICAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNX0RPVUJMRVdPUkQgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQKKyNkZWZpbmUgVFlQRUVSQVNFX1NFQ1RPUlMgICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX1NFQ1RPUlMKKyNkZWZpbmUgVFlQRUVSQVNFX1BBR0VTICAgICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX1BBR0VTCisjZGVmaW5lIFRZUEVFUkFTRV9QQUdFRVJBU0UgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRV9QQUdFUworI2RlZmluZSBUWVBFRVJBU0VfTUFTU0VSQVNFICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFCisjZGVmaW5lIFdSUFNUQVRFX0RJU0FCTEUgICAgICAgICAgICAgIE9CX1dSUFNUQVRFX0RJU0FCTEUKKyNkZWZpbmUgV1JQU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgT0JfV1JQU1RBVEVfRU5BQkxFCisjZGVmaW5lIEhBTF9GTEFTSF9USU1FT1VUX1ZBTFVFICAgICAgIEZMQVNIX1RJTUVPVVRfVkFMVUUKKyNkZWZpbmUgT0JFWF9QQ1JPUCAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9QQ1JPUAorI2RlZmluZSBPQkVYX0JPT1RDT05GSUcgICAgICAgICAgICAgICBPUFRJT05CWVRFX0JPT1RDT05GSUcKKyNkZWZpbmUgUENST1BTVEFURV9ESVNBQkxFICAgICAgICAgICAgT0JfUENST1BfU1RBVEVfRElTQUJMRQorI2RlZmluZSBQQ1JPUFNUQVRFX0VOQUJMRSAgICAgICAgICAgICBPQl9QQ1JPUF9TVEFURV9FTkFCTEUKKyNkZWZpbmUgVFlQRUVSQVNFREFUQV9CWVRFICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFREFUQV9CWVRFCisjZGVmaW5lIFRZUEVFUkFTRURBVEFfSEFMRldPUkQgICAgICAgIEZMQVNIX1RZUEVFUkFTRURBVEFfSEFMRldPUkQKKyNkZWZpbmUgVFlQRUVSQVNFREFUQV9XT1JEICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFREFUQV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9CWVRFICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9IQUxGV09SRCAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfV09SRCAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVEJZVEUgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVEJZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RIQUxGV09SRCAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0ZBU1RIQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVFdPUkQgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVFdPUkQKKyNkZWZpbmUgUEFHRVNJWkUgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfUEFHRV9TSVpFCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RCWVRFICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0JZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVEhBTEZXT1JEICAgICAgRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVFdPUkQgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fV09SRAorI2RlZmluZSBWT0xUQUdFX1JBTkdFXzEgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzEKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV8yICAgICAgICAgICAgICAgRkxBU0hfVk9MVEFHRV9SQU5HRV8yCisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfMyAgICAgICAgICAgICAgIEZMQVNIX1ZPTFRBR0VfUkFOR0VfMworI2RlZmluZSBWT0xUQUdFX1JBTkdFXzQgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVCAgICAgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fRkFTVAorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUICAgICBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUCisjZGVmaW5lIFdSUEFSRUFfQkFOSzFfQVJFQUEgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMV9BUkVBQiAgICAgICAgICAgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQgorI2RlZmluZSBXUlBBUkVBX0JBTksyX0FSRUFBICAgICAgICAgICBPQl9XUlBBUkVBX0JBTksyX0FSRUFBCisjZGVmaW5lIFdSUEFSRUFfQkFOSzJfQVJFQUIgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIKKyNkZWZpbmUgSVdER19TVERCWV9GUkVFWkUgICAgICAgICAgICAgT0JfSVdER19TVERCWV9GUkVFWkUKKyNkZWZpbmUgSVdER19TVERCWV9BQ1RJVkUgICAgICAgICAgICAgT0JfSVdER19TVERCWV9SVU4KKyNkZWZpbmUgSVdER19TVE9QX0ZSRUVaRSAgICAgICAgICAgICAgT0JfSVdER19TVE9QX0ZSRUVaRQorI2RlZmluZSBJV0RHX1NUT1BfQUNUSVZFICAgICAgICAgICAgICBPQl9JV0RHX1NUT1BfUlVOCisjZGVmaW5lIEZMQVNIX0VSUk9SX05PTkUgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9OT05FCisjZGVmaW5lIEZMQVNIX0VSUk9SX1JEICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9SRAorI2RlZmluZSBGTEFTSF9FUlJPUl9QRyAgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUFJPRworI2RlZmluZSBGTEFTSF9FUlJPUl9QR1AgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUEdTCisjZGVmaW5lIEZMQVNIX0VSUk9SX1dSUCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9XUlAKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1BUViAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QVFYKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1BUVlVTUiAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QVFZVU1IKKyNkZWZpbmUgRkxBU0hfRVJST1JfUFJPRyAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BST0cKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1AgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QRVJBVElPTgorI2RlZmluZSBGTEFTSF9FUlJPUl9QR0EgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUEdBCisjZGVmaW5lIEZMQVNIX0VSUk9SX1NJWkUgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9TSVpFCisjZGVmaW5lIEZMQVNIX0VSUk9SX1NJWiAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9TSVpFCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHUyAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QR1MKKyNkZWZpbmUgRkxBU0hfRVJST1JfTUlTICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX01JUworI2RlZmluZSBGTEFTSF9FUlJPUl9GQVNUICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfRkFTVAorI2RlZmluZSBGTEFTSF9FUlJPUl9GV1dFUlIgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfRldXRVJSCisjZGVmaW5lIEZMQVNIX0VSUk9SX05PVFpFUk8gICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9OT1RaRVJPCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QRVJBVElPTiAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT04KKyNkZWZpbmUgRkxBU0hfRVJST1JfRVJTICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX0VSUworI2RlZmluZSBPQl9XREdfU1cgICAgICAgICAgICAgICAgICAgICBPQl9JV0RHX1NXCisjZGVmaW5lIE9CX1dER19IVyAgICAgICAgICAgICAgICAgICAgIE9CX0lXREdfSFcKKyNkZWZpbmUgT0JfU0RBREMxMl9WRERfTU9OSVRPUl9TRVQgICAgT0JfU0RBQ0RfVkREX01PTklUT1JfU0VUCisjZGVmaW5lIE9CX1NEQURDMTJfVkREX01PTklUT1JfUkVTRVQgIE9CX1NEQUNEX1ZERF9NT05JVE9SX1JFU0VUCisjZGVmaW5lIE9CX1JBTV9QQVJJVFlfQ0hFQ0tfU0VUICAgICAgIE9CX1NSQU1fUEFSSVRZX1NFVAorI2RlZmluZSBPQl9SQU1fUEFSSVRZX0NIRUNLX1JFU0VUICAgICBPQl9TUkFNX1BBUklUWV9SRVNFVAorI2RlZmluZSBJU19PQl9TREFEQzEyX1ZERF9NT05JVE9SICAgICBJU19PQl9TREFDRF9WRERfTU9OSVRPUgorI2RlZmluZSBPQl9SRFBfTEVWRUwwICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMAorI2RlZmluZSBPQl9SRFBfTEVWRUwxICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMQorI2RlZmluZSBPQl9SRFBfTEVWRUwyICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMgorI2lmIGRlZmluZWQoU1RNMzJHMCkKKyNkZWZpbmUgT0JfQk9PVF9MT0NLX0RJU0FCTEUgICAgICAgICAgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORQorI2RlZmluZSBPQl9CT09UX0xPQ0tfRU5BQkxFICAgICAgICAgICBPQl9CT09UX0VOVFJZX0ZPUkNFRF9GTEFTSAorI2Vsc2UKKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORSAgICAgT0JfQk9PVF9MT0NLX0RJU0FCTEUKKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0ggICAgT0JfQk9PVF9MT0NLX0VOQUJMRQorI2VuZGlmCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBGTEFTSF9GTEFHX1NORUNDRV9CQU5LMVJSIEZMQVNIX0ZMQUdfU05FQ0NFUlJfQkFOSzEKKyNkZWZpbmUgRkxBU0hfRkxBR19EQkVDQ0VfQkFOSzFSUiBGTEFTSF9GTEFHX0RCRUNDRVJSX0JBTksxCisjZGVmaW5lIEZMQVNIX0ZMQUdfU1RSQkVSX0JBTksxUiAgRkxBU0hfRkxBR19TVFJCRVJSX0JBTksxCisjZGVmaW5lIEZMQVNIX0ZMQUdfU05FQ0NFX0JBTksyUlIgRkxBU0hfRkxBR19TTkVDQ0VSUl9CQU5LMgorI2RlZmluZSBGTEFTSF9GTEFHX0RCRUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfREJFQ0NFUlJfQkFOSzIKKyNkZWZpbmUgRkxBU0hfRkxBR19TVFJCRVJfQkFOSzJSICBGTEFTSF9GTEFHX1NUUkJFUlJfQkFOSzIKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9KUEVHX0FsaWFzZWRfTWFjcm9zIEhBTCBKUEVHIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX0VOQUJMRSAgICAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNFTl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19ESVNBQkxFICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfRk9SQ0VfUkVTRVQgICAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNSU1RfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfUkVMRUFTRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNSU1RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX0pQR0RFQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19TTEVFUF9ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfSlBHREVDX0NMS19TTEVFUF9ESVNBQkxFCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TWVNDRkdfQWxpYXNlZF9EZWZpbmVzIEhBTCBTWVNDRkcgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEE5ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEE5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQTEwICAgSTJDX0ZBU1RNT0RFUExVU19QQTEwCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjYgICAgSTJDX0ZBU1RNT0RFUExVU19QQjYKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BCNyAgICBJMkNfRkFTVE1PREVQTFVTX1BCNworI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI4ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI4CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjkgICAgSTJDX0ZBU1RNT0RFUExVU19QQjkKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMSAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzEKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMiAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzIKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMyAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzMKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIExMX0ZNQ19BbGlhc2VkX0RlZmluZXMgTEwgRk1DIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRElTQUJMRSAgICAgICBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRElTQUJMRQorI2RlZmluZSBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0VOQUJMRSAgICAgICAgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0VOQUJMRQorI2RlZmluZSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgRk1DX05BTkRfTUVNX0JVU19XSURUSF84CisjZGVmaW5lIEZNQ19OQU5EX1BDQ19NRU1fQlVTX1dJRFRIXzE2ICAgICAgICAgICBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzE2CisjZWxpZiBkZWZpbmVkKFNUTTMyRjEpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkYzKSB8fCBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9ESVNBQkxFICAgICAgICAgICBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0RJU0FCTEUKKyNkZWZpbmUgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0VOQUJMRSAgICAgICAgICAgIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRU5BQkxFCisjZGVmaW5lIEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfOCAgICAgICAgICAgICAgICBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84CisjZGVmaW5lIEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfMTYgICAgICAgICAgICAgICBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF8xNgorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExMX0ZTTUNfQWxpYXNlZF9EZWZpbmVzIExMIEZTTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGU01DX05PUlNSQU1fVFlQRURFRiAgICAgICAgICAgICAgICAgICAgICBGU01DX05PUlNSQU1fVHlwZURlZgorI2RlZmluZSBGU01DX05PUlNSQU1fRVhURU5ERURfVFlQRURFRiAgICAgICAgICAgICBGU01DX05PUlNSQU1fRVhURU5ERURfVHlwZURlZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfR1BJT19BbGlhc2VkX01hY3JvcyBIQUwgR1BJTyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEdFVF9HUElPX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fR0VUX0lOREVYCisjZGVmaW5lIEdFVF9HUElPX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fR0VUX0lOREVYCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRElPCisjZGVmaW5lIEdQSU9fQUYxMl9TRE1NQzEgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRElPCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykKKyNkZWZpbmUgR1BJT19BRjEyX1NESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NETU1DMQorI2RlZmluZSBHUElPX0FGMTJfU0RNTUMgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgR1BJT19BRjEyX1NESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NETU1DMQorI2RlZmluZSBHUElPX0FGMTJfU0RNTUMgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgR1BJT19BRjdfU0RJTzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjdfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUY4X1NESU8xICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUY4X1NETU1DMQorI2RlZmluZSBHUElPX0FGMTJfU0RJTzEgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RNTUMxCisjZGVmaW5lIEdQSU9fQUY5X1NESU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUY5X1NETU1DMgorI2RlZmluZSBHUElPX0FGMTBfU0RJTzIgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTBfU0RNTUMyCisjZGVmaW5lIEdQSU9fQUYxMV9TRElPMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMV9TRE1NQzIKKyNlbmRpZgorCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYwX0xQVElNMQorI2RlZmluZSBHUElPX0FGMV9MUFRJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMV9MUFRJTTEKKyNkZWZpbmUgR1BJT19BRjJfTFBUSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjJfTFBUSU0xCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSAgR1BJT19TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfTE9XCisjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9NRURJVU0KKyNkZWZpbmUgIEdQSU9fU1BFRURfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNkZWZpbmUgIEdQSU9fU1BFRURfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSAorI2VuZGlmIC8qIFNUTTMyTDAgfHwgU1RNMzJMNCB8fCBTVE0zMkY0IHx8IFNUTTMyRjIgfHwgU1RNMzJGNyB8fCBTVE0zMkg3Ki8KKworI2lmIGRlZmluZWQoU1RNMzJMMSkKKyAjZGVmaW5lICBHUElPX1NQRUVEX1ZFUllfTE9XICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyAjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSAgICAgIEdQSU9fU1BFRURfRlJFUV9ISUdICisgI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgICAgICBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisjZW5kaWYgLyogU1RNMzJMMSAqLworCisjaWYgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGMSkKKyAjZGVmaW5lICBHUElPX1NQRUVEX0xPVyAgICBHUElPX1NQRUVEX0ZSRVFfTE9XCisgI2RlZmluZSAgR1BJT19TUEVFRF9NRURJVU0gR1BJT19TUEVFRF9GUkVRX01FRElVTQorICNkZWZpbmUgIEdQSU9fU1BFRURfSElHSCAgIEdQSU9fU1BFRURfRlJFUV9ISUdICisjZW5kaWYgLyogU1RNMzJGMCB8fCBTVE0zMkYzIHx8IFNUTTMyRjEgKi8KKworI2RlZmluZSBHUElPX0FGNl9ERlNETSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGNl9ERlNETTEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hSVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBIUlRJTSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVEICAgICAgICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ESVNBQkxFRAorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY2OCAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY2OCAgICAgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNgorI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9ERUVWNzkgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDFfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjc5IEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQyX0RFRVY3CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjc5ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY3CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjc5ICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY3CisKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q291bnRlciAgICAgICAgX19IQUxfSFJUSU1fU0VUQ09VTlRFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb3VudGVyICAgICAgICBfX0hBTF9IUlRJTV9HRVRDT1VOVEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX1NldFBlcmlvZCAgICAgICAgIF9fSEFMX0hSVElNX1NFVFBFUklPRAorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRQZXJpb2QgICAgICAgICBfX0hBTF9IUlRJTV9HRVRQRVJJT0QKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q2xvY2tQcmVzY2FsZXIgX19IQUxfSFJUSU1fU0VUQ0xPQ0tQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fR2V0Q2xvY2tQcmVzY2FsZXIgX19IQUxfSFJUSU1fR0VUQ0xPQ0tQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0Q29tcGFyZSAgICAgICAgX19IQUxfSFJUSU1fU0VUQ09NUEFSRQorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDb21wYXJlICAgICAgICBfX0hBTF9IUlRJTV9HRVRDT01QQVJFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX0RlZmluZXMgSEFMIEkyQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRUQgICAgICAgICAgICAgICAgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEUKKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0VOQUJMRUQgICAgICAgICAgICAgICAgIEkyQ19EVUFMQUREUkVTU19FTkFCTEUKKyNkZWZpbmUgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEVEICAgICAgICAgICAgICAgIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEVEICAgICAgICAgICAgICAgICBJMkNfR0VORVJBTENBTExfRU5BQkxFCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRElTQUJMRUQgICAgICAgICAgICAgICAgICBJMkNfTk9TVFJFVENIX0RJU0FCTEUKKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9FTkFCTEVEICAgICAgICAgICAgICAgICAgIEkyQ19OT1NUUkVUQ0hfRU5BQkxFCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFRCAgICAgICAgICAgICAgICBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEVEICAgICAgICAgICAgICAgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisjaWYgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjEpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1RYICAgICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1RYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUVNX0JVU1lfUlggICAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfUlgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NQVNURVJfQlVTWV9UWCAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1JYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfVFgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1JYICAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JUkRBX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVJEQSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEVEICAgICAgICAgICAgSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFRCAgICAgICAgICAgICBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgSVdERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBLUl9LRVlfUkVMT0FEICAgICAgICAgICAgICAgICAgIElXREdfS0VZX1JFTE9BRAorI2RlZmluZSBLUl9LRVlfRU5BQkxFICAgICAgICAgICAgICAgICAgIElXREdfS0VZX0VOQUJMRQorI2RlZmluZSBLUl9LRVlfRVdBICAgICAgICAgICAgICAgICAgICAgIElXREdfS0VZX1dSSVRFX0FDQ0VTU19FTkFCTEUKKyNkZWZpbmUgS1JfS0VZX0RXQSAgICAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTFBUSU1fQWxpYXNlZF9EZWZpbmVzIEhBTCBMUFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lTVElPTiBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTgorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfOFRSQU5TSVNUSU9OUyAgICAgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisjZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HRURHRSAgICAgICAgICBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkdFREdFICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HCisjZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfQk9USEVER0VTICAgICAgICAgICBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJU1RJT04gIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04KKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVNUSU9OUyAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJU1RJT05TICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lTVElPTlMgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworLyogVGhlIGZvbGxvd2luZyAzIGRlZmluaXRpb24gaGF2ZSBhbHNvIGJlZW4gcHJlc2VudCBpbiBhIHRlbXBvcmFyeSB2ZXJzaW9uIG9mIGxwdGltLmggKi8KKy8qIFRoZXkgbmVlZCB0byBiZSByZW5hbWVkIGFsc28gdG8gdGhlIHJpZ2h0IG5hbWUsIGp1c3QgaW4gY2FzZSAqLworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTiAgICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OICAgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT04gICAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9OQU5EX0FsaWFzZWRfRGVmaW5lcyBIQUwgTkFORCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfTkFORF9SZWFkX1BhZ2UgICAgICAgICAgICAgIEhBTF9OQU5EX1JlYWRfUGFnZV84YgorI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9QYWdlICAgICAgICAgICAgIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGIKKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWEgICAgICAgICBIQUxfTkFORF9SZWFkX1NwYXJlQXJlYV84YgorI2RlZmluZSBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWEgICAgICAgIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV84YgorCisjZGVmaW5lIE5BTkRfQWRkcmVzc1R5cGVkZWYgICAgICAgICAgICAgTkFORF9BZGRyZXNzVHlwZURlZgorCisjZGVmaW5lIF9fQVJSQVlfQUREUkVTUyAgICAgICAgICAgICAgICAgQVJSQVlfQUREUkVTUworI2RlZmluZSBfX0FERFJfMXN0X0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfMVNUX0NZQ0xFCisjZGVmaW5lIF9fQUREUl8ybmRfQ1lDTEUgICAgICAgICAgICAgICAgQUREUl8yTkRfQ1lDTEUKKyNkZWZpbmUgX19BRERSXzNyZF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzNSRF9DWUNMRQorI2RlZmluZSBfX0FERFJfNHRoX0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfNFRIX0NZQ0xFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9OT1JfQWxpYXNlZF9EZWZpbmVzIEhBTCBOT1IgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTk9SX1N0YXR1c1R5cGVkZWYgICAgICAgICAgICAgIEhBTF9OT1JfU3RhdHVzVHlwZURlZgorI2RlZmluZSBOT1JfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBOT1JfT05HT0lORyAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfT05HT0lORworI2RlZmluZSBOT1JfRVJST1IgICAgICAgICAgICAgICAgICAgICAgSEFMX05PUl9TVEFUVVNfRVJST1IKKyNkZWZpbmUgTk9SX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX1RJTUVPVVQKKworI2RlZmluZSBfX05PUl9XUklURSAgICAgICAgICAgICAgICAgICAgTk9SX1dSSVRFCisjZGVmaW5lIF9fTk9SX0FERFJfU0hJRlQgICAgICAgICAgICAgICBOT1JfQUREUl9TSElGVAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfT1BBTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBPUEFNUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMCAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMSAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8xCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMiAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yCisjZGVmaW5lIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX1ZQMyAgICAgICAgICAgT1BBTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMCAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDEgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMQorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAyICAgICAgIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzIKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMyAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8zCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBJT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgICAgIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBJT1BBTVBfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgICAgIE9QQU1QX0lOVkVSVElOR0lOUFVUX0lPMQorCisjZGVmaW5lIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9WTTAgICAgICAgICAgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0xICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9JTlZFUlRJTkdJTlBVVF9WSU5NICAgICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX05PICAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX05PCisjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0wICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0xICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNpZiBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgSEFMX09QQU1QX01TUF9JTklUX0NCX0lEICAgICAgIEhBTF9PUEFNUF9NU1BJTklUX0NCX0lECisjZGVmaW5lIEhBTF9PUEFNUF9NU1BfREVJTklUX0NCX0lEICAgICBIQUxfT1BBTVBfTVNQREVJTklUX0NCX0lECisjZW5kaWYKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMlNfQWxpYXNlZF9EZWZpbmVzIEhBTCBJMlMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BISUxMSVBTICAgICAgSTJTX1NUQU5EQVJEX1BISUxJUFMKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyAgI2RlZmluZSBJMlNfSVRfVFhFICAgICAgICAgICAgICAgSTJTX0lUX1RYUAorICAjZGVmaW5lIEkyU19JVF9SWE5FICAgICAgICAgICAgICBJMlNfSVRfUlhQCisKKyAgI2RlZmluZSBJMlNfRkxBR19UWEUgICAgICAgICAgICAgSTJTX0ZMQUdfVFhQCisgICNkZWZpbmUgSTJTX0ZMQUdfUlhORSAgICAgICAgICAgIEkyU19GTEFHX1JYUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisgICNkZWZpbmUgSTJTX0NMT0NLX1NZU0NMSyAgICAgICAgICAgSTJTX0NMT0NLX1BMTAorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QQ0NBUkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBQQ0NBUkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworLyogQ29tcGFjdCBGbGFzaC1BVEEgcmVnaXN0ZXJzIGRlc2NyaXB0aW9uICovCisjZGVmaW5lIENGX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIEFUQV9EQVRBCisjZGVmaW5lIENGX1NFQ1RPUl9DT1VOVCAgICAgICAgICAgICAgIEFUQV9TRUNUT1JfQ09VTlQKKyNkZWZpbmUgQ0ZfU0VDVE9SX05VTUJFUiAgICAgICAgICAgICAgQVRBX1NFQ1RPUl9OVU1CRVIKKyNkZWZpbmUgQ0ZfQ1lMSU5ERVJfTE9XICAgICAgICAgICAgICAgQVRBX0NZTElOREVSX0xPVworI2RlZmluZSBDRl9DWUxJTkRFUl9ISUdIICAgICAgICAgICAgICBBVEFfQ1lMSU5ERVJfSElHSAorI2RlZmluZSBDRl9DQVJEX0hFQUQgICAgICAgICAgICAgICAgICBBVEFfQ0FSRF9IRUFECisjZGVmaW5lIENGX1NUQVRVU19DTUQgICAgICAgICAgICAgICAgIEFUQV9TVEFUVVNfQ01ECisjZGVmaW5lIENGX1NUQVRVU19DTURfQUxURVJOQVRFICAgICAgIEFUQV9TVEFUVVNfQ01EX0FMVEVSTkFURQorI2RlZmluZSBDRl9DT01NT05fREFUQV9BUkVBICAgICAgICAgICBBVEFfQ09NTU9OX0RBVEFfQVJFQQorCisvKiBDb21wYWN0IEZsYXNoLUFUQSBjb21tYW5kcyAqLworI2RlZmluZSBDRl9SRUFEX1NFQ1RPUl9DTUQgICAgICAgICAgICBBVEFfUkVBRF9TRUNUT1JfQ01ECisjZGVmaW5lIENGX1dSSVRFX1NFQ1RPUl9DTUQgICAgICAgICAgIEFUQV9XUklURV9TRUNUT1JfQ01ECisjZGVmaW5lIENGX0VSQVNFX1NFQ1RPUl9DTUQgICAgICAgICAgIEFUQV9FUkFTRV9TRUNUT1JfQ01ECisjZGVmaW5lIENGX0lERU5USUZZX0NNRCAgICAgICAgICAgICAgIEFUQV9JREVOVElGWV9DTUQKKworI2RlZmluZSBQQ0NBUkRfU3RhdHVzVHlwZWRlZiAgICAgICAgICBIQUxfUENDQVJEX1N0YXR1c1R5cGVEZWYKKyNkZWZpbmUgUENDQVJEX1NVQ0NFU1MgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfU1VDQ0VTUworI2RlZmluZSBQQ0NBUkRfT05HT0lORyAgICAgICAgICAgICAgICBIQUxfUENDQVJEX1NUQVRVU19PTkdPSU5HCisjZGVmaW5lIFBDQ0FSRF9FUlJPUiAgICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX0VSUk9SCisjZGVmaW5lIFBDQ0FSRF9USU1FT1VUICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX1RJTUVPVVQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JUQ19BbGlhc2VkX0RlZmluZXMgSEFMIFJUQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZPUk1BVF9CSU4gICAgICAgICAgICAgICAgICBSVENfRk9STUFUX0JJTgorI2RlZmluZSBGT1JNQVRfQkNEICAgICAgICAgICAgICAgICAgUlRDX0ZPUk1BVF9CQ0QKKworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05vbmUgICAgIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTk9ORQorI2RlZmluZSBSVENfVEFNUEVSRVJBU0VCQUNLVVBfRElTQUJMRUQgIFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFRCAgICBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEVEICAgICBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRQorCisjZGVmaW5lIFJUQ19NQVNLVEFNUEVSRkxBR19ESVNBQkxFRCAgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFCisjZGVmaW5lIFJUQ19NQVNLVEFNUEVSRkxBR19FTkFCTEVEICAgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUkVSQVNFQkFDS1VQX0VOQUJMRUQgICBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUKKyNkZWZpbmUgUlRDX1RBTVBFUjFfMl9JTlRFUlJVUFQgICAgICAgICBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgUlRDX1RBTVBFUjFfMl8zX0lOVEVSUlVQVCAgICAgICBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQKKworI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BDMTMgIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVAorI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BBMCBSVENfVElNRVNUQU1QUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QSTggUlRDX1RJTUVTVEFNUFBJTl9QT1MxCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEMxICAgUlRDX1RJTUVTVEFNUFBJTl9QT1MyCisKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQzEzICBSVENfT1VUUFVUX1JFTUFQX05PTkUKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQjE0ICBSVENfT1VUUFVUX1JFTUFQX1BPUzEKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QQjIgICBSVENfT1VUUFVUX1JFTUFQX1BPUzEKKworI2RlZmluZSBSVENfVEFNUEVSUElOX1BDMTMgUlRDX1RBTVBFUlBJTl9ERUZBVUxUCisjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEEwICBSVENfVEFNUEVSUElOX1BPUzEKKyNkZWZpbmUgUlRDX1RBTVBFUlBJTl9QSTggIFJUQ19UQU1QRVJQSU5fUE9TMQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX0RlZmluZXMgSEFMIFNNQVJUQ0FSRCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTkFDS19FTkFCTEVEICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX05BQ0tfRU5BQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEVEICAgICAgICAgICAgICAgICBTTUFSVENBUkRfTkFDS19ESVNBQkxFCisKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19ESVNBQkxFRCAgICAgIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCAgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRSAgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0VOQUJMRSAgICAgICAgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEVEICAgICAgICAgICAgICBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRUQgICAgICAgICAgICAgICBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUKKworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFRCAgICAgICAgICAgICAgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEVEICAgICAgICAgICAgICAgU01BUlRDQVJEX0xBU1RCSVRfRU5BQkxFCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRGVmaW5lcyBIQUwgU01CVVMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRUQgICAgICBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRUQgICAgICAgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEVEICAgICAgU01CVVNfR0VORVJBTENBTExfRElTQUJMRQorI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEVEICAgICAgIFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRQorI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRUQgICAgICAgIFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFCisjZGVmaW5lIFNNQlVTX05PU1RSRVRDSF9FTkFCTEVEICAgICAgICAgU01CVVNfTk9TVFJFVENIX0VOQUJMRQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFRCAgICAgIFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEVEICAgICBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRQorI2RlZmluZSBTTUJVU19QRUNfRElTQUJMRUQgICAgICAgICAgICAgIFNNQlVTX1BFQ19ESVNBQkxFCisjZGVmaW5lIFNNQlVTX1BFQ19FTkFCTEVEICAgICAgICAgICAgICAgU01CVVNfUEVDX0VOQUJMRQorI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfTElTVEVOICAgIEhBTF9TTUJVU19TVEFURV9MSVNURU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NQSV9BbGlhc2VkX0RlZmluZXMgSEFMIFNQSSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfVElNT0RFX0RJU0FCTEVEICAgICAgICAgICAgIFNQSV9USU1PREVfRElTQUJMRQorI2RlZmluZSBTUElfVElNT0RFX0VOQUJMRUQgICAgICAgICAgICAgIFNQSV9USU1PREVfRU5BQkxFCisKKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEVEICAgICBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRQorI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFRCAgICAgIFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUKKworI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEVEICAgICAgICAgIFNQSV9OU1NfUFVMU0VfRElTQUJMRQorI2RlZmluZSBTUElfTlNTX1BVTFNFX0VOQUJMRUQgICAgICAgICAgIFNQSV9OU1NfUFVMU0VfRU5BQkxFCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisKKyAjZGVmaW5lIFNQSV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgU1BJX0ZMQUdfVFhQCisgI2RlZmluZSBTUElfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgIFNQSV9GTEFHX1JYUAorCisgI2RlZmluZSBTUElfSVRfVFhFICAgICAgICAgICAgICAgICAgICAgIFNQSV9JVF9UWFAKKyAjZGVmaW5lIFNQSV9JVF9SWE5FICAgICAgICAgICAgICAgICAgICAgU1BJX0lUX1JYUAorCisgI2RlZmluZSBTUElfRlJMVkxfRU1QVFkgICAgICAgICAgICAgICAgIFNQSV9SWF9GSUZPXzBQQUNLRVQKKyAjZGVmaW5lIFNQSV9GUkxWTF9RVUFSVEVSX0ZVTEwgICAgICAgICAgU1BJX1JYX0ZJRk9fMVBBQ0tFVAorICNkZWZpbmUgU1BJX0ZSTFZMX0hBTEZfRlVMTCAgICAgICAgICAgICBTUElfUlhfRklGT18yUEFDS0VUCisgI2RlZmluZSBTUElfRlJMVkxfRlVMTCAgICAgICAgICAgICAgICAgIFNQSV9SWF9GSUZPXzNQQUNLRVQKKworI2VuZGlmIC8qIFNUTTMySDcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfRGVmaW5lcyBIQUwgVElNIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENDRVJfQ0N4RV9NQVNLICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDeEVfTUFTSworI2RlZmluZSBDQ0VSX0NDeE5FX01BU0sgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQ3hORV9NQVNLCisKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ1IxICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NSMiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NSMgorI2RlZmluZSBUSU1fRE1BQmFzZV9TTUNSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9TTUNSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0RJRVIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0RJRVIKKyNkZWZpbmUgVElNX0RNQUJhc2VfU1IgICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfU1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfRUdSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfRUdSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIxICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDTVIxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIyICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDTVIyCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDRVIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDRVIKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ05UICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ05UCisjZGVmaW5lIFRJTV9ETUFCYXNlX1BTQyAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1BTQworI2RlZmluZSBUSU1fRE1BQmFzZV9BUlIgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9BUlIKKyNkZWZpbmUgVElNX0RNQUJhc2VfUkNSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfUkNSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjEgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSMgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IzICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1IzCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjQgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjQKKyNkZWZpbmUgVElNX0RNQUJhc2VfQkRUUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQkRUUgorI2RlZmluZSBUSU1fRE1BQmFzZV9EQ1IgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9EQ1IKKyNkZWZpbmUgVElNX0RNQUJhc2VfRE1BUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfRE1BUgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjEgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9PUjEKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NNUjMgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NNUjMKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNSAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSNQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I2ICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1I2CisjZGVmaW5lIFRJTV9ETUFCYXNlX09SMiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX09SMgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjMgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9PUjMKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IgICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IKKworI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfVXBkYXRlICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfVVBEQVRFCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzEgICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DQzEKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMiAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NDMgorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MzICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0MzCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzQgICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DQzQKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NPTSAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NPTQorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfVHJpZ2dlciAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUgorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQnJlYWsgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0JyZWFrMiAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0JSRUFLMgorCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xVHJhbnNmZXIgICAgIFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzJUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzNUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzNUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzRUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzVUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzZUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzZUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzdUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzhUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzlUcmFuc2ZlcnMgICAgVElNX0RNQUJVUlNUTEVOR1RIXzlUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEwVHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMVRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTJUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTJUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEzVHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNFRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTVUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTVUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE2VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xN1RyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMThUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgVElNMjJfVEkxX0dQSU8xICAgVElNMjJfVEkxX0dQSU8KKyNkZWZpbmUgVElNMjJfVEkxX0dQSU8yICAgVElNMjJfVEkxX0dQSU8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkYzKQorI2RlZmluZSBJU19USU1fSEFMTF9JTlRFUkZBQ0VfSU5TVEFOQ0UgICBJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxX09VVCAgICAgICAgVElNX1RJTTFfRVRSX0NPTVAxCisjZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QMl9PVVQgICAgICAgIFRJTV9USU0xX0VUUl9DT01QMgorI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDFfT1VUICAgICAgICBUSU1fVElNOF9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAyX09VVCAgICAgICAgVElNX1RJTThfRVRSX0NPTVAyCisjZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QMV9PVVQgICAgICAgIFRJTV9USU0yX0VUUl9DT01QMQorI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDJfT1VUICAgICAgICBUSU1fVElNMl9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTNfRVRSX0NPTVAxX09VVCAgICAgICAgVElNX1RJTTNfRVRSX0NPTVAxCisjZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMV9PVVQgICAgICAgIFRJTV9USU0xX1RJMV9DT01QMQorI2RlZmluZSBUSU1fVElNOF9USTFfQ09NUDJfT1VUICAgICAgICBUSU1fVElNOF9USTFfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxX09VVCAgICAgICAgVElNX1RJTTJfVEk0X0NPTVAxCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMl9PVVQgICAgICAgIFRJTV9USU0yX1RJNF9DT01QMgorI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDFDT01QMl9PVVQgICBUSU1fVElNMl9USTRfQ09NUDFfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVAxX09VVCAgICAgICAgVElNX1RJTTNfVEkxX0NPTVAxCisjZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QMl9PVVQgICAgICAgIFRJTV9USU0zX1RJMV9DT01QMgorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDFDT01QMl9PVVQgICBUSU1fVElNM19USTFfQ09NUDFfQ09NUDIKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9UU0NfQWxpYXNlZF9EZWZpbmVzIEhBTCBUU0MgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX1NZTkNfUE9MX0ZBTEwgICAgICAgIFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcKKyNkZWZpbmUgVFNDX1NZTkNfUE9MX1JJU0VfSElHSCAgIFRTQ19TWU5DX1BPTEFSSVRZX1JJU0lORworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVUFSVF9BbGlhc2VkX0RlZmluZXMgSEFMIFVBUlQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgICBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgVUFSVF9PTkVCSVRfU0FNUExJTkdfRU5BQkxFRCAgICBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEVEICAgIFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRUQgICAgIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFCisKKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRU5BQkxFICAgICAgICBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorI2RlZmluZSBfX0hBTF9VQVJUX09ORUJJVF9ESVNBQkxFICAgICAgIF9fSEFMX1VBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorCisjZGVmaW5lIF9fRElWX1NBTVBMSU5HMTYgICAgICAgICAgICAgICAgVUFSVF9ESVZfU0FNUExJTkcxNgorI2RlZmluZSBfX0RJVk1BTlRfU0FNUExJTkcxNiAgICAgICAgICAgIFVBUlRfRElWTUFOVF9TQU1QTElORzE2CisjZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzE2ICAgICAgICAgICAgVUFSVF9ESVZGUkFRX1NBTVBMSU5HMTYKKyNkZWZpbmUgX19VQVJUX0JSUl9TQU1QTElORzE2ICAgICAgICAgICBVQVJUX0JSUl9TQU1QTElORzE2CisKKyNkZWZpbmUgX19ESVZfU0FNUExJTkc4ICAgICAgICAgICAgICAgICBVQVJUX0RJVl9TQU1QTElORzgKKyNkZWZpbmUgX19ESVZNQU5UX1NBTVBMSU5HOCAgICAgICAgICAgICBVQVJUX0RJVk1BTlRfU0FNUExJTkc4CisjZGVmaW5lIF9fRElWRlJBUV9TQU1QTElORzggICAgICAgICAgICAgVUFSVF9ESVZGUkFRX1NBTVBMSU5HOAorI2RlZmluZSBfX1VBUlRfQlJSX1NBTVBMSU5HOCAgICAgICAgICAgIFVBUlRfQlJSX1NBTVBMSU5HOAorCisjZGVmaW5lIF9fRElWX0xQVUFSVCAgICAgICAgICAgICAgICAgICAgVUFSVF9ESVZfTFBVQVJUCisKKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RFX0lETEVMSU5FICAgICBVQVJUX1dBS0VVUE1FVEhPRF9JRExFTElORQorI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPREVfQUREUkVTU01BUksgIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfVVNBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVU0FSVCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFVTQVJUX0NMT0NLX0RJU0FCTEVEICAgICAgICAgICAgVVNBUlRfQ0xPQ0tfRElTQUJMRQorI2RlZmluZSBVU0FSVF9DTE9DS19FTkFCTEVEICAgICAgICAgICAgIFVTQVJUX0NMT0NLX0VOQUJMRQorCisjZGVmaW5lIFVTQVJUTkFDS19FTkFCTEVEICAgICAgICAgICAgICAgVVNBUlRfTkFDS19FTkFCTEUKKyNkZWZpbmUgVVNBUlROQUNLX0RJU0FCTEVEICAgICAgICAgICAgICBVU0FSVF9OQUNLX0RJU0FCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1dXREdfQWxpYXNlZF9EZWZpbmVzIEhBTCBXV0RHIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENGUl9CQVNFICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9CQVNFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NBTl9BbGlhc2VkX0RlZmluZXMgSEFMIENBTiBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDQU5fRmlsdGVyRklGTzAgICAgICAgICAgICAgQ0FOX0ZJTFRFUl9GSUZPMAorI2RlZmluZSBDQU5fRmlsdGVyRklGTzEgICAgICAgICAgICAgQ0FOX0ZJTFRFUl9GSUZPMQorI2RlZmluZSBDQU5fSVRfUlFDUDAgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBDQU5fSVRfUlFDUDEgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBDQU5fSVRfUlFDUDIgICAgICAgICAgICAgICAgQ0FOX0lUX1RNRQorI2RlZmluZSBJTkFLX1RJTUVPVVQgICAgICAgICAgICAgICAgQ0FOX1RJTUVPVVRfVkFMVUUKKyNkZWZpbmUgU0xBS19USU1FT1VUICAgICAgICAgICAgICAgIENBTl9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIENBTl9UWFNUQVRVU19GQUlMRUQgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIENBTl9UWFNUQVRVU19PSyAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIENBTl9UWFNUQVRVU19QRU5ESU5HICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0VUSF9BbGlhc2VkX0RlZmluZXMgSEFMIEVUSCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFZMQU5fVEFHICAgICAgICAgICAgICAgIEVUSF9WTEFOX1RBRworI2RlZmluZSBNSU5fRVRIX1BBWUxPQUQgICAgICAgICBFVEhfTUlOX0VUSF9QQVlMT0FECisjZGVmaW5lIE1BWF9FVEhfUEFZTE9BRCAgICAgICAgIEVUSF9NQVhfRVRIX1BBWUxPQUQKKyNkZWZpbmUgSlVNQk9fRlJBTUVfUEFZTE9BRCAgICAgRVRIX0pVTUJPX0ZSQU1FX1BBWUxPQUQKKyNkZWZpbmUgTUFDTUlJQVJfQ1JfTUFTSyAgICAgICAgRVRIX01BQ01JSUFSX0NSX01BU0sKKyNkZWZpbmUgTUFDQ1JfQ0xFQVJfTUFTSyAgICAgICAgRVRIX01BQ0NSX0NMRUFSX01BU0sKKyNkZWZpbmUgTUFDRkNSX0NMRUFSX01BU0sgICAgICAgRVRIX01BQ0ZDUl9DTEVBUl9NQVNLCisjZGVmaW5lIERNQU9NUl9DTEVBUl9NQVNLICAgICAgIEVUSF9ETUFPTVJfQ0xFQVJfTUFTSworCisjZGVmaW5lIEVUSF9NTUNDUiAgICAgICAgICAgICAgMHgwMDAwMDEwMFUKKyNkZWZpbmUgRVRIX01NQ1JJUiAgICAgICAgICAgICAweDAwMDAwMTA0VQorI2RlZmluZSBFVEhfTU1DVElSICAgICAgICAgICAgIDB4MDAwMDAxMDhVCisjZGVmaW5lIEVUSF9NTUNSSU1SICAgICAgICAgICAgMHgwMDAwMDEwQ1UKKyNkZWZpbmUgRVRIX01NQ1RJTVIgICAgICAgICAgICAweDAwMDAwMTEwVQorI2RlZmluZSBFVEhfTU1DVEdGU0NDUiAgICAgICAgIDB4MDAwMDAxNENVCisjZGVmaW5lIEVUSF9NTUNUR0ZNU0NDUiAgICAgICAgMHgwMDAwMDE1MFUKKyNkZWZpbmUgRVRIX01NQ1RHRkNSICAgICAgICAgICAweDAwMDAwMTY4VQorI2RlZmluZSBFVEhfTU1DUkZDRUNSICAgICAgICAgIDB4MDAwMDAxOTRVCisjZGVmaW5lIEVUSF9NTUNSRkFFQ1IgICAgICAgICAgMHgwMDAwMDE5OFUKKyNkZWZpbmUgRVRIX01NQ1JHVUZDUiAgICAgICAgICAweDAwMDAwMUM0VQorCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVICAvKiBUeCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9OT1RfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMFUgIC8qIFR4IEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVICAvKiBUeCBGSUZPIHdyaXRlIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogSWRsZSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogUmVhZCAodHJhbnNmZXJyaW5nIGRhdGEgdG8gdGhlIE1BQyB0cmFuc21pdHRlcikgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fV0FJVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFdhaXRpbmcgZm9yIFR4U3RhdHVzIGZyb20gTUFDIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dSSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMDAwMDBVICAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXcml0aW5nIHRoZSByZWNlaXZlZCBUeFN0YXR1cyBvciBmbHVzaGluZyB0aGUgVHhGSUZPICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVNTSU9OX1BBVVNFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVICAvKiBNQUMgdHJhbnNtaXR0ZXIgaW4gcGF1c2UgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9JRExFICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBJZGxlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfV0FJVElORyAgICAgICAgIDB4MDAwMjAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogV2FpdGluZyBmb3IgU3RhdHVzIG9mIHByZXZpb3VzIGZyYW1lIG9yIElGRy9iYWNrb2ZmIHBlcmlvZCB0byBiZSBvdmVyICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfR0VOUkFUSU5HX1BDRiAgIDB4MDAwNDAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogR2VuZXJhdGluZyBhbmQgdHJhbnNtaXR0aW5nIGEgUGF1c2UgY29udHJvbCBmcmFtZSAoaW4gZnVsbCBkdXBsZXggbW9kZSkgKi8KKyNkZWZpbmUgRVRIX01BQ19UUkFOU01JVEZSQU1FQ09OVFJPTExFUl9UUkFOU0ZFUlJJTkcgICAgMHgwMDA2MDAwMFUgIC8qIE1BQyB0cmFuc21pdCBmcmFtZSBjb250cm9sbGVyOiBUcmFuc2ZlcnJpbmcgaW5wdXQgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBFVEhfTUFDX01JSV9UUkFOU01JVF9BQ1RJVkUgICAgICAgICAgIDB4MDAwMTAwMDBVICAvKiBNQUMgTUlJIHRyYW5zbWl0IGVuZ2luZSBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fRU1QVFkgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBlbXB0eSAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19CRUxPV19USFJFU0hPTEQgICAgICAgIDB4MDAwMDAxMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYmVsb3cgZmxvdy1jb250cm9sIGRlLWFjdGl2YXRlIHRocmVzaG9sZCAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19BQk9WRV9USFJFU0hPTEQgICAgICAgIDB4MDAwMDAyMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZpbGwtbGV2ZWwgYWJvdmUgZmxvdy1jb250cm9sIGFjdGl2YXRlIHRocmVzaG9sZCAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19GVUxMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDBVICAvKiBSeCBGSUZPIGZpbGwgbGV2ZWw6IGZ1bGwgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjEpCisjZWxzZQorI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX0lETEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBJRExFIHN0YXRlICovCisjZGVmaW5lIEVUSF9NQUNfUkVBRENPTlRST0xMRVJfUkVBRElOR19EQVRBICAgMHgwMDAwMDAyMFUgIC8qIFJ4IEZJRk8gcmVhZCBjb250cm9sbGVyIFJlYWRpbmcgZnJhbWUgZGF0YSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfU1RBVFVTIDB4MDAwMDAwNDBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBSZWFkaW5nIGZyYW1lIHN0YXR1cyAob3IgdGltZS1zdGFtcCkgKi8KKyNlbmRpZgorI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX0ZMVVNISU5HICAgICAgIDB4MDAwMDAwNjBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBGbHVzaGluZyB0aGUgZnJhbWUgZGF0YSBhbmQgc3RhdHVzICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX1dSSVRFX0FDVElWRSAgICAgICAgICAgMHgwMDAwMDAxMFUgIC8qIFJ4IEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX05PVEFDVElWRSAgICAgICAgICAweDAwMDAwMDAwVSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JFQURfQUNUSVZFICAgICAgICAweDAwMDAwMDAyVSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fV1JJVEVfQUNUSVZFICAgICAgIDB4MDAwMDAwMDRVICAvKiBNQUMgc21hbGwgRklGTyB3cml0ZSBjb250cm9sbGVyIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX1NNQUxMX0ZJRk9fUldfQUNUSVZFICAgICAgICAgIDB4MDAwMDAwMDZVICAvKiBNQUMgc21hbGwgRklGTyByZWFkIC8gd3JpdGUgY29udHJvbGxlcnMgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfTUlJX1JFQ0VJVkVfUFJPVE9DT0xfQUNUSVZFICAgMHgwMDAwMDAwMVUgIC8qIE1BQyBNSUkgcmVjZWl2ZSBwcm90b2NvbCBlbmdpbmUgYWN0aXZlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RDTUlfQWxpYXNlZF9EZWZpbmVzIEhBTCBEQ01JIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9EQ01JX0VSUk9SX09WRiAgICAgIEhBTF9EQ01JX0VSUk9SX09WUgorI2RlZmluZSBEQ01JX0lUX09WRiAgICAgICAgICAgICBEQ01JX0lUX09WUgorI2RlZmluZSBEQ01JX0ZMQUdfT1ZGUkkgICAgICAgICBEQ01JX0ZMQUdfT1ZSUkkKKyNkZWZpbmUgRENNSV9GTEFHX09WRk1JICAgICAgICAgRENNSV9GTEFHX09WUk1JCisKKyNkZWZpbmUgSEFMX0RDTUlfQ29uZmlnQ1JPUCAgICAgSEFMX0RDTUlfQ29uZmlnQ3JvcAorI2RlZmluZSBIQUxfRENNSV9FbmFibGVDUk9QICAgICBIQUxfRENNSV9FbmFibGVDcm9wCisjZGVmaW5lIEhBTF9EQ01JX0Rpc2FibGVDUk9QICAgIEhBTF9EQ01JX0Rpc2FibGVDcm9wCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0Mjd4eCkgfHwgZGVmaW5lZChTVE0zMkY0Mzd4eCkgXAorICB8fCBkZWZpbmVkKFNUTTMyRjQyOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQzOXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KSBcCisgIHx8IGRlZmluZWQoU1RNMzJINykKKy8qKiBAZGVmZ3JvdXAgSEFMX0RNQTJEX0FsaWFzZWRfRGVmaW5lcyBIQUwgRE1BMkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BMkRfQVJHQjg4ODggICAgICAgICAgRE1BMkRfT1VUUFVUX0FSR0I4ODg4CisjZGVmaW5lIERNQTJEX1JHQjg4OCAgICAgICAgICAgIERNQTJEX09VVFBVVF9SR0I4ODgKKyNkZWZpbmUgRE1BMkRfUkdCNTY1ICAgICAgICAgICAgRE1BMkRfT1VUUFVUX1JHQjU2NQorI2RlZmluZSBETUEyRF9BUkdCMTU1NSAgICAgICAgICBETUEyRF9PVVRQVVRfQVJHQjE1NTUKKyNkZWZpbmUgRE1BMkRfQVJHQjQ0NDQgICAgICAgICAgRE1BMkRfT1VUUFVUX0FSR0I0NDQ0CisKKyNkZWZpbmUgQ01fQVJHQjg4ODggICAgICAgICAgICAgRE1BMkRfSU5QVVRfQVJHQjg4ODgKKyNkZWZpbmUgQ01fUkdCODg4ICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfUkdCODg4CisjZGVmaW5lIENNX1JHQjU2NSAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX1JHQjU2NQorI2RlZmluZSBDTV9BUkdCMTU1NSAgICAgICAgICAgICBETUEyRF9JTlBVVF9BUkdCMTU1NQorI2RlZmluZSBDTV9BUkdCNDQ0NCAgICAgICAgICAgICBETUEyRF9JTlBVVF9BUkdCNDQ0NAorI2RlZmluZSBDTV9MOCAgICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9MOAorI2RlZmluZSBDTV9BTDQ0ICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9BTDQ0CisjZGVmaW5lIENNX0FMODggICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FMODgKKyNkZWZpbmUgQ01fTDQgICAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfTDQKKyNkZWZpbmUgQ01fQTggICAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQTgKKyNkZWZpbmUgQ01fQTQgICAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQTQKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgIC8qIFNUTTMyTDQgfHwgIFNUTTMyRjcgfHwgIFNUTTMyRjQgfHwgIFNUTTMySDcgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUFBQX0FsaWFzZWRfRGVmaW5lcyBIQUwgUFBQIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NSWVBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIENSWVAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JZUF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjayAgICAgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjaworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSEFTSF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9IQVNIX1NUQVRFVHlwZURlZiAgICAgICAgSEFMX0hBU0hfU3RhdGVUeXBlRGVmCisjZGVmaW5lIEhBTF9IQVNIUGhhc2VUeXBlRGVmICAgICAgICAgSEFMX0hBU0hfUGhhc2VUeXBlRGVmCisjZGVmaW5lIEhBTF9ITUFDX01ENV9GaW5pc2ggICAgICAgICAgSEFMX0hBU0hfTUQ1X0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEExX0ZpbmlzaCAgICAgICAgIEhBTF9IQVNIX1NIQTFfRmluaXNoCisjZGVmaW5lIEhBTF9ITUFDX1NIQTIyNF9GaW5pc2ggICAgICAgSEFMX0hBU0hfU0hBMjI0X0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEEyNTZfRmluaXNoICAgICAgIEhBTF9IQVNIX1NIQTI1Nl9GaW5pc2gKKworLypIQVNIIEFsZ29yaXRobSBTZWxlY3Rpb24qLworCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEExICAgICAgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTEKKyNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX1NIQTIyNCAgICBIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjI0CisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEEyNTYgICAgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTI1NgorI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fTUQ1ICAgICAgIEhBU0hfQUxHT1NFTEVDVElPTl9NRDUKKworI2RlZmluZSBIQVNIX0FsZ29Nb2RlX0hBU0ggICAgICAgICBIQVNIX0FMR09NT0RFX0hBU0gKKyNkZWZpbmUgSEFTSF9BbGdvTW9kZV9ITUFDICAgICAgICAgSEFTSF9BTEdPTU9ERV9ITUFDCisKKyNkZWZpbmUgSEFTSF9ITUFDS2V5VHlwZV9TaG9ydEtleSAgSEFTSF9ITUFDX0tFWVRZUEVfU0hPUlRLRVkKKyNkZWZpbmUgSEFTSF9ITUFDS2V5VHlwZV9Mb25nS2V5ICAgSEFTSF9ITUFDX0tFWVRZUEVfTE9OR0tFWQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEdlbmVyaWMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRW5hYmxlREJHU2xlZXBNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlREJHU2xlZXBNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlREJHU3RvcE1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlCisjZGVmaW5lIEhBTF9FbmFibGVEQkdTdGFuZGJ5TW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlREJHU3RhbmRieU1vZGUgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUKKyNkZWZpbmUgSEFMX0RCR19Mb3dQb3dlckNvbmZpZyhQZXJpcGgsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0RCR01DVV9EQkdfRW5hYmxlTG93UG93ZXJDb25maWcoUGVyaXBoKSA6IEhBTF9EQkdNQ1VfREJHX0Rpc2FibGVMb3dQb3dlckNvbmZpZyhQZXJpcGgpKQorI2RlZmluZSBIQUxfVlJFRklOVF9PdXRwdXRTZWxlY3QgIEhBTF9TWVNDRkdfVlJFRklOVF9PdXRwdXRTZWxlY3QKKyNkZWZpbmUgSEFMX0xvY2tfQ21kKGNtZCkgKCgoY21kKT09RU5BQkxFKSA/IEhBTF9TWVNDRkdfRW5hYmxlX0xvY2tfVlJFRklOVCgpIDogSEFMX1NZU0NGR19EaXNhYmxlX0xvY2tfVlJFRklOVCgpKQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNlbHNlCisjZGVmaW5lIEhBTF9WUkVGSU5UX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSk/IEhBTF9TWVNDRkdfRW5hYmxlVlJFRklOVCgpIDogSEFMX1NZU0NGR19EaXNhYmxlVlJFRklOVCgpKQorI2VuZGlmCisjZGVmaW5lIEhBTF9BRENfRW5hYmxlQnVmZmVyX0NtZChjbWQpICAoKChjbWQpPT1FTkFCTEUpID8gSEFMX0FEQ0V4X0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVCgpKQorI2RlZmluZSBIQUxfQURDX0VuYWJsZUJ1ZmZlclNlbnNvcl9DbWQoY21kKSAoKChjbWQpPT1FTkFCTEUpID8gIEhBTF9BRENFeF9FbmFibGVWUkVGSU5UVGVtcFNlbnNvcigpIDogSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UVGVtcFNlbnNvcigpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRkxBU0hfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEZMQVNIIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfSGFsZlBhZ2VQcm9ncmFtICAgICAgSEFMX0ZMQVNIRXhfSGFsZlBhZ2VQcm9ncmFtCisjZGVmaW5lIEZMQVNIX0VuYWJsZVJ1blBvd2VyRG93biAgIEhBTF9GTEFTSEV4X0VuYWJsZVJ1blBvd2VyRG93bgorI2RlZmluZSBGTEFTSF9EaXNhYmxlUnVuUG93ZXJEb3duICBIQUxfRkxBU0hFeF9EaXNhYmxlUnVuUG93ZXJEb3duCisjZGVmaW5lIEhBTF9EQVRBX0VFUFJPTUV4X1VubG9jayAgIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fVW5sb2NrCisjZGVmaW5lIEhBTF9EQVRBX0VFUFJPTUV4X0xvY2sgICAgIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fTG9jaworI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9FcmFzZSAgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0VyYXNlCisjZGVmaW5lIEhBTF9EQVRBX0VFUFJPTUV4X1Byb2dyYW0gIEhBTF9GTEFTSEV4X0RBVEFFRVBST01fUHJvZ3JhbQorCisgLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBJMkMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSTJDRXhfQW5hbG9nRmlsdGVyX0NvbmZpZyAgICAgICAgIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIKKyNkZWZpbmUgSEFMX0kyQ0V4X0RpZ2l0YWxGaWx0ZXJfQ29uZmlnICAgICAgICBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcgorI2RlZmluZSBIQUxfRk1QSTJDRXhfQW5hbG9nRmlsdGVyX0NvbmZpZyAgICAgIEhBTF9GTVBJMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIKKyNkZWZpbmUgSEFMX0ZNUEkyQ0V4X0RpZ2l0YWxGaWx0ZXJfQ29uZmlnICAgICBIQUxfRk1QSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcgorCisjZGVmaW5lIEhBTF9JMkNGYXN0TW9kZVBsdXNDb25maWcoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cywgY21kKSAoKChjbWQpPT1FTkFCTEUpPyBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMpOiBIQUxfSTJDRXhfRGlzYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKSkKKworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUCisjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0lUCisjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUCisjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0lUICAgIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BICBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEKKyNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSAgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfRE1BCisjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSAgIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMldCICB8fCBTVE0zMkcwIHx8IFNUTTMyRjQgfHwgU1RNMzJGNyB8fCBTVE0zMkwwIHx8IFNUTTMyTDQgKi8KKworI2lmIGRlZmluZWQoU1RNMzJGNCkKKyNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUCisjZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgIEhBTF9GTVBJMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0lUCisjZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUCisjZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0lUICAgIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQKKyNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfRk1QSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BICBIQUxfRk1QSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEKKyNkZWZpbmUgSEFMX0ZNUEkyQ19TbGF2ZV9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSAgSEFMX0ZNUEkyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfRE1BCisjZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSAgIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BCisjZW5kaWYgLyogU1RNMzJGNCAqLworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BXUl9BbGlhc2VkIEhBTCBQV1IgQWxpYXNlZCBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9QV1JfUFZEQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSX0NvbmZpZ1BWRAorI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVCa1VwUmVnICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVCa1VwUmVnCisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZUZsYXNoUG93ZXJEb3duICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUZsYXNoUG93ZXJEb3duCisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZVZkZGlvMk1vbml0b3IgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVZkZGlvMk1vbml0b3IKKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVCa1VwUmVnICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVCa1VwUmVnCisjZGVmaW5lIEhBTF9QV1JfRW5hYmxlRmxhc2hQb3dlckRvd24gICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlRmxhc2hQb3dlckRvd24KKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVWZGRpbzJNb25pdG9yICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVWZGRpbzJNb25pdG9yCisjZGVmaW5lIEhBTF9QV1JfUFZEX1BWTV9JUlFIYW5kbGVyICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyCisjZGVmaW5lIEhBTF9QV1JfUFZETGV2ZWxDb25maWcgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSX0NvbmZpZ1BWRAorI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JfSVJRSGFuZGxlciAgICAgICAgICAgICAgSEFMX1BXUkV4X1ZkZGlvMk1vbml0b3JfSVJRSGFuZGxlcgorI2RlZmluZSBIQUxfUFdSX1ZkZGlvMk1vbml0b3JDYWxsYmFjayAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X1ZkZGlvMk1vbml0b3JDYWxsYmFjaworI2RlZmluZSBIQUxfUFdSRXhfQWN0aXZhdGVPdmVyRHJpdmUgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZU92ZXJEcml2ZQorI2RlZmluZSBIQUxfUFdSRXhfRGVhY3RpdmF0ZU92ZXJEcml2ZSAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVPdmVyRHJpdmUKKyNkZWZpbmUgSEFMX1BXUkV4X0Rpc2FibGVTREFEQ0FuYWxvZyAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlU0RBREMKKyNkZWZpbmUgSEFMX1BXUkV4X0VuYWJsZVNEQURDQW5hbG9nICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVTREFEQworI2RlZmluZSBIQUxfUFdSRXhfUFZNQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0NvbmZpZ1BWTQorCisjZGVmaW5lIFBXUl9NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfTk9STUFMCisjZGVmaW5lIFBXUl9NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfSVRfUklTSU5HCisjZGVmaW5lIFBXUl9NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfSVRfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9JVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HCisjZGVmaW5lIFBXUl9NT0RFX0VWRU5UX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfRVZFTlRfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORyAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HCisKKyNkZWZpbmUgQ1JfT0ZGU0VUX0JCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DUl9PRkZTRVRfQkIKKyNkZWZpbmUgQ1NSX09GRlNFVF9CQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DU1JfT0ZGU0VUX0JCCisjZGVmaW5lIFBNT0RFX0JJVF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfQklUX05VTUJFUgorI2RlZmluZSBDUl9QTU9ERV9CQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JfVk9TX0JCCisKKyNkZWZpbmUgREJQX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBWREVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVkRFX0JJVF9OVU1CRVIKKyNkZWZpbmUgUE1PREVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNT0RFX0JJVF9OVU1CRVIKKyNkZWZpbmUgRVdVUF9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVXVVBfQklUX05VTUJFUgorI2RlZmluZSBGUERTX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBEU19CSVRfTlVNQkVSCisjZGVmaW5lIE9ERU5fQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPREVOX0JJVF9OVU1CRVIKKyNkZWZpbmUgT0RTV0VOX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9EU1dFTl9CSVRfTlVNQkVSCisjZGVmaW5lIE1STFZEU19CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUkxWRFNfQklUX05VTUJFUgorI2RlZmluZSBMUExWRFNfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBMVkRTX0JJVF9OVU1CRVIKKyNkZWZpbmUgQlJFX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSRV9CSVRfTlVNQkVSCisKKyNkZWZpbmUgUFdSX01PREVfRVZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9OT1JNQUwKKworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQlVTX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBTTUJVUyBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUJVU19TbGF2ZV9MaXN0ZW5fSVQgICAgICAgICAgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVAorI2RlZmluZSBIQUxfU01CVVNfU2xhdmVBZGRyQ2FsbGJhY2sgICAgICAgIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlTGlzdGVuQ3BsdENhbGxiYWNrICBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TUElfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFNQSSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TUElfRmx1c2hSeEZpZm8gICAgICAgICAgICAgICAgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9USU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9USU1fRE1BRGVsYXlQdWxzZUNwbHQgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFEZWxheVB1bHNlQ3BsdAorI2RlZmluZSBIQUxfVElNX0RNQUVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BRXJyb3IKKyNkZWZpbmUgSEFMX1RJTV9ETUFDYXB0dXJlQ3BsdCAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RNQUNhcHR1cmVDcGx0CisjZGVmaW5lIEhBTF9USU1FeF9ETUFDb21tdXRhdGlvbkNwbHQgICAgICAgICAgICAgICAgICAgIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdAorI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkwwKQorI2RlZmluZSBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb25pemF0aW9uICAgICAgICAgICAgICBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybworI2RlZmluZSBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb25pemF0aW9uX0lUICAgICAgICAgICBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVAorI2RlZmluZSBIQUxfVElNRXhfQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICAgICAgICAgICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnQgICAgICAgICAgICAgICAgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50CisjZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0lUICAgICAgICAgICAgIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVAorI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9ETUEgICAgICAgICAgICBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMkcwIHx8IFNUTTMyRjcgfHwgU1RNMzJGNCAgfHwgU1RNMzJMMCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVUFSVF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgVUFSVCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VQVJUX1dha2V1cENhbGxiYWNrIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIExUREMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfTFREQ19MaW5lRXZlbkNhbGxiYWNrIEhBTF9MVERDX0xpbmVFdmVudENhbGxiYWNrCisjZGVmaW5lIEhBTF9MVERDX1JlbGFvZCAgICAgICAgICAgSEFMX0xURENfUmVsb2FkCisjZGVmaW5lIEhBTF9MVERDX1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcgIEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZworI2RlZmluZSBIQUxfTFREQ19TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnICBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tQWRhcHRlZENvbW1hbmRDb25maWcKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfUFBQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBQUFAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfQUVTX0FsaWFzZWRfTWFjcm9zIEhBTCBDUllQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQUVTX0lUX0NDICAgICAgICAgICAgICAgICAgICAgIENSWVBfSVRfQ0MKKyNkZWZpbmUgQUVTX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgIENSWVBfSVRfRVJSCisjZGVmaW5lIEFFU19GTEFHX0NDRiAgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfQ0NGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9BbGlhc2VkX01hY3JvcyBIQUwgR2VuZXJpYyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX0dFVF9CT09UX01PREUgICAgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX0dFVF9CT09UX01PREUKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRkxBU0ggICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRkxBU0gKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0ggICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1lTVEVNRkxBU0gKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfU1JBTSAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1JBTQorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GTUMgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GTUMKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DX1NEUkFNICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRk1DX1NEUkFNCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZTTUMgICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZTTUMKKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfUVVBRFNQSSAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfUVVBRFNQSQorI2RlZmluZSBfX0hBTF9GTUNfQkFOSyAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19GTUNfQkFOSworI2RlZmluZSBfX0hBTF9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19HRVRfRkxBRworI2RlZmluZSBfX0hBTF9DTEVBUl9GTEFHICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1ZSRUZJTlRfT1VUX0VOQUJMRSAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1ZSRUZJTlRfT1VUX0VOQUJMRQorI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9ESVNBQkxFICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19WUkVGSU5UX09VVF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfRU5BQkxFICAgICAgICAgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF8wXzMxX0VOQUJMRQorCisjZGVmaW5lIFNZU0NGR19GTEFHX1ZSRUZfUkVBRFkgICAgICAgICAgICAgICAgU1lTQ0ZHX0ZMQUdfVlJFRklOVF9SRUFEWQorI2RlZmluZSBTWVNDRkdfRkxBR19SQzQ4ICAgICAgICAgICAgICAgICAgICAgIFJDQ19GTEFHX0hTSTQ4CisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVNfQ09ORklHICAgICAgICAgSVNfSTJDX0ZBU1RNT0RFUExVUworI2RlZmluZSBVRkJfTU9ERV9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgIFVGQl9NT0RFX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ01QX1BEX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICBDTVBfUERfQklUX05VTUJFUgorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX01hY3JvcyBIQUwgQURDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19BRENfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEUKKyNkZWZpbmUgX19BRENfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19FTkFCTElOR19DT05ESVRJT05TICAgICAgICAgICAgICAgICAgICBBRENfRU5BQkxJTkdfQ09ORElUSU9OUworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMSU5HX0NPTkRJVElPTlMgICAgICAgICAgICAgICAgICAgQURDX0RJU0FCTElOR19DT05ESVRJT05TCisjZGVmaW5lIF9fSEFMX0FEQ19JU19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVNfRU5BQkxFCisjZGVmaW5lIF9fQURDX0lTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVNfRU5BQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19JU19TT0ZUV0FSRV9TVEFSVF9SRUdVTEFSICAgICAgICAgICAgICBBRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUgorI2RlZmluZSBfX0hBTF9BRENfSVNfU09GVFdBUkVfU1RBUlRfSU5KRUNURUQgICAgICAgICAgICAgQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVECisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUl9JTkpFQ1RFRCBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSICAgICAgICAgIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUgorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX0lOSkVDVEVEICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRAorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HICAgICAgICAgICAgICAgICAgQURDX0lTX0NPTlZFUlNJT05fT05HT0lORworI2RlZmluZSBfX0hBTF9BRENfQ0xFQVJfRVJST1JDT0RFICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERQorCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAgICAgICBBRENfR0VUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0FXRDFDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVdEMjNDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDIzQ1IKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0FVVE9fQ09OVkVSU0lPTiAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9BVVRPX0NPTlZFUlNJT04KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUgICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9ESVNDQ09OVElOVU9VUyAgICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfUkVHX0RJU0NDT05USU5VT1VTICAgICAgICAgICAgICAgIEFEQ19DRkdSX1JFR19ESVNDQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTSAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0KKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfQVVUT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FVVE9XQUlUCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX09WRVJSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9PVkVSUlVOCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0RNQUNPTlRSRVEgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ETUFDT05UUkVRCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0VYVFNFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUxfU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX0pFWFRTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KRVhUU0VMX1NFVAorI2RlZmluZSBfX0hBTF9BRENfT0ZSX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX09GUl9DSEFOTkVMCisjZGVmaW5lIF9fSEFMX0FEQ19ESUZTRUxfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRElGU0VMX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0NBTEZBQ1RfRElGRl9TRVQgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0RJRkZfU0VUCisjZGVmaW5lIF9fSEFMX0FEQ19DQUxGQUNUX0RJRkZfR0VUICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0FMRkFDVF9ESUZGX0dFVAorI2RlZmluZSBfX0hBTF9BRENfVFJYX0hJR0hUSFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgQURDX1RSWF9ISUdIVEhSRVNIT0xECisKKyNkZWZpbmUgX19IQUxfQURDX09GRlNFVF9TSElGVF9SRVNPTFVUSU9OICAgICAgICAgICAgICAgIEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OICAgICAgICAgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTgorI2RlZmluZSBfX0hBTF9BRENfQVdEMjNUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiAgICAgICAgQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DT01NT05fUkVHSVNURVIKKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9DQ1JfTVVMVEkgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DT01NT05fQ0NSX01VTFRJCisjZGVmaW5lIF9fSEFMX0FEQ19NVUxUSU1PREVfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICBBRENfTVVMVElNT0RFX0lTX0VOQUJMRQorI2RlZmluZSBfX0FEQ19NVUxUSU1PREVfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgQURDX01VTFRJTU9ERV9JU19FTkFCTEUKKyNkZWZpbmUgX19IQUxfQURDX05PTk1VTFRJTU9ERV9PUl9NVUxUSU1PREVNQVNURVIgICAgICAgIEFEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSCisjZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fQURDX09USEVSICAgICAgICAgICAgICAgICAgICAgICBBRENfQ09NTU9OX0FEQ19PVEhFUgorI2RlZmluZSBfX0hBTF9BRENfTVVMVElfU0xBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX01VTFRJX1NMQVZFCisKKyNkZWZpbmUgX19IQUxfQURDX1NRUjFfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfU0hJRlQKKyNkZWZpbmUgX19IQUxfQURDX0pTUVJfSkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pMX1NISUZUCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX1JLX0pMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9SS19KTAorI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVNfTlVNICAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDT05USU5VT1VTX05VTQorI2RlZmluZSBfX0hBTF9BRENfQ1IxX1NDQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9TQ0FOX1NFVAorI2RlZmluZSBfX0hBTF9BRENfQ09OVkNZQ0xFU19NQVhfUkFOR0UgICAgICAgICAgICAgICAgICAgQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFCisjZGVmaW5lIF9fSEFMX0FEQ19DTE9DS19QUkVTQ0FMRVJfUkFOR0UgICAgICAgICAgICAgICAgICBBRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfQ0xPQ0tfUFJFU0NBTEVSICAgICAgICAgICAgICAgICAgICBBRENfR0VUX0NMT0NLX1BSRVNDQUxFUgorCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMQorI2RlZmluZSBfX0hBTF9BRENfU01QUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxCisjZGVmaW5lIF9fSEFMX0FEQ19TTVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjIKKyNkZWZpbmUgX19IQUxfQURDX1NRUjNfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIzX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIyX1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMl9SSworI2RlZmluZSBfX0hBTF9BRENfU1FSMV9SSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfUksKKyNkZWZpbmUgX19IQUxfQURDX0NSMl9DT05USU5VT1VTICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjJfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ1IxX0RJU0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9ESVNDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DUjFfU0NBTkNPTlYgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IxX1NDQU5DT05WCisjZGVmaW5lIF9fSEFMX0FEQ19DUjJfRU9DU2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX0VPQ1NlbGVjdGlvbgorI2RlZmluZSBfX0hBTF9BRENfQ1IyX0RNQUNvbnRSZXEgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9ETUFDb250UmVxCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUgorCisjZGVmaW5lIF9fSEFMX0FEQ19DSFNFTFJfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hTRUxSX0NIQU5ORUwKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX1JFR19ESVNDQ09OVElOVU9VUyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0FVVE9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BVVRPT0ZGCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9BVVRPV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT1dBSVQKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0NPTlRJTlVPVVMgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9DT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfT1ZFUlJVTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfU0NBTkRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX1NDQU5ESVIKKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX0RNQUNPTlRSRVEgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ETUFDT05UUkVRCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RBQ19BbGlhc2VkX01hY3JvcyBIQUwgREFDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfREhSMTJSMV9BTElHTkVNRU5UICAgICAgICAgICAgICAgICAgICAgICAgREFDX0RIUjEyUjFfQUxJR05NRU5UCisjZGVmaW5lIF9fSEFMX0RIUjEyUjJfQUxJR05FTUVOVCAgICAgICAgICAgICAgICAgICAgICAgIERBQ19ESFIxMlIyX0FMSUdOTUVOVAorI2RlZmluZSBfX0hBTF9ESFIxMlJEX0FMSUdORU1FTlQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfREhSMTJSRF9BTElHTk1FTlQKKyNkZWZpbmUgSVNfREFDX0dFTkVSQVRFX1dBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfREFDX1dBVkUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREJHTUNVX0FsaWFzZWRfTWFjcm9zIEhBTCBEQkdNQ1UgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTIKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTNfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0zX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU00CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU00CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU01X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTUKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTUKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTZfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU02X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNN19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU03CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTdfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU03CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU04X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTgKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNOF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTgKKworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNOV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU05CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTlfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU05CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEwCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTExCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEyCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xM19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xMworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xM19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTEzCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE0CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9DQU4yX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0NBTjIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjIKKworCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE1CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xNl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNgorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xNl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0xN19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xN19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE3CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9SVENfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1JUQ19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1JUQworI2lmIGRlZmluZWQoU1RNMzJINykKKyAgI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHMQorICAjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VbkZyZWV6ZV9XV0RHMQorICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcxCisgICNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VuRnJlZXplX0lXREcxCisjZWxzZQorICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcKKyAgI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfV1dERworICAjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcKKyAgI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSVdERworI2VuZGlmIC8qIFNUTTMySDcgKi8KKyNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMxX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSTJDMV9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMV9USU1FT1VUCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JMkMyX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDMl9USU1FT1VUCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzJfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzJfVElNRU9VVAorI2RlZmluZSBfX0hBTF9GUkVFWkVfSTJDM19USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JMkMzX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMzX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0NBTjFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfQ0FOMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9DQU4xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfQ0FOMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfTFBUSU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0xQVElNMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9MUFRJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9MUFRJTTEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0xQVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9MUFRJTTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfTFBUSU0yX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0yCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9NYWNyb3MgSEFMIENPTVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoU1RNMzJGMykKKyNkZWZpbmUgQ09NUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfRU5BQkxFCisjZGVmaW5lIENPTVBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0RJU0FCTEUKKyNkZWZpbmUgQ09NUF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfTE9DSworCisjaWYgZGVmaW5lZChTVE0zMkYzMDF4OCkgfHwgZGVmaW5lZChTVE0zMkYzMDJ4OCkgfHwgZGVmaW5lZChTVE0zMkYzMTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4OCkgfHwgZGVmaW5lZChTVE0zMkYzMzR4OCkgfHwgZGVmaW5lZChTVE0zMkYzMjh4eCkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9HRVRfRkxBRygpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9DTEVBUl9GTEFHKCkpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoU1RNMzJGMzAyeEUpIHx8IGRlZmluZWQoU1RNMzJGMzAyeEMpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfQ0xFQVJfRkxBRygpKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFNUTTMyRjMwM3hFKSB8fCBkZWZpbmVkKFNUTTMyRjM5OHh4KSB8fCBkZWZpbmVkKFNUTTMyRjMwM3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM1OHh4KQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0NMRUFSX0ZMQUcoKSkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChTVE0zMkYzNzN4QykgfHxkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyMgZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpKQorI2VuZGlmCisKKyNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRVhUSV9MSU5FICBDT01QX0dFVF9FWFRJX0xJTkUKKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorLyogTm90ZTogT24gdGhlc2UgU1RNMzIgZmFtaWxpZXMsIHRoZSBvbmx5IGFyZ3VtZW50IG9mIHRoaXMgbWFjcm8gICAgICAgICAgICAgKi8KKy8qICAgICAgIGlzIENPTVBfRkxBR19MT0NLLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaGlzIG1hY3JvIGlzIHJlcGxhY2VkIGJ5IF9fSEFMX0NPTVBfSVNfTE9DS0VEIHdpdGggb25seSBIQUwgaGFuZGxlICAqLworLyogICAgICAgYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgIChfX0hBTF9DT01QX0lTX0xPQ0tFRChfX0hBTkRMRV9fKSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorLyoqIEBkZWZncm91cCBIQUxfQ09NUF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgQ09NUCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9DT01QX1N0YXJ0X0lUICAgICAgIEhBTF9DT01QX1N0YXJ0IC8qIEZ1bmN0aW9uIGNvbnNpZGVyZWQgYXMgbGVnYWN5IGFzIEVYVEkgZXZlbnQgb3IgSVQgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovCisjZGVmaW5lIEhBTF9DT01QX1N0b3BfSVQgICAgICAgIEhBTF9DT01QX1N0b3AgIC8qIEZ1bmN0aW9uIGNvbnNpZGVyZWQgYXMgbGVnYWN5IGFzIEVYVEkgZXZlbnQgb3IgSVQgY29uZmlndXJhdGlvbiBpcyBkb25lIGludG8gSEFMX0NPTVBfSW5pdCgpICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RBQ19BbGlhc2VkX01hY3JvcyBIQUwgREFDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19EQUNfV0FWRShXQVZFKSAoKChXQVZFKSA9PSBEQUNfV0FWRV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FWRSkgPT0gREFDX1dBVkVfTk9JU0UpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVkUpID09IERBQ19XQVZFX1RSSUFOR0xFKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRkxBU0hfQWxpYXNlZF9NYWNyb3MgSEFMIEZMQVNIIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19XUlBBUkVBICAgICAgICAgIElTX09CX1dSUEFSRUEKKyNkZWZpbmUgSVNfVFlQRVBST0dSQU0gICAgICBJU19GTEFTSF9UWVBFUFJPR1JBTQorI2RlZmluZSBJU19UWVBFUFJPR1JBTUZMQVNIIElTX0ZMQVNIX1RZUEVQUk9HUkFNCisjZGVmaW5lIElTX1RZUEVFUkFTRSAgICAgICAgSVNfRkxBU0hfVFlQRUVSQVNFCisjZGVmaW5lIElTX05CU0VDVE9SUyAgICAgICAgSVNfRkxBU0hfTkJTRUNUT1JTCisjZGVmaW5lIElTX09CX1dER19TT1VSQ0UgICAgSVNfT0JfSVdER19TT1VSQ0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJDX0FsaWFzZWRfTWFjcm9zIEhBTCBJMkMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0kyQ19SRVNFVF9DUjIgICAgICAgICAgICAgSTJDX1JFU0VUX0NSMgorI2RlZmluZSBfX0hBTF9JMkNfR0VORVJBVEVfU1RBUlQgICAgICAgIEkyQ19HRU5FUkFURV9TVEFSVAorI2lmIGRlZmluZWQoU1RNMzJGMSkKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFfUkFOR0UgICAgICAgICAgICBJMkNfRlJFUVJBTkdFCisjZWxzZQorI2RlZmluZSBfX0hBTF9JMkNfRlJFUV9SQU5HRSAgICAgICAgICAgIEkyQ19GUkVRX1JBTkdFCisjZW5kaWYgLyogU1RNMzJGMSAqLworI2RlZmluZSBfX0hBTF9JMkNfUklTRV9USU1FICAgICAgICAgICAgIEkyQ19SSVNFX1RJTUUKKyNkZWZpbmUgX19IQUxfSTJDX1NQRUVEX1NUQU5EQVJEICAgICAgICBJMkNfU1BFRURfU1RBTkRBUkQKKyNkZWZpbmUgX19IQUxfSTJDX1NQRUVEX0ZBU1QgICAgICAgICAgICBJMkNfU1BFRURfRkFTVAorI2RlZmluZSBfX0hBTF9JMkNfU1BFRUQgICAgICAgICAgICAgICAgIEkyQ19TUEVFRAorI2RlZmluZSBfX0hBTF9JMkNfN0JJVF9BRERfV1JJVEUgICAgICAgIEkyQ183QklUX0FERF9XUklURQorI2RlZmluZSBfX0hBTF9JMkNfN0JJVF9BRERfUkVBRCAgICAgICAgIEkyQ183QklUX0FERF9SRUFECisjZGVmaW5lIF9fSEFMX0kyQ18xMEJJVF9BRERSRVNTICAgICAgICAgSTJDXzEwQklUX0FERFJFU1MKKyNkZWZpbmUgX19IQUxfSTJDXzEwQklUX0hFQURFUl9XUklURSAgICBJMkNfMTBCSVRfSEVBREVSX1dSSVRFCisjZGVmaW5lIF9fSEFMX0kyQ18xMEJJVF9IRUFERVJfUkVBRCAgICAgSTJDXzEwQklUX0hFQURFUl9SRUFECisjZGVmaW5lIF9fSEFMX0kyQ19NRU1fQUREX01TQiAgICAgICAgICAgSTJDX01FTV9BRERfTVNCCisjZGVmaW5lIF9fSEFMX0kyQ19NRU1fQUREX0xTQiAgICAgICAgICAgSTJDX01FTV9BRERfTFNCCisjZGVmaW5lIF9fSEFMX0kyQ19GUkVRUkFOR0UgICAgICAgICAgICAgSTJDX0ZSRVFSQU5HRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJTX0FsaWFzZWRfTWFjcm9zIEhBTCBJMlMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0kyU19JTlNUQU5DRSAgICAgICAgICAgICAgICAgSVNfSTJTX0FMTF9JTlNUQU5DRQorI2RlZmluZSBJU19JMlNfSU5TVEFOQ0VfRVhUICAgICAgICAgICAgIElTX0kyU19BTExfSU5TVEFOQ0VfRVhUCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisgICNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX0ZSRUZMQUcgICAgICAgX19IQUxfSTJTX0NMRUFSX1RJRlJFRkxBRworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0lSREFfQWxpYXNlZF9NYWNyb3MgSEFMIElSREEgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSVJEQV9ESVNBQkxFICAgICAgICAgICAgICAgICAgX19IQUxfSVJEQV9ESVNBQkxFCisjZGVmaW5lIF9fSVJEQV9FTkFCTEUgICAgICAgICAgICAgICAgICAgX19IQUxfSVJEQV9FTkFCTEUKKworI2RlZmluZSBfX0hBTF9JUkRBX0dFVENMT0NLU09VUkNFICAgICAgIElSREFfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19IQUxfSVJEQV9NQVNLX0NPTVBVVEFUSU9OICAgICBJUkRBX01BU0tfQ09NUFVUQVRJT04KKyNkZWZpbmUgX19JUkRBX0dFVENMT0NLU09VUkNFICAgICAgICAgICBJUkRBX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fSVJEQV9NQVNLX0NPTVBVVEFUSU9OICAgICAgICAgSVJEQV9NQVNLX0NPTVBVVEFUSU9OCisKKyNkZWZpbmUgSVNfSVJEQV9PTkVCSVRfU0FNUExFICAgICAgICAgICBJU19JUkRBX09ORV9CSVRfU0FNUExFCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9JV0RHX0FsaWFzZWRfTWFjcm9zIEhBTCBJV0RHIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTICBJV0RHX0VOQUJMRV9XUklURV9BQ0NFU1MKKyNkZWZpbmUgX19IQUxfSVdER19ESVNBQkxFX1dSSVRFX0FDQ0VTUyBJV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xQVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBMUFRJTSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfTFBUSU1fRU5BQkxFX0lOVEVSUlVQVCAgICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRV9JTlRFUlJVUFQgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX0xQVElNX0dFVF9JVFNUQVRVUyAgICAgICAgX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX09QQU1QX0FsaWFzZWRfTWFjcm9zIEhBTCBPUEFNUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhQRCAgICAgICAgICAgICAgICBPUEFNUF9DU1JfT1BBWFBECisjZGVmaW5lIF9fT1BBTVBfQ1NSX1MzU0VMWCAgICAgICAgICAgICAgICBPUEFNUF9DU1JfUzNTRUxYCisjZGVmaW5lIF9fT1BBTVBfQ1NSX1M0U0VMWCAgICAgICAgICAgICAgICBPUEFNUF9DU1JfUzRTRUxYCisjZGVmaW5lIF9fT1BBTVBfQ1NSX1M1U0VMWCAgICAgICAgICAgICAgICBPUEFNUF9DU1JfUzVTRUxYCisjZGVmaW5lIF9fT1BBTVBfQ1NSX1M2U0VMWCAgICAgICAgICAgICAgICBPUEFNUF9DU1JfUzZTRUxYCisjZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhDQUxfTCAgICAgICAgICAgICBPUEFNUF9DU1JfT1BBWENBTF9MCisjZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhDQUxfSCAgICAgICAgICAgICBPUEFNUF9DU1JfT1BBWENBTF9ICisjZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhMUE0gICAgICAgICAgICAgICBPUEFNUF9DU1JfT1BBWExQTQorI2RlZmluZSBfX09QQU1QX0NTUl9BTExfU1dJVENIRVMgICAgICAgICAgT1BBTVBfQ1NSX0FMTF9TV0lUQ0hFUworI2RlZmluZSBfX09QQU1QX0NTUl9BTkFXU0VMWCAgICAgICAgICAgICAgT1BBTVBfQ1NSX0FOQVdTRUxYCisjZGVmaW5lIF9fT1BBTVBfQ1NSX09QQVhDQUxPVVQgICAgICAgICAgICBPUEFNUF9DU1JfT1BBWENBTE9VVAorI2RlZmluZSBfX09QQU1QX09GRlNFVF9UUklNX0JJVFNQT1NJVElPTiAgT1BBTVBfT0ZGU0VUX1RSSU1fQklUU1BPU0lUSU9OCisjZGVmaW5lIF9fT1BBTVBfT0ZGU0VUX1RSSU1fU0VUICAgICAgICAgICBPUEFNUF9PRkZTRVRfVFJJTV9TRVQKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9QV1JfQWxpYXNlZF9NYWNyb3MgSEFMIFBXUiBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1BWRF9FVkVOVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UCisjZGVmaW5lIF9fSEFMX1BWRF9FVkVOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0ZBTExJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFZNX0VWRU5UX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FVkVOVF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FVkVOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVZFTlRfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FWFRJX0ZBTExJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FWFRJX0ZBTExJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUFdSX0lOVEVSTkFMV0FLRVVQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVJbnRlcm5hbFdha2VVcExpbmUKKyNkZWZpbmUgX19IQUxfUFdSX0lOVEVSTkFMV0FLRVVQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUludGVybmFsV2FrZVVwTGluZQorI2RlZmluZSBfX0hBTF9QV1JfUFVMTF9VUF9ET1dOX0NPTkZJR19ESVNBQkxFICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnCisjZGVmaW5lIF9fSEFMX1BXUl9QVUxMX1VQX0RPV05fQ09ORklHX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRUdERV9UUklHR0VSKCkgICAgICAgICAgICAgICAgICBkbyB7IF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7X19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VWRU5UX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VWRU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0ZBTExJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1JJU0lOR1RSSUdHRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfU0VUX1JJU0lOR19FREdFX1RSSUdHRVIgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVk1fRElTQUJMRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgSEFMX1BXUkV4X0Rpc2FibGVQVk0xKCk7SEFMX1BXUkV4X0Rpc2FibGVQVk0yKCk7SEFMX1BXUkV4X0Rpc2FibGVQVk0zKCk7SEFMX1BXUkV4X0Rpc2FibGVQVk00KCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX19IQUxfUFdSX1BWTV9FTkFCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBIQUxfUFdSRXhfRW5hYmxlUFZNMSgpO0hBTF9QV1JFeF9FbmFibGVQVk0yKCk7SEFMX1BXUkV4X0VuYWJsZVBWTTMoKTtIQUxfUFdSRXhfRW5hYmxlUFZNNCgpOyB9IHdoaWxlKDApCisjZGVmaW5lIF9fSEFMX1BXUl9TUkFNMkNPTlRFTlRfUFJFU0VSVkVfRElTQUJMRSAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uCisjZGVmaW5lIF9fSEFMX1BXUl9TUkFNMkNPTlRFTlRfUFJFU0VSVkVfRU5BQkxFICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVTUkFNMkNvbnRlbnRSZXRlbnRpb24KKyNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVWZGRJTzIKKyNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVZkZElPMgorI2RlZmluZSBfX0hBTF9QV1JfVkRESU8yX0VYVElfQ0xFQVJfRUdERV9UUklHR0VSICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfVkRESU8yX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICAgX19IQUxfUFdSX1ZERElPMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1ZERFVTQl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVWZGRVU0IKKyNkZWZpbmUgX19IQUxfUFdSX1ZERFVTQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVZkZFVTQgorCisjaWYgZGVmaW5lZCAoU1RNMzJGNCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRU5BQkxFX0lUKFBXUl9FWFRJX0xJTkVfUFZEKSAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9ESVNBQkxFX0lUKFBXUl9FWFRJX0xJTkVfUFZEKSAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQoKQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9HRVRfRkxBRyhQV1JfRVhUSV9MSU5FX1BWRCkgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfQ0xFQVJfRkxBRyhQV1JfRVhUSV9MSU5FX1BWRCkgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9GTEFHKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VORVJBVEVfU1dJVChQV1JfRVhUSV9MSU5FX1BWRCkgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9HRU5FUkFURV9TV0lUKCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VORVJBVEVfU1dJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHCisjZW5kaWYgLyogU1RNMzJGNCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9SQ0NfQWxpYXNlZCBIQUwgUkNDIEFsaWFzZWQgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFJDQ19TdG9wV2FrZVVwQ2xvY2tfTVNJICAgICBSQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kKKyNkZWZpbmUgUkNDX1N0b3BXYWtlVXBDbG9ja19IU0kgICAgIFJDQ19TVE9QX1dBS0VVUENMT0NLX0hTSQorCisjZGVmaW5lIEhBTF9SQ0NfQ0NTQ2FsbGJhY2sgSEFMX1JDQ19DU1NDYWxsYmFjaworI2RlZmluZSBIQUxfUkM0OF9FbmFibGVCdWZmZXJfQ21kKGNtZCkgKCgoY21kKT09RU5BQkxFKSA/IEhBTF9SQ0NFeF9FbmFibGVIU0k0OF9WUkVGSU5UKCkgOiBIQUxfUkNDRXhfRGlzYWJsZUhTSTQ4X1ZSRUZJTlQoKSkKKworI2RlZmluZSBfX0FEQ19DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDX0NMS19FTkFCTEUgICAgICAgICAgIF9fSEFMX1JDQ19BRENfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRElTQUJMRSAgICBfX0hBTF9SQ0NfQURDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDX0NMS19TTEVFUF9FTkFCTEUgICAgIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQ19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfQURDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDX1JFTEVBU0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19BRENfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FEQzFfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzFfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMV9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19BREMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BREMxX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX0FEQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfQURDMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQURDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQURDM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQURDM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FFU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FFU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUVTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FFU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ1JZUF9DTEtfU0xFRVBfRU5BQkxFICAgICAgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NSWVBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfRU5BQkxFICBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JZUF9DTEtfRElTQUJMRSAgX19IQUxfUkNDX0NSWVBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DUllQX0ZPUkNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19DUllQX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ1JZUF9SRUxFQVNFX1JFU0VUICBfX0hBTF9SQ0NfQ1JZUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUZJT19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FGSU9fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQUZJT19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQUZJT19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FGSU9fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUZJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BSEJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BSEIzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BSEIzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BUEIyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19CS1BfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0JLUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0JLUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19CS1BfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0JLUF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQktQX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQktQX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0JLUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0NBTjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DQU5fQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQ0FOMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX0NBTjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DQU5fUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfQ0FOMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0FOMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NBTjJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0FOMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0FOMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NBTjJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0FOMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ0VDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DRUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DRUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ0VDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DT01QX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfQ09NUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0NPTVBfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19DT01QX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DT01QX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfQ09NUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NPTVBfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19DT01QX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DT01QX0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfQ09NUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ09NUF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0NPTVBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DRUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NFQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NFQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DRUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NSQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JDX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUkNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUkNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUkNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RBQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREFDX0NMS19FTkFCTEUgX19IQUxfUkNDX0RBQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fREFDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19EQUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREFDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQUMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREFDMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREFDMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19EQUMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREFDMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19EQUMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQkdNQ1VfQ0xLX0VOQUJMRSAgICAgX19IQUxfUkNDX0RCR01DVV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREJHTUNVX0NMS19ESVNBQkxFICAgICBfX0hBTF9SQ0NfREJHTUNVX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREJHTUNVX0ZPUkNFX1JFU0VUICAgIF9fSEFMX1JDQ19EQkdNQ1VfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19EQkdNQ1VfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX0RCR01DVV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREZTRE1fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREZTRE1fQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ERlNETV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19ERlNETV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19ERlNETV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RNQTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RNQTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RNQTJfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RNQTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRE1BMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRE1BMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRVRITUFDX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0VUSE1BQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0VUSE1BQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19FVEhNQUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNUWF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRklSRVdBTExfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRklSRVdBTExfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRklSRVdBTExfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZMQVNIX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRkxBU0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZMQVNIX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRkxBU0hfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRkxBU0hfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZMSVRGX0NMS19ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19GTElURl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZMSVRGX0NMS19FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19GTElURl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRkxJVEZfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0ZMSVRGX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRkxJVEZfUkVMRUFTRV9SRVNFVCAgICAgX19IQUxfUkNDX0ZMSVRGX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GTElURl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRkxJVEZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZMSVRGX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTElURl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRk1DX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZNQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fRk1DX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0ZNQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZNQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19GTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZTTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZTTUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GU01DX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZTTUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9BX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0FfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0FfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9CX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9CX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0JfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9DX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0NfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0NfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0NfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9EX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9EX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0RfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9FX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9FX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0VfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9FX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0VfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0VfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9GX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9GX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPRl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0ZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9GX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0ZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0ZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9HX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9HX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0dfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9HX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0dfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0dfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9IX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9IX0NMS19FTkFCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0hfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0dQSU9IX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0hfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfR1BJT0hfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMxX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMyX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0kyQzNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMzX0NMS19FTkFCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0kyQzNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19JMkMzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0kyQzNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0kyQzNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0kyQzNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19JMkMzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0kyQzNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xDRF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTENEX0NMS19FTkFCTEUgX19IQUxfUkNDX0xDRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTENEX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MQ0RfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MQ0RfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xDRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xDRF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MQ0RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0xX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0yX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MUFRJTTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVElNMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xQVElNMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19FTkFCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0xQVUFSVDFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19MUFVBUlQxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0xQVUFSVDFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09QQU1QX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX09QQU1QX0NMS19FTkFCTEUgX19IQUxfUkNDX09QQU1QX0NMS19FTkFCTEUKKyNkZWZpbmUgX19PUEFNUF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PUEFNUF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fT1BBTVBfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09QQU1QX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fT1BBTVBfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfT1BBTVBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0ZTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfRElTQUJMRQorI2RlZmluZSBfX09UR0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19PVEdGU19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdGU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fT1RHRlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX09UR0ZTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fT1RHRlNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfT1RHRlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1BXUl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fUFdSX0NMS19FTkFCTEUgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fUFdSX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19QV1JfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19QV1JfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1BXUl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1BXUl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19QV1JfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1FTUElfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1FTUElfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19RU1BJX0NMS19FTkFCTEUgX19IQUxfUkNDX1FTUElfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19RU1BJX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1FTUElfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19RU1BJX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1FTUElfUkVMRUFTRV9SRVNFVAorCisjaWYgZGVmaW5lZChTVE0zMldCKQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfRElTQUJMRSAgICAgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUgICAgICAgICAgICAgX19IQUxfUkNDX1FVQURTUElfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRElTQUJMRSAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX1FVQURTUElfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9GT1JDRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1FVQURTUElfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfRU5BQkxFRCAgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19ESVNBQkxFRCAgICAgICAgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19TTEVFUF9FTkFCTEVEICAgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgUVNQSV9JUlFIYW5kbGVyIFFVQURTUElfSVJRSGFuZGxlcgorI2VuZGlmIC8qIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUgKi8KKworI2RlZmluZSBfX1JOR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fUk5HX0NMS19FTkFCTEUgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFCisjZGVmaW5lIF9fUk5HX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19STkdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19STkdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1JOR19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1JOR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19STkdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NBSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NBSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NBSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TQUkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NBSTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NBSTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NBSTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TQUkyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NBSTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NBSTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NBSTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TQUkyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NBSTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19FTkFCTEUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX1NETU1DX0NMS19FTkFCTEUgX19IQUxfUkNDX1NETU1DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU0RNTUNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NETU1DX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RNTUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfU0RNTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkyX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkzX0NMS19FTkFCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEkzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NQSTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NQSTNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEkzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NQSTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NSQU1fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1NSQU1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUkFNX0NMS19FTkFCTEUgX19IQUxfUkNDX1NSQU1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NSQU0xX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NSQU0xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1NSQU0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUkFNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1JBTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUkFNMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NXUE1JMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1dQTUkxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1dQTUkxX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NXUE1JMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NZU0NGR19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NZU0NGR19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfU1lTQ0ZHX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1lTQ0ZHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NZU0NGR19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTBfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEwX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEwX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEwX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTExX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTEyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTEyX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTEzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTEzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTEzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTEzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE1X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE1X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE2X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE2X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xNl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE2X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTZfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE3X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE3X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xN19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xN19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTE3X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0zX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0zX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0zX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU00X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTRfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU00X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU00X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTVfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU01X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU01X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU01X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTZfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU02X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU02X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTZfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU02X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU03X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU03X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU03X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTThfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU04X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTThfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTThfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU04X0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTThfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTThfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTThfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU04X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTThfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTlfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU05X0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTlfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTlfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTlfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU05X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTlfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RTQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVFNDX0NMS19FTkFCTEUgX19IQUxfUkNDX1RTQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVFNDX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19UU0NfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19UU0NfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RTQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RTQ19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19UU0NfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ0X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ0X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDRfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDRfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ1X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ1X0NMS19FTkFCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDVfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDVfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQxX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQyX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUM19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQzX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1VTQVJUM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNF9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1VBUlQ0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNF9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNF9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VBUlQ0X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ0X1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfVUFSVDRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1VBUlQ1X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNV9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNV9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VBUlQ1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ1X1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfVUFSVDVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUN19DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1VBUlQ3X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ3X0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUN19GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VBUlQ3X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ3X1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfVUFSVDdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUOF9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ4X0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUOF9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ4X1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfVUFSVDhfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19VU0JfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0JfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVVNCX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfVVNCX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVVNCX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNCX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19FTkFCTEUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19VU0JfUkVMRUFTRV9SRVNFVAorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRElTQUJMRSAgIF9fSEFMX1JDQ19XV0RHMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFICAgX19IQUxfUkNDX1dXREcxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19XV0RHMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfV1dERzFfQ0xLX1NMRUVQX0VOQUJMRQorCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUICAgICgodm9pZCkwVSkgIC8qIE5vdCBhdmFpbGFibGUgb24gdGhlIFNUTTMySDcqLworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19SRUxFQVNFX1JFU0VUICgodm9pZCkwVSkgLyogTm90IGF2YWlsYWJsZSBvbiB0aGUgU1RNMzJINyovCisKKworI2RlZmluZSAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0VOQUJMRUQgICAgX19IQUxfUkNDX1dXREcxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRElTQUJMRUQgIF9fSEFMX1JDQ19XV0RHMV9JU19DTEtfRElTQUJMRUQKKyNlbmRpZgorCisjZGVmaW5lIF9fV1dER19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFCisjZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fV1dER19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1dXREdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfV1dER19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19USU0yMV9DTEtfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMV9DTEtfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTIxX0ZPUkNFX1JFU0VUICAgX19IQUxfUkNDX1RJTTIxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1RJTTIxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMV9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0yMV9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTIyX0NMS19FTkFCTEUgICBfX0hBTF9SQ0NfVElNMjJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTIyX0NMS19ESVNBQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMjJfRk9SQ0VfUkVTRVQgICBfX0hBTF9SQ0NfVElNMjJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMl9SRUxFQVNFX1JFU0VUICBfX0hBTF9SQ0NfVElNMjJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTIyX0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfVElNMjJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTIyX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NSU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSU19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NSU19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQ1JTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ1JTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NSU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRQorI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFCisKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0ZPUkNFX1JFU0VUICBfX0hBTF9SQ0NfVVNCX09UR19GU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQl9PVEdfRlNfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1VTQl9PVEdfRlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19DTEtfRElTQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0hTX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU05X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1RJTTlfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTlfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU05X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xMF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEwX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTExX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xMV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTExX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUFRQX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFTSF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQVNIX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFTSF9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0hBU0hfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19IQVNIX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFTSF9DTEtfRElTQUJMRSAgICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJNV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEk1X0NMS19ESVNBQkxFICAgICAgICAgICAgICBfX0hBTF9SQ0NfU1BJNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTVfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1NQSTVfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEk1X1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1NQSTVfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk2X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk2X0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNl9SRUxFQVNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1NQSTZfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19MVERDX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0xURENfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xURENfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0xURENfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19MVERDX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFREQ19SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19MVERDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MVERDX0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0xURENfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19FVEhNQUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0VUSE1BQ1JYX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVElNMTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNMTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVElNMTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNMTNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVElNMTRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTE0X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNMTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0JLUFNSQU1fQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfQktQU1JBTV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NDTURBVEFSQU1FTl9DTEtfRU5BQkxFICBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19FTkFCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19DQ01EQVRBUkFNRU5fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDZfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVVNBUlQ2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDZfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNl9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNl9SRUxFQVNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfVVNBUlQ2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNBUlQ2X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEk0X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJNF9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTRfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1NQSTRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NQSTRfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19TUEk0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9JX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0lfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSV9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0lfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19HUElPSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0dQSU9JX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0pfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPSl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0dQSU9KX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX0dQSU9KX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0pfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0pfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPSl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0pfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPSl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9LX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9LX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0tfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPS19SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19HUElPS19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0dQSU9LX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0dQSU9LX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRIX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0VUSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRVRIX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19FVEhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0RDTUlfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RDTUlfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0RDTUlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19EQ01JX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRENNSV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQ01JX0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfRENNSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRENNSV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0RDTUlfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUN19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1VBUlQ3X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDdfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVUFSVDdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ3X0ZPUkNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19VQVJUN19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ3X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VQVJUN19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUN19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ4X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VQVJUOF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUOF9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUOF9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VQVJUOF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VBUlQ4X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fT1RHSFNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX09UR0hTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0hTX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fT1RHSFNfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVVNCX09UR19IU19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fT1RHSFNVTFBJX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19JU19DTEtfU0xFRVBfRU5BQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0NMS19TTEVFUF9FTkFCTEUgICAgICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRElTQUJMRSAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0lTX0NMS19TTEVFUF9FTkFCTEVEICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0lTX0NMS19TTEVFUF9FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU1VMUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVECisjZGVmaW5lIF9fU1JBTTNfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICBfX0hBTF9SQ0NfU1JBTTNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NBTjJfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX0NBTjJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NBTjJfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX0NBTjJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19EQUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RBQ19DTEtfU0xFRVBfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0RBQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX0FEQzJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0FEQzJfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX0FEQzJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BREMzX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19BREMzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMzX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19BREMzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRlNNQ19GT1JDRV9SRVNFVCAgICAgICAgICAgICBfX0hBTF9SQ0NfRlNNQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZTTUNfUkVMRUFTRV9SRVNFVCAgICAgICAgICAgX19IQUxfUkNDX0ZTTUNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0ZTTUNfQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX0ZTTUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZTTUNfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX0ZTTUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0ZPUkNFX1JFU0VUICAgICAgICAgICAgIF9fSEFMX1JDQ19TRElPX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RJT19SRUxFQVNFX1JFU0VUICAgICAgICAgICBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RJT19DTEtfU0xFRVBfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RNQTJEX0NMS19FTkFCTEUgICAgICAgICAgICAgX19IQUxfUkNDX0RNQTJEX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfRElTQUJMRSAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RNQTJEX0ZPUkNFX1JFU0VUICAgICAgICAgICAgX19IQUxfUkNDX0RNQTJEX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fRE1BMkRfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRE1BMkRfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RNQTJEX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX0RNQTJEX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfU0xFRVBfRElTQUJMRSAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfU0xFRVBfRElTQUJMRQorCisvKiBhbGlhcyBkZWZpbmUgbWFpbnRhaW5lZCBmb3IgbGVnYWN5ICovCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdGU19GT1JDRV9SRVNFVCAgICBfX0hBTF9SQ0NfVVNCX09UR19GU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1VTQl9PVEdfRlNfUkVMRUFTRV9SRVNFVAorCisjZGVmaW5lIF9fQURDMTJfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzEyX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0FEQzEyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQURDMzRfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQURDMzRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzM0X0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0FEQzM0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fREFDMl9DTEtfRU5BQkxFICAgICAgICAgICBfX0hBTF9SQ0NfREFDMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREFDMl9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfREFDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE4X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1RJTTE4X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xOF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19USU0xOF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTE5X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1RJTTE5X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xOV9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19USU0xOV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTIwX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1RJTTIwX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19USU0yMF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX0hSVElNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSFJUSU0xX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfSFJUSU0xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RBREMxX0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfU0RBREMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TREFEQzJfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TREFEQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NEQURDM19DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1NEQURDM19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMxX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfU0RBREMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RBREMyX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RBREMzX0NMS19ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfU0RBREMzX0NMS19ESVNBQkxFCisKKyNkZWZpbmUgX19BREMxMl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzEyX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0FEQzEyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BREMzNF9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19BREMzNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzM0X1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0FEQzM0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQUMyX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19EQUMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREFDMl9SRUxFQVNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfREFDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMThfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfVElNMThfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xOF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19USU0xOF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTlfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfVElNMTlfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xOV9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19USU0xOV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfVElNMjBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19USU0yMF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSFJUSU0xX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfSFJUSU0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSFJUSU0xX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfSFJUSU0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzFfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TREFEQzFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzJfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TREFEQzJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzNfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TREFEQzNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzFfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19TREFEQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NEQURDMl9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1NEQURDMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMzX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfU0RBREMzX1JFTEVBU0VfUkVTRVQKKworI2RlZmluZSBfX0FEQzFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0FEQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19BREMxX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19BREMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0FEQzEyX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMTJfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfQURDMTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQURDMzRfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19BREMzNF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19BREMzNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19DRUNfSVNfQ0xLX0VOQUJMRUQgICAgICAgIF9fSEFMX1JDQ19DRUNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19DRUNfSVNfQ0xLX0RJU0FCTEVEICAgICAgIF9fSEFMX1JDQ19DRUNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQ1JDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ1JDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfQ1JDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RBQzFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19EQUMxX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RBQzJfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0RBQzJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19EQUMyX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RNQTFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19ETUExX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19ETUExX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0RNQTJfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19ETUEyX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0ZMSVRGX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRkxJVEZfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfRkxJVEZfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fRk1DX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfRk1DX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRk1DX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfRk1DX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0FfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPQl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9DX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0RfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPRV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPRV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9GX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0dfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0dfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPSF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IUlRJTTFfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19IUlRJTTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSTJDMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0kyQzFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSTJDMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSTJDM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfSTJDM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fUFdSX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfUFdSX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fUFdSX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NZU0NGR19JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NZU0NGR19JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEkxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEkyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEkzX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19TUEkzX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJM19JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUEk0X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19TUEk0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1BJNF9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TREFEQzFfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzFfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TREFEQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMyX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfU0RBREMyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU0RBREMyX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfU0RBREMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NEQURDM19JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1NEQURDM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NEQURDM19JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1NEQURDM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TUkFNX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19TUkFNX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU1JBTV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU0xX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0yX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0zX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU0zX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNM19JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU00X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU00X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNNF9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU01X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU01X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNNV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU02X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU02X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNNl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU03X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU03X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNN19JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNN19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU04X0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19USU04X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNOF9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNOF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xMl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTEyX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTEzX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTNfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTRfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xNF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xNV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE1X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE2X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTZfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTdfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xN19JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xOF9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE4X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE4X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE5X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTlfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTlfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMjBfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0yMF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0yMF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19UU0NfSVNfQ0xLX0VOQUJMRUQgICAgICAgIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19UU0NfSVNfQ0xLX0RJU0FCTEVEICAgICAgIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VQVJUNF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19VQVJUNF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VBUlQ1X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1VBUlQ1X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUMV9JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VTQVJUMV9JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19VU0FSVDJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVVNBUlQzX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQzX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQl9JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX1VTQl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VTQl9JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX1VTQl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19XV0RHX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fV1dER19JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRElTQUJMRUQKKworI2lmIGRlZmluZWQoU1RNMzJMMSkKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfQUVTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FFU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfU0xFRVBfRU5BQkxFICAgIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19BRVNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfQUVTX1JFTEVBU0VfUkVTRVQKKyNlbmRpZiAvKiBTVE0zMkwxICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfRk9SQ0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUICAgICBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRSAgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0VOQUJMRUQgICAgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQgICBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2RtbWMxQ2xvY2tTZWxlY3Rpb24gICAgICAgICAgICAgICBTZGlvQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19TRE1NQzEgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1NESU8KKyNkZWZpbmUgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OCAgICAgICAgICBSQ0NfU0RJT0NMS1NPVVJDRV9DSzQ4CisjZGVmaW5lIFJDQ19TRE1NQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICAgUkNDX1NESU9DTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHICAgICAgICAgICAgX19IQUxfUkNDX1NESU9fQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RNTUMxX1NPVVJDRSAgICAgICAgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1NETU1DMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgU2Rpb0Nsb2NrU2VsZWN0aW9uICAgICAgICAgICAgICAgICBTZG1tYzFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NESU8gICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfU0RNTUMxCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0NPTkZJRyAgICAgICAgICAgICAgX19IQUxfUkNDX1NETU1DMV9DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TRElPX1NPVVJDRSAgICAgICAgICBfX0hBTF9SQ0NfR0VUX1NETU1DMV9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9DTEs0OCAgICAgICAgICAgICBSQ0NfU0RNTUMxQ0xLU09VUkNFX0NMSzQ4CisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgUkNDX1NETU1DMUNMS1NPVVJDRV9TWVNDTEsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX0RJU0FCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19SRUxFQVNFX1JFU0VUKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRU5BQkxFKCkgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpICAgICAgICAgICAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfVUxQSV9DTEtfRElTQUJMRSgpICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19VTFBJX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19GT1JDRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfU0xFRVBfRElTQUJMRSgpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJTQ0xLICAgICAgICAgICAgX19IQUxfUkNDX0kyU19DT05GSUcKKyNkZWZpbmUgX19IQUxfUkNDX0kyU0NMS19DT05GSUcgICAgIF9fSEFMX1JDQ19JMlNfQ09ORklHCisKKyNkZWZpbmUgX19SQ0NfUExMU1JDICAgICAgICAgICAgICAgIFJDQ19HRVRfUExMX09TQ1NPVVJDRQorCisjZGVmaW5lIElTX1JDQ19NU0lSQU5HRSAgICAgICAgICAgICBJU19SQ0NfTVNJX0NMT0NLX1JBTkdFCisjZGVmaW5lIElTX1JDQ19SVENDTEtfU09VUkNFICAgICAgICBJU19SQ0NfUlRDQ0xLU09VUkNFCisjZGVmaW5lIElTX1JDQ19TWVNDTEtfRElWICAgICAgICAgICBJU19SQ0NfSENMSworI2RlZmluZSBJU19SQ0NfSENMS19ESVYgICAgICAgICAgICAgSVNfUkNDX1BDTEsKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMSyAgICAgICAgICAgIElTX1JDQ19QRVJJUEhDTE9DSworCisjZGVmaW5lIFJDQ19JVF9IU0kxNCAgICAgICAgICAgICAgICBSQ0NfSVRfSFNJMTRSRFkKKworI2RlZmluZSBSQ0NfSVRfQ1NTTFNFICAgICAgICAgICAgICAgUkNDX0lUX0xTRUNTUworI2RlZmluZSBSQ0NfSVRfQ1NTSFNFICAgICAgICAgICAgICAgUkNDX0lUX0NTUworCisjZGVmaW5lIFJDQ19QTExNVUxfMyAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDMKKyNkZWZpbmUgUkNDX1BMTE1VTF80ICAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNAorI2RlZmluZSBSQ0NfUExMTVVMXzYgICAgICAgICAgICAgICAgUkNDX1BMTF9NVUw2CisjZGVmaW5lIFJDQ19QTExNVUxfOCAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDgKKyNkZWZpbmUgUkNDX1BMTE1VTF8xMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTIKKyNkZWZpbmUgUkNDX1BMTE1VTF8xNiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMTYKKyNkZWZpbmUgUkNDX1BMTE1VTF8yNCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMjQKKyNkZWZpbmUgUkNDX1BMTE1VTF8zMiAgICAgICAgICAgICAgIFJDQ19QTExfTVVMMzIKKyNkZWZpbmUgUkNDX1BMTE1VTF80OCAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNDgKKworI2RlZmluZSBSQ0NfUExMRElWXzIgICAgICAgICAgICAgICAgUkNDX1BMTF9ESVYyCisjZGVmaW5lIFJDQ19QTExESVZfMyAgICAgICAgICAgICAgICBSQ0NfUExMX0RJVjMKKyNkZWZpbmUgUkNDX1BMTERJVl80ICAgICAgICAgICAgICAgIFJDQ19QTExfRElWNAorCisjZGVmaW5lIElTX1JDQ19NQ09TT1VSQ0UgICAgICAgICAgICBJU19SQ0NfTUNPMVNPVVJDRQorI2RlZmluZSBfX0hBTF9SQ0NfTUNPX0NPTkZJRyAgICAgICAgX19IQUxfUkNDX01DTzFfQ09ORklHCisjZGVmaW5lIFJDQ19NQ09fTk9ESVYgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzEKKyNkZWZpbmUgUkNDX01DT19ESVYxICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMQorI2RlZmluZSBSQ0NfTUNPX0RJVjIgICAgICAgICAgICAgICAgUkNDX01DT0RJVl8yCisjZGVmaW5lIFJDQ19NQ09fRElWNCAgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzQKKyNkZWZpbmUgUkNDX01DT19ESVY4ICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfOAorI2RlZmluZSBSQ0NfTUNPX0RJVjE2ICAgICAgICAgICAgICAgUkNDX01DT0RJVl8xNgorI2RlZmluZSBSQ0NfTUNPX0RJVjMyICAgICAgICAgICAgICAgUkNDX01DT0RJVl8zMgorI2RlZmluZSBSQ0NfTUNPX0RJVjY0ICAgICAgICAgICAgICAgUkNDX01DT0RJVl82NAorI2RlZmluZSBSQ0NfTUNPX0RJVjEyOCAgICAgICAgICAgICAgUkNDX01DT0RJVl8xMjgKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9OT05FICAgICAgICAgIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0xTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0xTRSAgICAgICAgICAgUkNDX01DTzFTT1VSQ0VfTFNFCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTSTE0ICAgICAgICAgUkNDX01DTzFTT1VSQ0VfSFNJMTQKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0k0OCAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSTQ4CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNFICAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9IU0UKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9QTExDTEtfRElWMSAgIFJDQ19NQ08xU09VUkNFX1BMTENMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19OT0RJViAgUkNDX01DTzFTT1VSQ0VfUExMQ0xLCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjIgICBSQ0NfTUNPMVNPVVJDRV9QTExDTEtfRElWMgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyAgICAgUkNDX1JUQ0NMS1NPVVJDRV9OT05FCisjZWxpZiBkZWZpbmVkKFNUTTMyV0IpIHx8IGRlZmluZWQoU1RNMzJHMCkKKyNlbHNlCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAgICAgICBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSworI2VuZGlmCisKKyNkZWZpbmUgUkNDX1VTQkNMS19QTExTQUkxICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMU0FJMQorI2RlZmluZSBSQ0NfVVNCQ0xLX1BMTCAgICAgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQkNMS19NU0kgICAgICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfTVNJCisjZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMQ0xLICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTAorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjEgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYxXzUgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjFfNQorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjIgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMgorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjMgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMworCisjZGVmaW5lIEhTSU9OX0JpdE51bWJlciAgICAgICAgUkNDX0hTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSFNJT05fQklUTlVNQkVSICAgICAgICBSQ0NfSFNJT05fQklUX05VTUJFUgorI2RlZmluZSBIU0VPTl9CaXROdW1iZXIgICAgICAgIFJDQ19IU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEhTRU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0hTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTVNJT05fQklUTlVNQkVSICAgICAgICBSQ0NfTVNJT05fQklUX05VTUJFUgorI2RlZmluZSBDU1NPTl9CaXROdW1iZXIgICAgICAgIFJDQ19DU1NPTl9CSVRfTlVNQkVSCisjZGVmaW5lIENTU09OX0JJVE5VTUJFUiAgICAgICAgUkNDX0NTU09OX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMT05fQml0TnVtYmVyICAgICAgICBSQ0NfUExMT05fQklUX05VTUJFUgorI2RlZmluZSBQTExPTl9CSVROVU1CRVIgICAgICAgIFJDQ19QTExPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTEkyU09OX0JpdE51bWJlciAgICAgUkNDX1BMTEkyU09OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSTJTU1JDX0JpdE51bWJlciAgICAgICBSQ0NfSTJTU1JDX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDRU5fQml0TnVtYmVyICAgICAgICBSQ0NfUlRDRU5fQklUX05VTUJFUgorI2RlZmluZSBSVENFTl9CSVROVU1CRVIgICAgICAgIFJDQ19SVENFTl9CSVRfTlVNQkVSCisjZGVmaW5lIEJEUlNUX0JpdE51bWJlciAgICAgICAgUkNDX0JEUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgQkRSU1RfQklUTlVNQkVSICAgICAgICBSQ0NfQkRSU1RfQklUX05VTUJFUgorI2RlZmluZSBSVENSU1RfQklUTlVNQkVSICAgICAgIFJDQ19SVENSU1RfQklUX05VTUJFUgorI2RlZmluZSBMU0lPTl9CaXROdW1iZXIgICAgICAgIFJDQ19MU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTSU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0xTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNFT05fQml0TnVtYmVyICAgICAgICBSQ0NfTFNFT05fQklUX05VTUJFUgorI2RlZmluZSBMU0VPTl9CSVROVU1CRVIgICAgICAgIFJDQ19MU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTRUJZUF9CSVROVU1CRVIgICAgICAgUkNDX0xTRUJZUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTFNBSU9OX0JpdE51bWJlciAgICAgUkNDX1BMTFNBSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgVElNUFJFX0JpdE51bWJlciAgICAgICBSQ0NfVElNUFJFX0JJVF9OVU1CRVIKKyNkZWZpbmUgUk1WRl9CaXROdW1iZXIgICAgICAgICBSQ0NfUk1WRl9CSVRfTlVNQkVSCisjZGVmaW5lIFJNVkZfQklUTlVNQkVSICAgICAgICAgUkNDX1JNVkZfQklUX05VTUJFUgorI2RlZmluZSBSQ0NfQ1IyX0hTSTE0VFJJTV9CaXROdW1iZXIgUkNDX0hTSTE0VFJJTV9CSVRfTlVNQkVSCisjZGVmaW5lIENSX0JZVEUyX0FERFJFU1MgICAgICAgUkNDX0NSX0JZVEUyX0FERFJFU1MKKyNkZWZpbmUgQ0lSX0JZVEUxX0FERFJFU1MgICAgICBSQ0NfQ0lSX0JZVEUxX0FERFJFU1MKKyNkZWZpbmUgQ0lSX0JZVEUyX0FERFJFU1MgICAgICBSQ0NfQ0lSX0JZVEUyX0FERFJFU1MKKyNkZWZpbmUgQkRDUl9CWVRFMF9BRERSRVNTICAgICBSQ0NfQkRDUl9CWVRFMF9BRERSRVNTCisjZGVmaW5lIERCUF9USU1FT1VUX1ZBTFVFICAgICAgUkNDX0RCUF9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIExTRV9USU1FT1VUX1ZBTFVFICAgICAgUkNDX0xTRV9USU1FT1VUX1ZBTFVFCisKKyNkZWZpbmUgQ1JfSFNJT05fQkIgICAgICAgICAgICBSQ0NfQ1JfSFNJT05fQkIKKyNkZWZpbmUgQ1JfQ1NTT05fQkIgICAgICAgICAgICBSQ0NfQ1JfQ1NTT05fQkIKKyNkZWZpbmUgQ1JfUExMT05fQkIgICAgICAgICAgICBSQ0NfQ1JfUExMT05fQkIKKyNkZWZpbmUgQ1JfUExMSTJTT05fQkIgICAgICAgICBSQ0NfQ1JfUExMSTJTT05fQkIKKyNkZWZpbmUgQ1JfTVNJT05fQkIgICAgICAgICAgICBSQ0NfQ1JfTVNJT05fQkIKKyNkZWZpbmUgQ1NSX0xTSU9OX0JCICAgICAgICAgICBSQ0NfQ1NSX0xTSU9OX0JCCisjZGVmaW5lIENTUl9MU0VPTl9CQiAgICAgICAgICAgUkNDX0NTUl9MU0VPTl9CQgorI2RlZmluZSBDU1JfTFNFQllQX0JCICAgICAgICAgIFJDQ19DU1JfTFNFQllQX0JCCisjZGVmaW5lIENTUl9SVENFTl9CQiAgICAgICAgICAgUkNDX0NTUl9SVENFTl9CQgorI2RlZmluZSBDU1JfUlRDUlNUX0JCICAgICAgICAgIFJDQ19DU1JfUlRDUlNUX0JCCisjZGVmaW5lIENGR1JfSTJTU1JDX0JCICAgICAgICAgUkNDX0NGR1JfSTJTU1JDX0JCCisjZGVmaW5lIEJEQ1JfUlRDRU5fQkIgICAgICAgICAgUkNDX0JEQ1JfUlRDRU5fQkIKKyNkZWZpbmUgQkRDUl9CRFJTVF9CQiAgICAgICAgICBSQ0NfQkRDUl9CRFJTVF9CQgorI2RlZmluZSBDUl9IU0VPTl9CQiAgICAgICAgICAgIFJDQ19DUl9IU0VPTl9CQgorI2RlZmluZSBDU1JfUk1WRl9CQiAgICAgICAgICAgIFJDQ19DU1JfUk1WRl9CQgorI2RlZmluZSBDUl9QTExTQUlPTl9CQiAgICAgICAgIFJDQ19DUl9QTExTQUlPTl9CQgorI2RlZmluZSBEQ0tDRkdSX1RJTVBSRV9CQiAgICAgIFJDQ19EQ0tDRkdSX1RJTVBSRV9CQgorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0ZSRVFfRVJST1JfQ09VTlRFUiAgICAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9GUkVRX0VSUk9SX0NPVU5URVIgICAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9BVVRPTUFUSUNfQ0FMSUIgICAgICAgIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfQVVUT01BVElDX0NBTElCICAgICAgIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgICAgICAgICBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURQorCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSVRfU09VUkNFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUkNDX0dFVF9JVAorCisjZGVmaW5lIFJDQ19DUlNfU1lOQ1dBUk0gICAgICAgUkNDX0NSU19TWU5DV0FSTgorI2RlZmluZSBSQ0NfQ1JTX1RSSU1PViAgICAgICAgIFJDQ19DUlNfVFJJTU9WRgorCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQ0s0OCAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQ0xLNDgKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMUSAgICAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTFEKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMU0FJUCAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTFNBSVAKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMSTJTUSAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTEkyU1EKKyNkZWZpbmUgSVNfUkNDX0NLNDhDTEtTT1VSQ0UgICAgICAgICAgICAgSVNfUkNDX0NMSzQ4Q0xLU09VUkNFCisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX0NLNDggICAgICAgICAgIFJDQ19TRElPQ0xLU09VUkNFX0NMSzQ4CisKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19FTkFCTEUgICAgICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfRElTQUJMRSAgICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19FTkFCTEVEICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX0RJU0FCTEVEICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQgICAgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0VOQUJMRSAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX1NMRUVQX0VOQUJMRUQgICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19TTEVFUF9FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfU0xFRVBfRElTQUJMRUQgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVECisjZGVmaW5lIERmc2RtQ2xvY2tTZWxlY3Rpb24gICAgICAgICBEZnNkbTFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0RGU0RNICAgICAgICAgUkNDX1BFUklQSENMS19ERlNETTEKKyNkZWZpbmUgUkNDX0RGU0RNQ0xLU09VUkNFX1BDTEsgICAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0RGU0RNQ0xLU09VUkNFX1NZU0NMSyAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DT05GSUcgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0RGU0RNX1NPVVJDRSAgX19IQUxfUkNDX0dFVF9ERlNETTFfU09VUkNFCisjZGVmaW5lIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19TV1BNSTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfU1dQTUkxQ0xLU09VUkNFX1BDTEsxCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxCisjZGVmaW5lIFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSyAgICBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxCisKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjEgICAgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjIgICAgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjEgICAgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjIgICAgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9BUEIyICAgICAgICAgICAgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLMgorI2RlZmluZSBSQ0NfREZTRE0yQ0xLU09VUkNFX0FQQjIgICAgICAgICAgICBSQ0NfREZTRE0yQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19GTVBJMkMxQ0xLU09VUkNFX0FQQiAgICAgICAgICAgIFJDQ19GTVBJMkMxQ0xLU09VUkNFX1BDTEsxCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JOR19BbGlhc2VkX01hY3JvcyBIQUwgUk5HIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9STkdfUmVhZHlDYWxsYmFjayhfX0hBTkRMRV9fKSAgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjaygoX19IQU5ETEVfXyksIHVpbnQzMl90IHJhbmRvbTMyYml0KQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9NYWNyb3MgSEFMIFJUQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJHMCkgfHwgZGVmaW5lZCAoU1RNMzJMNDEyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDQyMnh4KQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRworI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JUQ19ESVNBQkxFX0lUICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUlRDX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfRU5BQkxFX0lUCisKKyNpZiBkZWZpbmVkIChTVE0zMkYxKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICBfX0hBTF9SVENfQUxBUk1fRVhUSV9DTEVBUl9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFVF9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpCisjZWxzZQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpID8gX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoX19FWFRJX0xJTkVfXykgICAoKChfX0VYVElfTElORV9fKSAgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfSVQoKSkpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKF9fRVhUSV9MSU5FX18pICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRygpKSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgOiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfR0VORVJBVEVfU1dJVCgpKSkKKyNlbmRpZiAgIC8qIFNUTTMyRjEgKi8KKworI2RlZmluZSBJU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfQUxBUk0KKyNkZWZpbmUgSVNfQUxBUk1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX0FMQVJNX01BU0sKKyNkZWZpbmUgSVNfVEFNUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUgorI2RlZmluZSBJU19UQU1QRVJfRVJBU0VfTU9ERSAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX0VSQVNFX01PREUKKyNkZWZpbmUgSVNfVEFNUEVSX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9GSUxURVIKKyNkZWZpbmUgSVNfVEFNUEVSX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgSVNfVEFNUEVSX01BU0tGTEFHX1NUQVRFICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9NQVNLRkxBR19TVEFURQorI2RlZmluZSBJU19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTgorI2RlZmluZSBJU19UQU1QRVJfUFVMTFVQX1NUQVRFICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BVTExVUF9TVEFURQorI2RlZmluZSBJU19UQU1QRVJfU0FNUExJTkdfRlJFUSAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVEKKyNkZWZpbmUgSVNfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTiAgICAgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04KKyNkZWZpbmUgSVNfVEFNUEVSX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9UUklHR0VSCisjZGVmaW5lIElTX1dBS0VVUF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1JUQ19XQUtFVVBfQ0xPQ0sKKyNkZWZpbmUgSVNfV0FLRVVQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1dBS0VVUF9DT1VOVEVSCisKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TRF9BbGlhc2VkX01hY3JvcyBIQUwgU0QgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFNEX09DUl9DSURfQ1NEX09WRVJXUklFVEUgICBTRF9PQ1JfQ0lEX0NTRF9PVkVSV1JJVEUKKyNkZWZpbmUgU0RfQ01EX1NEX0FQUF9TVEFVUyAgICAgICAgIFNEX0NNRF9TRF9BUFBfU1RBVFVTCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikKKyNkZWZpbmUgIFNEX1NETU1DX0RJU0FCTEVEICAgICAgICAgIFNEX1NESU9fRElTQUJMRUQKKyNkZWZpbmUgIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kgICAgIFNEX1NESU9fRlVOQ1RJT05fQlVTWQorI2RlZmluZSAgU0RfU0RNTUNfRlVOQ1RJT05fRkFJTEVEICAgU0RfU0RJT19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04gIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTgorI2RlZmluZSAgU0RfQ01EX1NETU1DX1NFTl9PUF9DT05EICAgU0RfQ01EX1NESU9fU0VOX09QX0NPTkQKKyNkZWZpbmUgIFNEX0NNRF9TRE1NQ19SV19ESVJFQ1QgICAgIFNEX0NNRF9TRElPX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVEICAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0VOQUJMRSAgICAgIF9fSEFMX1NEX1NESU9fRU5BQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19ESVNBQkxFICAgICBfX0hBTF9TRF9TRElPX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRE1BX0RJU0FCTEUgX19IQUxfU0RfU0RJT19ETUFfRElTQUJMCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQgICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVCAgX19IQUxfU0RfU0RJT19ESVNBQkxFX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19HRVRfRkxBRyAgICBfX0hBTF9TRF9TRElPX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0dFVF9JVCAgICAgIF9fSEFMX1NEX1NESU9fR0VUX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9JVCAgICBfX0hBTF9TRF9TRElPX0NMRUFSX0lUCisjZGVmaW5lICBTRE1NQ19TVEFUSUNfRkxBR1MgICAgICAgICBTRElPX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RNTUNfQ01EMFRJTUVPVVQgICAgICAgICAgU0RJT19DTUQwVElNRU9VVAorI2RlZmluZSAgU0RfU0RNTUNfU0VORF9JRl9DT05EICAgICAgU0RfU0RJT19TRU5EX0lGX0NPTkQKKy8qIGFsaWFzIENNU0lTICovCisjZGVmaW5lICBTRE1NQzFfSVJRbiAgICAgICAgICAgICAgICBTRElPX0lSUW4KKyNkZWZpbmUgIFNETU1DMV9JUlFIYW5kbGVyICAgICAgICAgIFNESU9fSVJRSGFuZGxlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgIFNEX1NESU9fRElTQUJMRUQgICAgICAgICAgIFNEX1NETU1DX0RJU0FCTEVECisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0JVU1kgICAgICBTRF9TRE1NQ19GVU5DVElPTl9CVVNZCisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0ZBSUxFRCAgICBTRF9TRE1NQ19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTiAgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04KKyNkZWZpbmUgIFNEX0NNRF9TRElPX1NFTl9PUF9DT05EICAgIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRElSRUNUICAgICAgU0RfQ01EX1NETU1DX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQgICAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVECisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRSAgICAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRSAgICAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRSAgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTCAgIF9fSEFMX1NEX1NETU1DX0RNQV9ESVNBQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVCAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRV9JVCAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fR0VUX0ZMQUcgICAgIF9fSEFMX1NEX1NETU1DX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcgICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0dFVF9JVCAgICAgICBfX0hBTF9TRF9TRE1NQ19HRVRfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fQ0xFQVJfSVQgICAgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0lUCisjZGVmaW5lICBTRElPX1NUQVRJQ19GTEFHUwkgICAgICAgIFNETU1DX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RJT19DTUQwVElNRU9VVAkgICAgICAgICAgU0RNTUNfQ01EMFRJTUVPVVQKKyNkZWZpbmUgIFNEX1NESU9fU0VORF9JRl9DT05ECSAgICAgIFNEX1NETU1DX1NFTkRfSUZfQ09ORAorLyogYWxpYXMgQ01TSVMgZm9yIGNvbXBhdGliaWxpdGllcyAqLworI2RlZmluZSAgU0RJT19JUlFuICAgICAgICAgICAgICAgICAgU0RNTUMxX0lSUW4KKyNkZWZpbmUgIFNESU9fSVJRSGFuZGxlciAgICAgICAgICAgIFNETU1DMV9JUlFIYW5kbGVyCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ0lEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENJRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ1NEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENTRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdHVzVHlwZWRlZiAgICBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdGVUeXBlZGVmICAgICBIQUxfU0RfQ2FyZFN0YXRlVHlwZURlZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMUNwbHRDYWxsYmFjayAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjFDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TRF9Ecml2ZVRyYW5zY2l2ZXJfMV84Vl9DYWxsYmFjayAgICAgICAgICBIQUxfU0RfRHJpdmVUcmFuc2NlaXZlcl8xXzhWX0NhbGxiYWNrCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX01hY3JvcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEVfSVQgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRV9JVCAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVAorI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEUgICAgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRSAgICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRQorI2RlZmluZSBfX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUgIF9fSEFMX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRSBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRSAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fU01BUlRDQVJEX0dFVENMT0NLU09VUkNFICAgICAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisKKyNkZWZpbmUgSVNfU01BUlRDQVJEX09ORUJJVF9TQU1QTElORyAgICBJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQlVTIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IxICAgICAgICAgICBTTUJVU19SRVNFVF9DUjEKKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IyICAgICAgICAgICBTTUJVU19SRVNFVF9DUjIKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VORVJBVEVfU1RBUlQgICAgICBTTUJVU19HRU5FUkFURV9TVEFSVAorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfQUREUl9NQVRDSCAgICAgIFNNQlVTX0dFVF9BRERSX01BVENICisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9ESVIgICAgICAgICAgICAgU01CVVNfR0VUX0RJUgorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfU1RPUF9NT0RFICAgICAgIFNNQlVTX0dFVF9TVE9QX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1BFQ19NT0RFICAgICAgICBTTUJVU19HRVRfUEVDX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQgICBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfTWFjcm9zIEhBTCBTUEkgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9UWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1RYCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9SWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1JYCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9DUkMgICAgICAgICAgICAgU1BJX1JFU0VUX0NSQworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VQVJUX0FsaWFzZWRfTWFjcm9zIEhBTCBVQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9VQVJUX0dFVENMT0NLU09VUkNFICAgICAgIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19IQUxfVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04KKyNkZWZpbmUgX19VQVJUX0dFVENMT0NLU09VUkNFICAgICAgICAgICBVQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICAgICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OCisKKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBNRVRIT0RFICAgICAgICAgICBJU19VQVJUX1dBS0VVUE1FVEhPRAorCisjZGVmaW5lIElTX1VBUlRfT05FQklUX1NBTVBMRSAgICAgICAgICAgSVNfVUFSVF9PTkVfQklUX1NBTVBMRQorI2RlZmluZSBJU19VQVJUX09ORUJJVF9TQU1QTElORyAgICAgICAgIElTX1VBUlRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9VU0FSVF9BbGlhc2VkX01hY3JvcyBIQUwgVVNBUlQgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fVVNBUlRfRU5BQkxFX0lUICAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUCisjZGVmaW5lIF9fVVNBUlRfRElTQUJMRV9JVCAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0VOQUJMRSAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUX0RJU0FCTEUgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0RJU0FCTEUKKworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRDTE9DS1NPVVJDRSAgICAgIFVTQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UgICAgICAgICAgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVVNCX0FsaWFzZWRfTWFjcm9zIEhBTCBVU0IgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBVU0JfRVhUSV9MSU5FX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9IU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9SSVNJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFTkVSQVRFX1NXSVQgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VORVJBVEVfU1dJVAorCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRU5FUkFURV9TV0lUICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFTkVSQVRFX1NXSVQKKworI2RlZmluZSBIQUxfUENEX0FjdGl2ZVJlbW90ZVdha2V1cCAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwCisjZGVmaW5lIEhBTF9QQ0RfRGVBY3RpdmVSZW1vdGVXYWtldXAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cAorCisjZGVmaW5lIEhBTF9QQ0RfU2V0VHhGaUZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RFeF9TZXRUeEZpRm8KKyNkZWZpbmUgSEFMX1BDRF9TZXRSeEZpRm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BDREV4X1NldFJ4RmlGbworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXJWYWx1ZSAgIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRQorI2RlZmluZSBfX0hBTF9USU1fUmVzZXRJQ1ByZXNjYWxlclZhbHVlIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFCisKKyNkZWZpbmUgVElNX0dFVF9JVFNUQVRVUyAgICAgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRQorI2RlZmluZSBUSU1fR0VUX0NMRUFSX0lUICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVAorCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRTVEFUVVMgICAgICAgICAgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UKKworI2RlZmluZSBfX0hBTF9USU1fRElSRUNUSU9OX1NUQVRVUyAgICAgIF9fSEFMX1RJTV9JU19USU1fQ09VTlRJTkdfRE9XTgorI2RlZmluZSBfX0hBTF9USU1fUFJFU0NBTEVSICAgICAgICAgICAgIF9fSEFMX1RJTV9TRVRfUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX1NFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX0dFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX1NFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9HZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRJQ1ByZXNjYWxlciAgICAgICAgX19IQUxfVElNX1NFVF9JQ1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9USU1fR2V0SUNQcmVzY2FsZXIgICAgICAgIF9fSEFMX1RJTV9HRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX1NldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fU0VUX0NPTVBBUkUKKyNkZWZpbmUgX19IQUxfVElNX0dldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUKKworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9ERlNETSAgVElNX0JSRUFLSU5QVVRTT1VSQ0VfREZTRE0xCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9NYWNyb3MgSEFMIEVUSCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR1JJU0lOR19UUklHR0VSCisKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9FTkFCTEUgICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9FTkFCTEUKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9ESVNBQkxFICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9ESVNBQkxFCisjZGVmaW5lIElTX0VUSF9QUk9NSVNDSU9VU19NT0RFICAgICAgSVNfRVRIX1BST01JU0NVT1VTX01PREUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9NYWNyb3MgSEFMIExUREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9MVERDX0xBWUVSIExURENfTEFZRVIKKyNkZWZpbmUgX19IQUxfTFREQ19SRUxPQURfQ09ORklHICBfX0hBTF9MVERDX1JFTE9BRF9JTU1FRElBVEVfQ09ORklHCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TQUlfQWxpYXNlZF9NYWNyb3MgSEFMIFNBSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9PVVRQVVREUklWRV9ESVNBQkxFRCAgICAgICAgICBTQUlfT1VUUFVURFJJVkVfRElTQUJMRQorI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRU5BQkxFRCAgICAgICAgICAgU0FJX09VVFBVVERSSVZFX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9FTkFCTEVEICAgICAgICAgU0FJX01BU1RFUkRJVklERVJfRU5BQkxFCisjZGVmaW5lIFNBSV9NQVNURVJESVZJREVSX0RJU0FCTEVEICAgICAgICBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFCisjZGVmaW5lIFNBSV9TVFJFT01PREUgICAgICAgICAgICAgICAgICAgICBTQUlfU1RFUkVPTU9ERQorI2RlZmluZSBTQUlfRklGT1N0YXR1c19FbXB0eSAgICAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfRU1QVFkKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfTGVzczFRdWFydGVyRnVsbCAgIFNBSV9GSUZPU1RBVFVTX0xFU1MxUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfMVF1YXJ0ZXJGdWxsICAgICAgIFNBSV9GSUZPU1RBVFVTXzFRVUFSVEVSRlVMTAorI2RlZmluZSBTQUlfRklGT1N0YXR1c19IYWxmRnVsbCAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfSEFMRkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfM1F1YXJ0ZXJzRnVsbCAgICAgIFNBSV9GSUZPU1RBVFVTXzNRVUFSVEVSRlVMTAorI2RlZmluZSBTQUlfRklGT1N0YXR1c19GdWxsICAgICAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfRlVMTAorI2RlZmluZSBJU19TQUlfQkxPQ0tfTU9OT19TVFJFT19NT0RFICAgICAgSVNfU0FJX0JMT0NLX01PTk9fU1RFUkVPX01PREUKKyNkZWZpbmUgU0FJX1NZTkNIUk9OT1VTX0VYVCAgICAgICAgICAgICAgIFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMQorI2RlZmluZSBTQUlfU1lOQ0VYVF9JTl9FTkFCTEUgICAgICAgICAgICAgU0FJX1NZTkNFWFRfT1VUQkxPQ0tBX0VOQUJMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BESUZSWF9BbGlhc2VkX01hY3JvcyBIQUwgU1BESUZSWCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBIQUxfU1BESUZSWF9SZWNlaXZlQ29udHJvbEZsb3cgICAgICBIQUxfU1BESUZSWF9SZWNlaXZlQ3RybEZsb3cKKyNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93X0lUICAgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93X0lUCisjZGVmaW5lIEhBTF9TUERJRlJYX1JlY2VpdmVDb250cm9sRmxvd19ETUEgIEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvd19ETUEKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSFJUSU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhSVElNIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkg3KSB8fCBkZWZpbmVkIChTVE0zMkYzKQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfSVQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfRE1BIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnRfRE1BCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0CisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9ETUEgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdG9wX0RNQQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3AKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUVNQSV9BbGlhc2VkX01hY3JvcyBIQUwgUVNQSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMNCkKKyNkZWZpbmUgSEFMX1FQU0lfVElNRU9VVF9ERUZBVUxUX1ZBTFVFIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9NYWNyb3MgSEFMIFBQUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMl9IQUxfTEVHQUNZICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaCBiL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVjYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyX2Fzc2VydF90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9hc3NlcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1RNMzIgYXNzZXJ0IHRlbXBsYXRlIGZpbGUuCisgICogICAgICAgICAgVGhpcyBmaWxlIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgcmVuYW1lZAorICAqICAgICAgICAgIHRvIHN0bTMyX2Fzc2VydC5oLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJfQVNTRVJUX0gKKyNkZWZpbmUgU1RNMzJfQVNTRVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKy8qKgorICAqIEBicmllZiAgVGhlIGFzc2VydF9wYXJhbSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgcGFyYW1ldGVycyBjaGVjay4KKyAgKiBAcGFyYW0gIGV4cHI6IElmIGV4cHIgaXMgZmFsc2UsIGl0IGNhbGxzIGFzc2VydF9mYWlsZWQgZnVuY3Rpb24KKyAgKiAgICAgICAgIHdoaWNoIHJlcG9ydHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgc291cmNlCisgICogICAgICAgICBsaW5lIG51bWJlciBvZiB0aGUgY2FsbCB0aGF0IGZhaWxlZC4KKyAgKiAgICAgICAgIElmIGV4cHIgaXMgdHJ1ZSwgaXQgcmV0dXJucyBubyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgoZXhwcikgPyAodm9pZCkwVSA6IGFzc2VydF9mYWlsZWQoKHVpbnQ4X3QgKilfX0ZJTEVfXywgX19MSU5FX18pKQorLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgYXNzZXJ0X2ZhaWxlZCh1aW50OF90ICpmaWxlLCB1aW50MzJfdCBsaW5lKTsKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYgLyogVVNFX0ZVTExfQVNTRVJUICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMl9BU1NFUlRfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbC5oIGIvSW5jL3N0bTMyZzB4eF9oYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U5NjRkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWwuaApAQCAtMCwwICsxLDc3MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWwuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBIQUwKKyAgKiAgICAgICAgICBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9jb25mLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMIEhBTAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9Db25zdGFudHMgSEFMIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJQ0tfRlJFUSBUaWNrIEZyZXF1ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfVElDS19GUkVRXzEwSFogICAgICAgICAxMDBVCisjZGVmaW5lICBIQUxfVElDS19GUkVRXzEwMEhaICAgICAgICAxMFUKKyNkZWZpbmUgIEhBTF9USUNLX0ZSRVFfMUtIWiAgICAgICAgIDFVCisjZGVmaW5lICBIQUxfVElDS19GUkVRX0RFRkFVTFQgICAgICBIQUxfVElDS19GUkVRXzFLSFoKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRXhwb3J0ZWRfQ29uc3RhbnRzIFNZU0NGRyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19Cb290TW9kZSBCb290IE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfQk9PVF9NQUlORkxBU0ggICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwIDAwMDAgICAqLworI2RlZmluZSBTWVNDRkdfQk9PVF9TWVNURU1GTEFTSCAgICAgICAgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzAgICAgICAgICAgLyohPCBTeXN0ZW0gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAgMDAwMCAqLworI2RlZmluZSBTWVNDRkdfQk9PVF9TUkFNICAgICAgICAgICAgICAgKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xIHwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzApICAvKiE8IEVtYmVkZGVkIFNSQU0gbWFwcGVkIGF0IDB4MDAwMCAwMDAwICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0JyZWFrIEJyZWFrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0JSRUFLX1NQICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9TUEwgICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTSBQYXJpdHkgZXJyb3Igc2lnbmFsIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS8xNS8xNi8xNyAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IyX1BWREwpCisjZGVmaW5lIFNZU0NGR19CUkVBS19QVkQgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfUFZETCAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFBWRCBjb25uZWN0aW9uIHdpdGggVElNMS8xNS8xNi8xNyBCcmVhayBJbnB1dCBhbmQgYWxzbyB0aGUgUFZERSBhbmQgUExTIGJpdHMgb2YgdGhlIFBvd2VyIENvbnRyb2wgSW50ZXJmYWNlICovCisjZW5kaWYKKyNkZWZpbmUgU1lTQ0ZHX0JSRUFLX0xPQ0tVUCAgICAgICAgICAgIFNZU0NGR19DRkdSMl9DTEwgICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgTE9DS1VQIG91dHB1dCBvZiBDb3J0ZXhNMCsgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzE1LzE2LzE3ICovCisjZGVmaW5lIFNZU0NGR19CUkVBS19FQ0MgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfRUNDTCAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIEVDQyBvZiBDb3J0ZXhNMCsgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzE1LzE2LzE3ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkcwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0NsYW1waW5nRGlvZGUgQ2xhbXBpbmcgRGlvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfQ0RFTl9QQTEgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BBMV9DREVOICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBEaW9kZSBvbiBQQTEgKi8KKyNkZWZpbmUgU1lTQ0ZHX0NERU5fUEEzICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9QQTNfQ0RFTiAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgRGlvZGUgb24gUEEzICovCisjZGVmaW5lIFNZU0NGR19DREVOX1BBNSAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfUEE1X0NERU4gICAgLyohPCBFbmFibGVzIENsYW1waW5nIERpb2RlIG9uIFBBNSAqLworI2RlZmluZSBTWVNDRkdfQ0RFTl9QQTYgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BBNl9DREVOICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBEaW9kZSBvbiBQQTYgKi8KKyNkZWZpbmUgU1lTQ0ZHX0NERU5fUEExMyAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9QQTEzX0NERU4gICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgRGlvZGUgb24gUEExMyAqLworI2RlZmluZSBTWVNDRkdfQ0RFTl9QQjAgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BCMF9DREVOICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBEaW9kZSBvbiBQQjAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0NERU5fUEIxICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9QQjFfQ0RFTiAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgRGlvZGUgb24gUEIxICovCisjZGVmaW5lIFNZU0NGR19DREVOX1BCMiAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfUEIyX0NERU4gICAgLyohPCBFbmFibGVzIENsYW1waW5nIERpb2RlIG9uIFBCMiAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1Bpbl9yZW1hcHBpbmcgUGluIHJlbWFwcGluZworICAqIEB7CisgICovCisvKiBPbmx5IGF2YWlsYWJsZSBvbiBjdXQyLjAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1JFTUFQX1BBMTEgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX1BBMTFfUk1QICAgICAgIC8qITwgUEExMSBwYWQgYmVoYXZlcyBkaWdpdGFsbHkgYXMgUEE5IEdQSU8gcGluICovCisjZGVmaW5lIFNZU0NGR19SRU1BUF9QQTEyICAgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMV9QQTEyX1JNUCAgICAgICAvKiE8IFBBMTIgcGFkIGJlaGF2ZXMgZGlnaXRhbGx5IGFzIFBBMTAgR1BJTyBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0lSX0VOVl9TRUwgSVIgTW9kdWxhdGlvbiBFbnZlbG9wZSBzaWduYWwgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JUkRBX0VOVl9TRUxfVElNMTYgICAgIChTWVNDRkdfQ0ZHUjFfSVJfTU9EXzAgJiBTWVNDRkdfQ0ZHUjFfSVJfTU9EXzEpICAgIC8qITwgMDA6IFRpbWVyMTYgaXMgc2VsZWN0ZWQgYXMgSVIgTW9kdWxhdGlvbiBlbnZlbG9wZSBzb3VyY2UgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JUkRBX0VOVl9TRUxfVVNBUlQxICAgIChTWVNDRkdfQ0ZHUjFfSVJfTU9EXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMDE6IFVTQVJUMSBpcyBzZWxlY3RlZCBhcyBJUiBNb2R1bGF0aW9uIGVudmVsb3BlIHNvdXJjZSAqLworI2lmIGRlZmluZWQgKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDcweHgpCisjZGVmaW5lIEhBTF9TWVNDRkdfSVJEQV9FTlZfU0VMX1VTQVJUNCAgICAoU1lTQ0ZHX0NGR1IxX0lSX01PRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEwOiBVU0FSVDQgaXMgc2VsZWN0ZWQgYXMgSVIgTW9kdWxhdGlvbiBlbnZlbG9wZSBzb3VyY2UgKi8KKyNlbGlmIGRlZmluZWQgKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDMweHgpCisjZGVmaW5lIEhBTF9TWVNDRkdfSVJEQV9FTlZfU0VMX1VTQVJUMiAgICAoU1lTQ0ZHX0NGR1IxX0lSX01PRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEwOiBVU0FSVDIgaXMgc2VsZWN0ZWQgYXMgSVIgTW9kdWxhdGlvbiBlbnZlbG9wZSBzb3VyY2UgKi8KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JUl9QT0xfU0VMIElSIG91dHB1dCBwb2xhcml0eSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lSREFfUE9MQVJJVFlfTk9UX0lOVkVSVEVEICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwMDogSVIgb3V0cHV0IHBvbGFyaXR5IG5vdCBpbnZlcnRlZCAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lSREFfUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICBTWVNDRkdfQ0ZHUjFfSVJfUE9MICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwMTogSVIgb3V0cHV0IHBvbGFyaXR5IGludmVydGVkICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisvKiogQGRlZmdyb3VwIFNZU0NGR19WUkVGQlVGX1ZvbHRhZ2VTY2FsZSBWUkVGQlVGIFZvbHRhZ2UgU2NhbGUKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDA6IFZSRUZfT1VUMSBhcm91bmQgMi4wNDggVi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlcXVpcmVzIFZEREEgZXF1YWwgdG8gb3IgaGlnaGVyIHRoYW4gMi40IFYuICAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgIFZSRUZCVUZfQ1NSX1ZSUyAgICAgICAgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAxOiBWUkVGX09VVDEgYXJvdW5kIDIuNSBWLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgVkREQSBlcXVhbCB0byBvciBoaWdoZXIgdGhhbiAyLjggVi4gICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2UgVlJFRkJVRiBIaWdoIEltcGVkYW5jZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0RJU0FCTEUgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIG91dHB1dCAqLworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9FTkFCTEUgICBWUkVGQlVGX0NTUl9ISVogICAgLyohPCBWUkVGX3BsdXMgcGluIGlzIGhpZ2ggaW1wZWRhbmNlICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19GYXN0TW9kZVBsdXNfR1BJTyBGYXN0IG1vZGUgUGx1cyBvbiBHUElPCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgRmFzdCBtb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IG9uIGEgc3BlY2lmaWMgR1BJTworICAqLworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNiAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QICAvKiE8IEVuYWJsZSBGYXN0IG1vZGUgUGx1cyBvbiBQQjYgKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI3X0ZNUCAgLyohPCBFbmFibGUgRmFzdCBtb2RlIFBsdXMgb24gUEI3ICovCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4ICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgIC8qITwgRW5hYmxlIEZhc3QgbW9kZSBQbHVzIG9uIFBCOCAqLworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QICAvKiE8IEVuYWJsZSBGYXN0IG1vZGUgUGx1cyBvbiBQQjkgKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQTkgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEE5X0ZNUCAgLyohPCBFbmFibGUgRmFzdCBtb2RlIFBsdXMgb24gUEE5ICovCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEExMCAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BBMTBfRk1QIC8qITwgRW5hYmxlIEZhc3QgbW9kZSBQbHVzIG9uIFBBMTAgKi8KKworLyoqCisgKiBAfQorICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0Zhc3RNb2RlUGx1c19JMkN4IEZhc3QgbW9kZSBQbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBhY3RpdmF0aW9uIGZvciBJMkN4CisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgRmFzdCBtb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IG9uIGEgc3BlY2lmaWMgR1BJTworICAqLworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX0kyQzEgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzFfRk1QIC8qITwgRW5hYmxlIEZhc3QgbW9kZSBQbHVzIG9uIEkyQzEgKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkMyICAgICAgIFNZU0NGR19DRkdSMV9JMkMyX0ZNUCAvKiE8IEVuYWJsZSBGYXN0IG1vZGUgUGx1cyBvbiBJMkMyICovCisKKy8qKgorICogQH0KKyAqLworI2lmIGRlZmluZWQgKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDcweHgpCisvKiogQGRlZmdyb3VwIFNZU0NGR19VQ1BEeF9TVFJPQkUgU1lTQ0ZHIERlYWQgQmF0dGVyeSBmZWF0dXJlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfVUNQRDFfU1RST0JFICAgICAgICAgIFNZU0NGR19DRkdSMV9VQ1BEMV9TVFJPQkUgLyohPCBVQ1BEMSBEZWFkIGJhdHRlcnkgc3cgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTWVNDRkdfVUNQRDJfU1RST0JFICAgICAgICAgIFNZU0NGR19DRkdSMV9VQ1BEMl9TVFJPQkUgLyohPCBVQ1BEMiBEZWFkIGJhdHRlcnkgc3cgY29uZmlndXJhdGlvbiAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JU1JfV3JhcHBlciBIQUwgSVNSIFdyYXBwZXIKKyAgKiBAYnJpZWYgSVNSIFdyYXBwZXIKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2VSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN1UgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5VSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQVUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMTEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEJVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTEyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRFUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMTQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEVVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTFVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxM1UgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMjAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTRVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTIxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE1VSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNlUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMjMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTdVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4VSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOVUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMjYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUFVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFCVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQ1UgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisjZGVmaW5lIEhBTF9TWVNDRkdfSVRMSU5FMjkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMURVIC8qITwgSW50ZXJuYWwgZGVmaW5lIGZvciBtYWNybyBoYW5kbGluZyAqLworI2RlZmluZSBIQUxfU1lTQ0ZHX0lUTElORTMwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFFVSAvKiE8IEludGVybmFsIGRlZmluZSBmb3IgbWFjcm8gaGFuZGxpbmcgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19JVExJTkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRlUgLyohPCBJbnRlcm5hbCBkZWZpbmUgZm9yIG1hY3JvIGhhbmRsaW5nICovCisKKyNkZWZpbmUgSEFMX0lUTElORV9XV0RHICAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMCA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMF9TUl9XV0RHKSAgICAgICAgICAvKiE8IFdXREcgaGFzIGV4cGlyZWQgLi4uLiAqLworI2lmIGRlZmluZWQgKFNZU0NGR19JVExJTkUxX1NSX1BWRE9VVCkKKyNkZWZpbmUgSEFMX0lUTElORV9QVkRPVVQgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMV9TUl9QVkRPVVQpICAgICAgICAvKiE8IFBvd2VyIHZvbHRhZ2UgZGV0ZWN0aW9uIEludGVycnVwdCAuLi4uICovCisjZW5kaWYKKyNkZWZpbmUgSEFMX0lUTElORV9SVEMgICAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMiA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMl9TUl9SVEMpICAgICAgICAgICAvKiE8IFJUQyAtPiBleHRpWzE5XSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9UQU1QRVIgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMiA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMl9TUl9UQU1QRVIpICAgICAgICAvKiE8IFRBTVBFUiAtPiBleHRpWzIxXSBpbnRlcnJ1cHQgLi4uLiAqLworI2RlZmluZSBIQUxfSVRMSU5FX0ZMQVNIX0VDQyAgICAgICgoSEFMX1NZU0NGR19JVExJTkUzIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUzX1NSX0ZMQVNIX0VDQykgICAgIC8qITwgRmxhc2ggRUNDIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0ZMQVNIX0lURiAgICAgICgoSEFMX1NZU0NGR19JVExJTkUzIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUzX1NSX0ZMQVNIX0lURikgICAgIC8qITwgRmxhc2ggSVRGIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0NMS19DVFJMICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU0IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU0X1NSX0NMS19DVFJMKSAgICAgIC8qITwgQ0xLIENvbnRyb2wgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfRVhUSTAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTUgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTVfU1JfRVhUSTApICAgICAgICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgMCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU1IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU1X1NSX0VYVEkxKSAgICAgICAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IDEgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9FWFRJMiAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FNiA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FNl9TUl9FWFRJMikgICAgICAgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCAyICovCisjZGVmaW5lIEhBTF9JVExJTkVfRVhUSTMgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTYgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTZfU1JfRVhUSTMpICAgICAgICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgMyAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEk0ICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEk0KSAgICAgICAgIC8qITwgRVhUSTQgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfRVhUSTUgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTcgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTUpICAgICAgICAgLyohPCBFWFRJNSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9FWFRJNiAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FNyA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FN19TUl9FWFRJNikgICAgICAgICAvKiE8IEVYVEk2IEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEk3ICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEk3KSAgICAgICAgIC8qITwgRVhUSTcgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfRVhUSTggICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTcgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTgpICAgICAgICAgLyohPCBFWFRJOCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9FWFRJOSAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FNyA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FN19TUl9FWFRJOSkgICAgICAgICAvKiE8IEVYVEk5IEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxMCAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMCkgICAgICAgIC8qITwgRVhUSTEwIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxMSAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMSkgICAgICAgIC8qITwgRVhUSTExIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxMiAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMikgICAgICAgIC8qITwgRVhUSTEyIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxMyAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMykgICAgICAgIC8qITwgRVhUSTEzIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxNCAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxNCkgICAgICAgIC8qITwgRVhUSTE0IEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0VYVEkxNSAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU3X1NSX0VYVEkxNSkgICAgICAgIC8qITwgRVhUSTE1IEludGVycnVwdCAqLworI2lmIGRlZmluZWQgKFVDUEQxKQorI2RlZmluZSBIQUxfSVRMSU5FX1VDUEQxICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkU4IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkU4X1NSX1VDUEQxKSAgICAgICAgIC8qITwgVUNQRDEgSW50ZXJydXB0ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIChVQ1BEMikKKyNkZWZpbmUgSEFMX0lUTElORV9VQ1BEMiAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FOCA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMikgICAgICAgICAvKiE8IFVDUEQyIEludGVycnVwdCAqLworI2VuZGlmCisjZGVmaW5lIEhBTF9JVExJTkVfRE1BMV9DSDEgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTkgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTlfU1JfRE1BMV9DSDEpICAgICAgLyohPCBETUExIENoYW5uZWwgMSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9ETUExX0NIMiAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTAgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTEwX1NSX0RNQTFfQ0gyKSAgICAvKiE8IERNQTEgQ2hhbm5lbCAyIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX0RNQTFfQ0gzICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxMCA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTBfU1JfRE1BMV9DSDMpICAgIC8qITwgRE1BMSBDaGFubmVsIDMgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfRE1BTVVYICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTExIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxMV9TUl9ETUFNVVgpICAgICAgLyohPCBETUFNVVggSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfRE1BMV9DSDQgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTExIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINCkgICAgLyohPCBETUExIENoYW5uZWwgNCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9ETUExX0NINSAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTEgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g1KSAgICAvKiE8IERNQTEgQ2hhbm5lbCA1IEludGVycnVwdCAqLworI2lmIGRlZmluZWQgKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDcweHgpCisjZGVmaW5lIEhBTF9JVExJTkVfRE1BMV9DSDYgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTExIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINikgICAgLyohPCBETUExIENoYW5uZWwgNiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9ETUExX0NINyAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTEgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g3KSAgICAvKiE8IERNQTEgQ2hhbm5lbCA3IEludGVycnVwdCAqLworI2VuZGlmCisjZGVmaW5lIEhBTF9JVExJTkVfQURDICAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTEyIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxMl9TUl9BREMpICAgICAgICAgLyohPCBBREMgSW50ZXJydXB0ICovCisjaWYgZGVmaW5lZCAoQ09NUDEpCisjZGVmaW5lIEhBTF9JVExJTkVfQ09NUDEgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTEyIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxMl9TUl9DT01QMSkgICAgICAgLyohPCBDT01QMSBJbnRlcnJ1cHQgLT4gZXh0aVsxN10gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQgKENPTVAyKQorI2RlZmluZSBIQUxfSVRMSU5FX0NPTVAyICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxMiA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTJfU1JfQ09NUDIpICAgICAgIC8qITwgQ09NUDIgSW50ZXJydXB0IC0+IGV4dGlbMThdICovCisjZW5kaWYKKyNkZWZpbmUgSEFMX0lUTElORV9USU0xX0JSSyAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTMgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQlJLKSAgICAvKiE8IFRJTTEgQlJLIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX1RJTTFfVVBEICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxMyA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9VUEQpICAgIC8qITwgVElNMSBVUEQgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfVElNMV9UUkcgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTEzIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxM19TUl9USU0xX1RSRykgICAgLyohPCBUSU0xIFRSRyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9USU0xX0NDVSAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTMgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQ0NVKSAgICAvKiE8IFRJTTEgQ0NVIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX1RJTTFfQ0MgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxNCA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTRfU1JfVElNMV9DQykgICAgIC8qITwgVElNMSBDQyBJbnRlcnJ1cHQgKi8KKyNpZiBkZWZpbmVkIChUSU0yKQorI2RlZmluZSBIQUxfSVRMSU5FX1RJTTIgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxNSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTVfU1JfVElNMl9HTEIpICAgIC8qITwgVElNMiBJbnRlcnJ1cHQgKi8KKyNlbmRpZgorI2RlZmluZSBIQUxfSVRMSU5FX1RJTTMgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxNiA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTZfU1JfVElNM19HTEIpICAgIC8qITwgVElNMyBJbnRlcnJ1cHQgKi8KKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIEhBTF9JVExJTkVfVElNNiAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTE3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxN19TUl9USU02X0dMQikgICAgLyohPCBUSU02IEludGVycnVwdCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBIQUxfSVRMSU5FX0RBQyAgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUxNyA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMTdfU1JfREFDX0dMQikgICAgIC8qITwgREFDIEludGVycnVwdCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTEpCisjZGVmaW5lIEhBTF9JVExJTkVfTFBUSU0xICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTE3IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxN19TUl9MUFRJTTFfR0xCKSAgLyohPCBMUFRJTTEgSW50ZXJydXB0IC0+IGV4dGlbMjldICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIEhBTF9JVExJTkVfVElNNyAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTE4IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxOF9TUl9USU03X0dMQikgICAgLyohPCBUSU03IEludGVycnVwdCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIEhBTF9JVExJTkVfTFBUSU0yICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTE4IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUxOF9TUl9MUFRJTTJfR0xCKSAgLyohPCBMUFRJTTIgSW50ZXJydXB0IC0+IGV4dGlbMzBdICovCisjZW5kaWYKKyNkZWZpbmUgSEFMX0lUTElORV9USU0xNCAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMTkgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTE5X1NSX1RJTTE0X0dMQikgICAvKiE8IFRJTTE0IEludGVycnVwdCAqLworI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIEhBTF9JVExJTkVfVElNMTUgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTIwIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUyMF9TUl9USU0xNV9HTEIpICAgLyohPCBUSU0xNSBJbnRlcnJ1cHQgKi8KKyNlbmRpZgorI2RlZmluZSBIQUxfSVRMSU5FX1RJTTE2ICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUyMSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMjFfU1JfVElNMTZfR0xCKSAgIC8qITwgVElNMTYgSW50ZXJydXB0ICovCisjZGVmaW5lIEhBTF9JVExJTkVfVElNMTcgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTIyIDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUyMl9TUl9USU0xN19HTEIpICAgLyohPCBUSU0xNyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSEFMX0lUTElORV9JMkMxICAgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMjMgPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTIzX1NSX0kyQzFfR0xCKSAgICAvKiE8IEkyQzEgSW50ZXJydXB0IC0+IGV4dGlbMjNdICovCisjZGVmaW5lIEhBTF9JVExJTkVfSTJDMiAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTI0IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUyNF9TUl9JMkMyX0dMQikgICAgLyohPCBJMkMyIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX1NQSTEgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUyNSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMjVfU1JfU1BJMSkgICAgICAgIC8qITwgU1BJMSBJbnRlcnJ1cHQgICovCisjZGVmaW5lIEhBTF9JVExJTkVfU1BJMiAgICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTI2IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUyNl9TUl9TUEkyKSAgICAgICAgLyohPCBTUEkyIEludGVycnVwdCAqLworI2RlZmluZSBIQUxfSVRMSU5FX1VTQVJUMSAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUyNyA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMjdfU1JfVVNBUlQxX0dMQikgIC8qITwgVVNBUlQxIEdMQiBJbnRlcnJ1cHQgLT4gZXh0aVsyNV0gKi8KKyNkZWZpbmUgSEFMX0lUTElORV9VU0FSVDIgICAgICAgICAoKEhBTF9TWVNDRkdfSVRMSU5FMjggPDwgMHgxOFUpIHwgU1lTQ0ZHX0lUTElORTI4X1NSX1VTQVJUMl9HTEIpICAvKiE8IFVTQVJUMiBHTEIgSW50ZXJydXB0IC0+IGV4dGlbMjZdICovCisjaWYgZGVmaW5lZChVU0FSVDMpCisjZGVmaW5lIEhBTF9JVExJTkVfVVNBUlQzICAgICAgICAgKChIQUxfU1lTQ0ZHX0lUTElORTI5IDw8IDB4MThVKSB8IFNZU0NGR19JVExJTkUyOV9TUl9VU0FSVDNfR0xCKSAgLyohPCBVU0FSVDMgSW50ZXJydXB0IC4uLi4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVVNBUlQ0KQorI2RlZmluZSBIQUxfSVRMSU5FX1VTQVJUNCAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUyOSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMjlfU1JfVVNBUlQ0X0dMQikgIC8qITwgVVNBUlQ0IEludGVycnVwdCAuLi4uICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIChMUFVBUlQxKQorI2RlZmluZSBIQUxfSVRMSU5FX0xQVUFSVDEgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUyOSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMjlfU1JfTFBVQVJUMV9HTEIpIC8qITwgTFBVQVJUMSBJbnRlcnJ1cHQgLT4gZXh0aVsyOF0qLworI2VuZGlmCisjaWYgZGVmaW5lZCAoQ0VDKQorI2RlZmluZSBIQUxfSVRMSU5FX0NFQyAgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUzMCA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMzBfU1JfQ0VDKSAgICAgICAgIC8qITwgQ0VDIEludGVycnVwdCAtPiBleHRpWzI3XSAqLworI2VuZGlmCisjaWYgZGVmaW5lZCAoUk5HKQorI2RlZmluZSBIQUxfSVRMSU5FX1JORyAgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUzMSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMzFfU1JfUk5HKSAgICAgICAgIC8qITwgUk5HIEludGVycnVwdCAqLworI2VuZGlmCisjaWYgZGVmaW5lZCAoQUVTKQorI2RlZmluZSBIQUxfSVRMSU5FX0FFUyAgICAgICAgICAgICgoSEFMX1NZU0NGR19JVExJTkUzMSA8PCAweDE4VSkgfCBTWVNDRkdfSVRMSU5FMzFfU1JfQUVTKSAgICAgICAgIC8qITwgQUVTIEludGVycnVwdCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfTWFjcm9zIEhBTCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERCR19FeHBvcnRlZF9NYWNyb3MgREJHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEZyZWV6ZSBhbmQgVW5mcmVlemUgUGVyaXBoZXJhbHMgaW4gRGVidWcgbW9kZQorICAqLworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTJfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0yKCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yKCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU0yX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTNfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0zKCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU0zX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0zKCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU0zX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU02KCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU02X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU02KCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU02X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU03KCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU03X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU03KCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19USU03X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1JUQ19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1JUQygpICAgICAgICAgICAgU0VUX0JJVChEQkctPkFQQkZaMSwgREJHX0FQQl9GWjFfREJHX1JUQ19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfUlRDKCkgICAgICAgICAgQ0xFQVJfQklUKERCRy0+QVBCRloxLCBEQkdfQVBCX0ZaMV9EQkdfUlRDX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1dXREdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHKCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19XV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9XV0RHKCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19XV0RHX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX0lXREdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHKCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19JV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjEsIERCR19BUEJfRloxX0RCR19JV0RHX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX0kyQzFfU01CVVNfVElNRU9VVF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVCgpICAgU0VUX0JJVChEQkctPkFQQkZaMSwgREJHX0FQQl9GWjFfREJHX0kyQzFfU01CVVNfVElNRU9VVF9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDMV9USU1FT1VUKCkgQ0xFQVJfQklUKERCRy0+QVBCRloxLCBEQkdfQVBCX0ZaMV9EQkdfSTJDMV9TTUJVU19USU1FT1VUX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX0xQVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0xQVElNMSgpICAgICAgICAgU0VUX0JJVChEQkctPkFQQkZaMSwgREJHX0FQQl9GWjFfREJHX0xQVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0xKCkgICAgICAgQ0xFQVJfQklUKERCRy0+QVBCRloxLCBEQkdfQVBCX0ZaMV9EQkdfTFBUSU0xX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX0xQVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0xQVElNMigpICAgICAgICAgU0VUX0JJVChEQkctPkFQQkZaMSwgREJHX0FQQl9GWjFfREJHX0xQVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0yKCkgICAgICAgQ0xFQVJfQklUKERCRy0+QVBCRloxLCBEQkdfQVBCX0ZaMV9EQkdfTFBUSU0yX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTFfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xKCkgICAgICAgICAgIFNFVF9CSVQoREJHLT5BUEJGWjIsIERCR19BUEJfRloyX0RCR19USU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xKCkgICAgICAgICBDTEVBUl9CSVQoREJHLT5BUEJGWjIsIERCR19BUEJfRloyX0RCR19USU0xX1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTE0X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTQoKSAgICAgICAgICBTRVRfQklUKERCRy0+QVBCRloyLCBEQkdfQVBCX0ZaMl9EQkdfVElNMTRfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE0KCkgICAgICAgIENMRUFSX0JJVChEQkctPkFQQkZaMiwgREJHX0FQQl9GWjJfREJHX1RJTTE0X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTE1X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTUoKSAgICAgICAgICBTRVRfQklUKERCRy0+QVBCRloyLCBEQkdfQVBCX0ZaMl9EQkdfVElNMTVfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE1KCkgICAgICAgIENMRUFSX0JJVChEQkctPkFQQkZaMiwgREJHX0FQQl9GWjJfREJHX1RJTTE1X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTE2X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTYoKSAgICAgICAgICBTRVRfQklUKERCRy0+QVBCRloyLCBEQkdfQVBCX0ZaMl9EQkdfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2KCkgICAgICAgIENMRUFSX0JJVChEQkctPkFQQkZaMiwgREJHX0FQQl9GWjJfREJHX1RJTTE2X1NUT1ApCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTE3X1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTcoKSAgICAgICAgICBTRVRfQklUKERCRy0+QVBCRloyLCBEQkdfQVBCX0ZaMl9EQkdfVElNMTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE3KCkgICAgICAgIENMRUFSX0JJVChEQkctPkFQQkZaMiwgREJHX0FQQl9GWjJfREJHX1RJTTE3X1NUT1ApCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfRXhwb3J0ZWRfTWFjcm9zIFNZU0NGRyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBNYWluIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRkxBU0goKSAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFKQorCisvKiogQGJyaWVmICBTeXN0ZW0gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9TWVNURU1GTEFTSCgpIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCkKKworLyoqIEBicmllZiAgRW1iZWRkZWQgU1JBTSBtYXBwZWQgYXQgMHgwMDAwMDAwMAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfU1JBTSgpICAgICAgICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9NRU1fTU9ERSwgKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xfFNZU0NGR19DRkdSMV9NRU1fTU9ERV8wKSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGJvb3QgbW9kZSBhcyBjb25maWd1cmVkIGJ5IHVzZXIuCisgICogQHJldHZhbCBUaGUgYm9vdCBtb2RlIGFzIGNvbmZpZ3VyZWQgYnkgdXNlci4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIEByZWYgU1lTQ0ZHX0Jvb3RNb2RlCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfQk9PVF9NT0RFKCkgICAgICAgICAgIFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9NRU1fTU9ERSkKKworLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIEVDQyBsb2NrLgorICAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBjb25uZWN0aW9uIG9mIEZsYXNoIEVDQyBlcnJvciBjb25uZWN0aW9uIHRvIFRJTTEgQnJlYWsgaW5wdXQuCisgICogQG5vdGUgICBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYW5kIGNhbiBiZSB1bmxvY2tlZCBvbmx5IGJ5IHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX0VDQ19MT0NLKCkgICAgICAgICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0VDQ0wpCisKKworLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIENvcnRleC1NMCsgTG9ja3VwIGxvY2suCisgICogICAgICAgICBFbmFibGVzIGFuZCBsb2NrcyB0aGUgY29ubmVjdGlvbiBvZiBDb3J0ZXgtTTArIExPQ0tVUCAoSGFyZGZhdWx0KSBvdXRwdXQgdG8gVElNMS8xNS8xNi8xNyBCcmVhayBpbnB1dAorICAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgb25seSBieSBzeXN0ZW0gcmVzZXQuCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19MT0NLVVBfTE9DSygpICAgICAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9DTEwpCisKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9QVkRMKQorLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIFBWRCBsb2NrLgorICAqICAgICAgICAgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFBWRCBjb25uZWN0aW9uIHdpdGggVGltZXIxLzE1LzE2LzE3IEJyZWFrIGlucHV0LCBhcyB3ZWxsIGFzIHRoZSBQVkRFIGFuZCBQTFNbMjowXSBpbiB0aGUgUFdSX0NSIHJlZ2lzdGVyCisgICogQG5vdGUgICBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYW5kIGNhbiBiZSB1bmxvY2tlZCBvbmx5IGJ5IHN5c3RlbSByZXNldAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfUFZEX0xPQ0soKSAgICAgICAgICAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfUFZETCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgU1JBTSBQQVJJVFkgbG9jaworICAqICAgICAgICAgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFNSQU1fUEFSSVRZIGVycm9yIHNpZ25hbCB3aXRoIEJyZWFrIElucHV0IG9mIFRJTUVSMS8xNS8xNi8xNworICAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gb25seSBiZSB1bmxvY2tlZCBieSBzeXN0ZW0gcmVzZXQKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX1NSQU1QQVJJVFlfTE9DSygpICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMixTWVNDRkdfQ0ZHUjJfU1BMKQorCisvKiogQGJyaWVmICBQYXJpdHkgY2hlY2sgb24gUkFNIGRpc2FibGUgbWFjcm8KKyAgKiBAbm90ZSAgIERpc2FibGluZyB0aGUgcGFyaXR5IGNoZWNrIG9uIFJBTSBsb2NrcyB0aGUgY29uZmlndXJhdGlvbiBiaXQuCisgICogICAgICAgICBUbyByZS1lbmFibGUgdGhlIHBhcml0eSBjaGVjayBvbiBSQU0gcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JBTV9QQVJJVFlDSEVDS19ESVNBQkxFKCkgIChTWVNDRkctPkNGR1IyIHw9IFNZU0NGR19DRkdSMl9TUEYpCisKKy8qKiBAYnJpZWYgIFNldCB0aGUgUEVGIGJpdCB0byBjbGVhciB0aGUgU1JBTSBQYXJpdHkgRXJyb3IgRmxhZy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX1NQRikKKworLyoqIEBicmllZiAgRmFzdC1tb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX0ZBU1RNT0RFUExVU19fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1lTQ0ZHX0Zhc3RNb2RlUGx1c19HUElPCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfRU5BQkxFKF9fRkFTVE1PREVQTFVTX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fRkFTVE1PREVQTFVTX18pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19ESVNBQkxFKF9fRkFTVE1PREVQTFVTX18pIGRvIHthc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUygoX19GQVNUTU9ERVBMVVNfXykpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIChfX0ZBU1RNT0RFUExVU19fKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisjaWYgZGVmaW5lZChTVE0zMkcwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkKKy8qKiBAYnJpZWYgIENsYW1waW5nIERpb2RlIG9uIHNwZWNpZmljIHBpbnMgZW5hYmxlL2Rpc2FibGUgbWFjcm9zCisgICogQHBhcmFtIF9fUElOX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdmFsdWVzIEByZWYgU1lTQ0ZHX0NsYW1waW5nRGlvZGUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0NMQU1QSU5HRElPREVfRU5BQkxFKF9fUElOX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19DTEFNUElOR0RJT0RFKChfX1BJTl9fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIChfX1BJTl9fKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19DTEFNUElOR0RJT0RFX0RJU0FCTEUoX19QSU5fXykgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfQ0xBTVBJTkdESU9ERSgoX19QSU5fXykpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjIsIChfX1BJTl9fKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIElTUiB3cmFwcGVyIGNoZWNrCisgICogQG5vdGUgQWxsb3cgdG8gZGV0ZXJtaW5lIGludGVycnVwdCBzb3VyY2UgcGVyIGxpbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19HRVRfUEVORElOR19JVChfX1NPVVJDRV9fKSAgICAgICAoU1lTQ0ZHLT5JVF9MSU5FX1NSWygoX19TT1VSQ0VfXykgPj4gMHgxOFUpXSAmICgoX19TT1VSQ0VfXykgJiAweDAwRkZGRkZGVSkpCisKKy8qKiBAYnJpZWYgIHNlbGVjdGlvbiBvZiB0aGUgbW9kdWxhdGlvbiBlbnZlbG9wZSBzaWduYWwgbWFjcm8sIHVzaW5nIGJpdHMgWzc6Nl0gb2YgU1lTQ0ZHX0NGR1IxIHJlZ2lzdGVyCisgICogQHBhcmFtIF9fU09VUkNFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfSVJfRU5WX1NFTAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfSVJEQV9FTlZfU0VMRUNUSU9OKF9fU09VUkNFX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX0hBTF9TWVNDRkdfSVJEQV9FTlZfU0VMKChfX1NPVVJDRV9fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfSVJfTU9EKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIChfX1NPVVJDRV9fKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0dFVF9JUkRBX0VOVl9TRUxFQ1RJT04oKSAgKChTWVNDRkctPkNGR1IxKSAmIDB4MDAwMDAwQzBVKQorCisvKiogQGJyaWVmICBJUk91dCBQb2xhcml0eSBTZWxlY3Rpb24sIHVzaW5nIGJpdFs1XSBvZiBTWVNDRkdfQ0ZHUjEgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gX19TRUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUl9QT0xfU0VMCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19JUkRBX09VVF9QT0xBUklUWV9TRUxFQ1RJT04oX19TRUxfXykgIGRvIHsgYXNzZXJ0X3BhcmFtKElTX0hBTF9TWVNDRkdfSVJEQV9QT0xfU0VMKChfX1NFTF9fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0lSX1BPTCk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwoX19TRUxfXykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSVJPdXQgUG9sYXJpdHkgbW9kZSBhcyBjb25maWd1cmVkIGJ5IHVzZXIuCisgICogQHJldHZhbCBUaGUgSVJPdXQgcG9sYXJpdHkgYXMgY29uZmlndXJlZCBieSB1c2VyLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZQorICAqICAgICAgICAgb2YgQHJlZiBIQUxfSVJfUE9MX1NFTAorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfR0VUX1BPTEFSSVRZKCkgICAgICAgICAgIFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9JUl9QT0wpCisKKy8qKiBAYnJpZWYgIEJyZWFrIGlucHV0IHRvIFRJTTEvMTUvMTYvMTcgY2FwYWJpbGl0eSBlbmFibGUvZGlzYWJsZSBtYWNyb3MKKyAgKiBAcGFyYW0gX19CUkVBS19fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1lTQ0ZHX0JyZWFrCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19FTkFCTEUoX19CUkVBS19fKSAgICAgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfQlJFQUtfQ09ORklHKChfX0JSRUFLX18pKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIChfX0JSRUFLX18pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19CUkVBS19ESVNBQkxFKF9fQlJFQUtfXykgICAgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfQlJFQUtfQ09ORklHKChfX0JSRUFLX18pKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMiwgKF9fQlJFQUtfXykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1ByaXZhdGVfTWFjcm9zIFNZU0NGRyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoUFdSX1BWRF9TVVBQT1JUKQorI2RlZmluZSBJU19TWVNDRkdfQlJFQUtfQ09ORklHKF9fQ09ORklHX18pICgoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19TUCkgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBTWVNDRkdfQlJFQUtfUFZEKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05GSUdfXykgPT0gU1lTQ0ZHX0JSRUFLX0VDQykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19MT0NLVVApKQorI2Vsc2UKKyNkZWZpbmUgSVNfU1lTQ0ZHX0JSRUFLX0NPTkZJRyhfX0NPTkZJR19fKSAoKChfX0NPTkZJR19fKSA9PSBTWVNDRkdfQlJFQUtfU1ApICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05GSUdfXykgPT0gU1lTQ0ZHX0JSRUFLX0VDQykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09ORklHX18pID09IFNZU0NGR19CUkVBS19MT0NLVVApKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQorI2RlZmluZSBJU19TWVNDRkdfQ0xBTVBJTkdESU9ERShfX1BJTl9fKSAoKCgoX19QSU5fXykgJiBTWVNDRkdfQ0RFTl9QQTEpICA9PSBTWVNDRkdfQ0RFTl9QQTEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19DREVOX1BBMykgID09IFNZU0NGR19DREVOX1BBMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0NERU5fUEE1KSAgPT0gU1lTQ0ZHX0NERU5fUEE1KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiBTWVNDRkdfQ0RFTl9QQTYpICA9PSBTWVNDRkdfQ0RFTl9QQTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19DREVOX1BBMTMpID09IFNZU0NGR19DREVOX1BBMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0NERU5fUEIwKSAgPT0gU1lTQ0ZHX0NERU5fUEIwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiBTWVNDRkdfQ0RFTl9QQjEpICA9PSBTWVNDRkdfQ0RFTl9QQjEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19DREVOX1BCMikgID09IFNZU0NGR19DREVOX1BCMikpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDcweHgpCisjZGVmaW5lIElTX0hBTF9TWVNDRkdfSVJEQV9FTlZfU0VMKFNFTCkgICAoKChTRUwpID09IEhBTF9TWVNDRkdfSVJEQV9FTlZfU0VMX1RJTTE2KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTCkgPT0gSEFMX1NZU0NGR19JUkRBX0VOVl9TRUxfVVNBUlQxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMKSA9PSBIQUxfU1lTQ0ZHX0lSREFfRU5WX1NFTF9VU0FSVDQpKQorI2VsaWYgZGVmaW5lZCAoU1RNMzJHMDQxeHgpIHx8IGRlZmluZWQgKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwMzB4eCkKKyNkZWZpbmUgSVNfSEFMX1NZU0NGR19JUkRBX0VOVl9TRUwoU0VMKSAgICgoKFNFTCkgPT0gSEFMX1NZU0NGR19JUkRBX0VOVl9TRUxfVElNMTYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0VMKSA9PSBIQUxfU1lTQ0ZHX0lSREFfRU5WX1NFTF9VU0FSVDEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUwpID09IEhBTF9TWVNDRkdfSVJEQV9FTlZfU0VMX1VTQVJUMikpCisjZW5kaWYKKyNkZWZpbmUgSVNfSEFMX1NZU0NGR19JUkRBX1BPTF9TRUwoU0VMKSAgICgoKFNFTCkgPT0gSEFMX1NZU0NGR19JUkRBX1BPTEFSSVRZX05PVF9JTlZFUlRFRCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUwpID09IEhBTF9TWVNDRkdfSVJEQV9QT0xBUklUWV9JTlZFUlRFRCkpCisKKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjFfVUNQRDFfU1RST0JFKSB8fCBkZWZpbmVkIChTWVNDRkdfQ0ZHUjFfVUNQRDJfU1RST0JFKQorI2RlZmluZSBJU19TWVNDRkdfREJBVFRfQ09ORklHKF9fQ09ORklHX18pICgoKF9fQ09ORklHX18pID09IFNZU0NGR19VQ1BEMV9TVFJPQkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBTWVNDRkdfVUNQRDJfU1RST0JFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05GSUdfXykgPT0gKFNZU0NGR19VQ1BEMV9TVFJPQkUgfCBTWVNDRkdfVUNQRDJfU1RST0JFKSkpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisjZGVmaW5lIElTX1NZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUoX19TQ0FMRV9fKSAgKCgoX19TQ0FMRV9fKSA9PSBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0NBTEVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEpKQorCisjZGVmaW5lIElTX1NZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVFJJTU1JTkcoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA+IDBVKSAmJiAoKF9fVkFMVUVfXykgPD0gVlJFRkJVRl9DQ1JfVFJJTSkpCisjZW5kaWYgLyogVlJFRkJVRiAqLworCisjZGVmaW5lIElTX1NZU0NGR19GQVNUTU9ERVBMVVMoX19QSU5fXykgKCgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQTkpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BBOSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BBMTApID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEExMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI2KSAgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19QSU5fXykgJiBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkgID09IFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BJTl9fKSAmIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI5KSAgPT0gU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpKQorCisjZGVmaW5lIElTX0hBTF9SRU1BUF9QSU4oUk1QKSAgICAgICAgICAgICAgICgoKFJNUCkgPT0gU1lTQ0ZHX1JFTUFQX1BBMTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUk1QKSA9PSBTWVNDRkdfUkVNQVBfUEExMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSTVApID09IChTWVNDRkdfUkVNQVBfUEExMSB8IFNZU0NGR19SRU1BUF9QQTEyKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9Qcml2YXRlX01hY3JvcyBIQUwgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19USUNLRlJFUShGUkVRKSAoKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzEwSFopICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IEhBTF9USUNLX0ZSRVFfMTAwSFopIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xS0haKSkKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnMgSEFMIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSEFMIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRGVJbml0KHZvaWQpOwordm9pZCBIQUxfTXNwSW5pdCh2b2lkKTsKK3ZvaWQgSEFMX01zcERlSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEhBTCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0luY1RpY2sodm9pZCk7Cit2b2lkIEhBTF9EZWxheSh1aW50MzJfdCBEZWxheSk7Cit1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRUaWNrUHJpbyh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TZXRUaWNrRnJlcSh1aW50MzJfdCBGcmVxKTsKK3VpbnQzMl90IEhBTF9HZXRUaWNrRnJlcSh2b2lkKTsKK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpOwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpOwordWludDMyX3QgSEFMX0dldFJFVklEKHZvaWQpOwordWludDMyX3QgSEFMX0dldERFVklEKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcwKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcxKHZvaWQpOwordWludDMyX3QgSEFMX0dldFVJRHcyKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIERCR01DVSBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIERCR01DVSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RhbmRieU1vZGUodm9pZCk7Cit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfVmFyaWFibGVzCisgICogQHsKKyAgKi8KK2V4dGVybiBfX0lPIHVpbnQzMl90IHV3VGljazsKK2V4dGVybiB1aW50MzJfdCB1d1RpY2tQcmlvOworZXh0ZXJuIHVpbnQzMl90IHV3VGlja0ZyZXE7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFNZU0NGRyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFNZU0NGRyBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoVlJFRkJVRikKK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX1ZvbHRhZ2VTY2FsaW5nQ29uZmlnKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKTsKK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2VDb25maWcodWludDMyX3QgTW9kZSk7Cit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9UcmltbWluZ0NvbmZpZyh1aW50MzJfdCBUcmltbWluZ1ZhbHVlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TWVNDRkdfRW5hYmxlVlJFRkJVRih2b2lkKTsKK3ZvaWQgSEFMX1NZU0NGR19EaXNhYmxlVlJFRkJVRih2b2lkKTsKKyNlbmRpZiAvKiBWUkVGQlVGICovCisKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3Rlcih2b2lkKTsKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVSZW1hcCh1aW50MzJfdCBQaW5SZW1hcCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVJlbWFwKHVpbnQzMl90IFBpblJlbWFwKTsKKyNpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQordm9pZCBIQUxfU1lTQ0ZHX0VuYWJsZUNsYW1waW5nRGlvZGUodWludDMyX3QgUGluQ29uZmlnKTsKK3ZvaWQgSEFMX1NZU0NGR19EaXNhYmxlQ2xhbXBpbmdEaW9kZSh1aW50MzJfdCBQaW5Db25maWcpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTQ0ZHX0NGR1IxX1VDUEQxX1NUUk9CRSkgfHwgZGVmaW5lZCAoU1lTQ0ZHX0NGR1IxX1VDUEQyX1NUUk9CRSkKK3ZvaWQgSEFMX1NZU0NGR19TdHJvYmVEQmF0dHBpbnNDb25maWcodWludDMyX3QgQ29uZmlnRGVhZEJhdHRlcnkpOworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9hZGMuaCBiL0luYy9zdG0zMmcweHhfaGFsX2FkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTRhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9hZGMuaApAQCAtMCwwICsxLDE3NTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2FkYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0FEQ19ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiBJbmNsdWRlIGxvdyBsZXZlbCBkcml2ZXIgKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYWRjLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBREMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfVHlwZXMgQURDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiAgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnNhbXBsaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBSYXRpbzsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBvdmVyc2FtcGxpbmcgcmF0aW8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfUkFUSU8gKi8KKworICB1aW50MzJfdCBSaWdodEJpdFNoaWZ0OyAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBkaXZpc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIE92ZXJzYW1wbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfT1ZTX1NISUZUICovCisKKyAgdWludDMyX3QgVHJpZ2dlcmVkTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgcmVndWxhciB0cmlnZ2VyZWQgb3ZlcnNhbXBsaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfRElTQ09OVF9NT0RFICovCisKK31BRENfT3ZlcnNhbXBsaW5nVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgaW5zdGFuY2UgYW5kIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgUGFyYW1ldGVycyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgc2hhcmVkIHdpdGhpbiAyIHNjb3BlczoKKyAgKiAgICAgICAgICAtIFNjb3BlIGVudGlyZSBBREMgKGRpZmZlcmVudGlhdGlvbiBkb25lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBvdGhlciBTVE0zMiBzZXJpZXMgZmVhdHVyaW5nIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpOiBDbG9ja1ByZXNjYWxlciwgUmVzb2x1dGlvbiwgRGF0YUFsaWduLAorICAqICAgICAgICAgICAgU2NhbkNvbnZNb2RlLCBFT0NTZWxlY3Rpb24sIExvd1Bvd2VyQXV0b1dhaXQuCisgICogICAgICAgICAgLSBTY29wZSBBREMgZ3JvdXAgcmVndWxhcjogQ29udGludW91c0NvbnZNb2RlLCBOYnJPZkNvbnZlcnNpb24sIERpc2NvbnRpbnVvdXNDb252TW9kZSwKKyAgKiAgICAgICAgICAgIEV4dGVybmFsVHJpZ0NvbnYsIEV4dGVybmFsVHJpZ0NvbnZFZGdlLCBETUFDb250aW51b3VzUmVxdWVzdHMsIE92ZXJydW4sIE92ZXJzYW1wbGluZ01vZGUsIE92ZXJzYW1wbGluZy4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZAorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzIGV4Y2VwdCAnQ2xvY2tQcmVzY2FsZXInIGFuZCAnUmVzb2x1dGlvbic6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgSWYgQURDIGlzIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycyBzZXR0aW5nIGlzIGJ5cGFzc2VkCisgICogICAgICAgICB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgCisgICogICAgICAgICAod2hpY2ggZnVsZmlsbHMgdGhlIEFEQyBzdGF0ZSBjb25kaXRpb24pIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAvKiE8IFNlbGVjdCBBREMgY2xvY2sgc291cmNlIChzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQVBCIGNsb2NrIG9yIGFzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gc3lzdGVtIGNsb2NrIG9yIFBMTCAoUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgbGlzdCBvZiBjbG9ja3MgYXZhaWxhYmxlKSkgYW5kIGNsb2NrIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIEFEQyBjbG9jayBjb25maWd1cmF0aW9uIGlzIGNvbW1vbiB0byBhbGwgQURDIGluc3RhbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2Ygc3luY2hyb25vdXMgY2xvY2sgbW9kZSBiYXNlZCBvbiBIQ0xLLzEsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgc3lzdGVtIGNsb2NrIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIFJDQyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYnlwYXNzZWQgYW5kIFBDTEsgY2xvY2sgbXVzdCBoYXZlIDUwJSBkdXR5IGN5Y2xlKS4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgYXN5bmNocm9ub3VzIGNsb2NrLCB0aGUgc2VsZWN0ZWQgY2xvY2sgbXVzdCBiZSBwcmVsaW1pbmFyaWx5IGVuYWJsZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIGFsbCBBREMgaW5zdGFuY2VzIGFyZSBkaXNhYmxlZC4gKi8KKworICB1aW50MzJfdCBSZXNvbHV0aW9uOyAgICAgICAgICAgIC8qITwgQ29uZmlndXJlIHRoZSBBREMgcmVzb2x1dGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfUkVTT0xVVElPTiAqLworCisgIHVpbnQzMl90IERhdGFBbGlnbjsgICAgICAgICAgICAgLyohPCBTcGVjaWZ5IEFEQyBkYXRhIGFsaWdubWVudCBpbiBjb252ZXJzaW9uIGRhdGEgcmVnaXN0ZXIgKHJpZ2h0IG9yIGxlZnQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzIHZlcnN1cyByZXNvbHV0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19EQVRBX0FMSUdOICovCisKKyAgdWludDMyX3QgU2NhbkNvbnZNb2RlOyAgICAgICAgICAvKiE8IENvbmZpZ3VyZSB0aGUgc2VxdWVuY2VyIG9mIEFEQyBncm91cCByZWd1bGFyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMgImZ1bGx5IGNvbmZpZ3VyYWJsZSIgb3IgIm5vdCBmdWxseSBjb25maWd1cmFibGUiIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2VxdWVuY2VyIGNvbmZpZ3VyZWQgdG8gZnVsbHkgY29uZmlndXJhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBTZXQgbnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlcXVlbmNlciBjb25maWd1cmVkIHRvIG5vdCBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IG51bWJlciBvZiBjaGFubmVscyBzZXQgaW4gdGhlIHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSBsb3dlc3QgY2hhbm5lbCBudW1iZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFzc29jaWF0ZWQgdG8gcGFyYW1ldGVyICdEaXNjb250aW51b3VzQ29udk1vZGUnIHRvIGhhdmUgbWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZXIgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGlmIHNldmVyYWwgY2hhbm5lbHMgYXJlIHNldCAoc2VxdWVuY2VyIGNhbm5vdCBiZSBkaXNhYmxlZCwgYXMgaXQgY2FuIGJlIHRoZSBjYXNlIG9uIG90aGVyIFNUTTMyIGRldmljZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb25seSAxIGNoYW5uZWwgaXMgc2V0OiBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldmVyYWwgY2hhbm5lbHMgYXJlIHNldDogIENvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2VxdWVuY2UgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX1NjYW5fbW9kZSAqLworCisgIHVpbnQzMl90IEVPQ1NlbGVjdGlvbjsgICAgICAgICAgLyohPCBTcGVjaWZ5IHdoaWNoIEVPQyAoRW5kIE9mIENvbnZlcnNpb24pIGZsYWcgaXMgdXNlZCBmb3IgY29udmVyc2lvbiBieSBwb2xsaW5nIGFuZCBpbnRlcnJ1cHRpb246IGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gb3IgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfRU9DU2VsZWN0aW9uLiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBMb3dQb3dlckF1dG9XYWl0OyAvKiE8IFNlbGVjdCB0aGUgZHluYW1pYyBsb3cgcG93ZXIgQXV0byBEZWxheTogbmV3IGNvbnZlcnNpb24gc3RhcnQgb25seSB3aGVuIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAoZm9yIEFEQyBncm91cCByZWd1bGFyKSBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBhdXRvbWF0aWNhbGx5IGFkYXB0cyB0aGUgZnJlcXVlbmN5IG9mIEFEQyBjb252ZXJzaW9ucyB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHN5c3RlbSB0aGF0IHJlYWRzIHRoZSBkYXRhLiBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG93IGZyZXF1ZW5jeSBhcHBsaWNhdGlvbnMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIChIQUxfQURDX1N0YXJ0X0lUKCksIEhBTF9BRENfU3RhcnRfRE1BKCkpIHNpbmNlIHRoZXkgY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmcmVlIHRoZSBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24gd2l0aCBIQUxfQURDX1N0YXJ0KCksIDIuIExhdGVyIG9uLCB3aGVuIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKSB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQgSEFMX0FEQ19HZXRWYWx1ZSgpIHRvIHJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0IGFuZCB0cmlnIGFub3RoZXIgY29udmVyc2lvbiBzdGFydC4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgTG93UG93ZXJBdXRvUG93ZXJPZmY7IC8qITwgU2VsZWN0IHRoZSBhdXRvLW9mZiBtb2RlOiB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIGNvbnZlcnNpb24gYW5kIGF1dG9tYXRpY2FsbHkgd2FrZXMtdXAgd2hlbiBhIG5ldyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZCAod2l0aCBzdGFydHVwIHRpbWUgYmV0d2VlbiB0cmlnZ2VyIGFuZCBzdGFydCBvZiBzYW1wbGluZykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggYXV0b21hdGljIHdhaXQgbW9kZSAocGFyYW1ldGVyICdMb3dQb3dlckF1dG9XYWl0JykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgZW5hYmxlZCwgdGhpcyBmZWF0dXJlIGFsc28gdHVybnMgb2ZmIHRoZSBBREMgZGVkaWNhdGVkIDE0IE1IeiBSQyBvc2NpbGxhdG9yIChIU0kxNCkgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgQ29udGludW91c0NvbnZNb2RlOyAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGUgKG9uZSBjb252ZXJzaW9uKSBvciBjb250aW51b3VzIG1vZGUgZm9yIEFEQyBncm91cCByZWd1bGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGZpcnN0IEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgb2NjdXJyZWQgKHNvZnR3YXJlIHN0YXJ0IG9yIGV4dGVybmFsIHRyaWdnZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4gKi8KKworICB1aW50MzJfdCBOYnJPZkNvbnZlcnNpb247ICAgICAgIC8qITwgU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJhbmtzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgd2l0aGluIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGRlcGVuZGVudCBvbiBTY2FuQ29udk1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzZXF1ZW5jZXIgY29uZmlndXJlZCB0byBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMgY29uZmlndXJhYmxlIHVzaW5nIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogQWZ0ZXIgdGhlIGZpcnN0IGNhbGwgb2YgJ0hBTF9BRENfSW5pdCgpJywgZWFjaCByYW5rIGNvcnJlc3BvbmRpbmcgdG8gcGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iIG11c3QgYmUgc2V0IHVzaW5nICdIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKScuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZnRlcndhcmRzLCB3aGVuIGFsbCBuZWVkZWQgc2VxdWVuY2VyIHJhbmtzIGFyZSBzZXQsIHBhcmFtZXRlciAnTmJyT2ZDb252ZXJzaW9uJyBjYW4gYmUgdXBkYXRlZCB3aXRob3V0IG1vZGlmeWluZyBjb25maWd1cmF0aW9uIG9mIHNlcXVlbmNlciByYW5rcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcXVlbmNlciByYW5rcyBhYm92ZSAnTmJyT2ZDb252ZXJzaW9uJyBhcmUgZGlzY2FyZGVkKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlcXVlbmNlciBjb25maWd1cmVkIHRvIG5vdCBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZS4gVGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gcmVndWxhciBncm91cCAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQgbGF1bmNoIGEgY29udmVyc2lvbikuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zIHNlcXVlbmNlIG9mIEFEQyBncm91cCByZWd1bGFyIGlzIHBlcmZvcm1lZCBpbiBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZiBzZXF1ZW5jZXIgaXMgZW5hYmxlZCAocGFyYW1ldGVyICdTY2FuQ29udk1vZGUnKS4gSWYgc2VxdWVuY2VyIGlzIGRpc2FibGVkLCB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQuIElmIGNvbnRpbnVvdXMgbW9kZSBpcyBlbmFibGVkLCB0aGlzIHBhcmFtZXRlciBzZXR0aW5nIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBudW1iZXIgb2YgZGlzY29udGludW91cyByYW5rcyBpbmNyZW1lbnQgaXMgZml4ZWQgdG8gb25lLWJ5LW9uZS4gKi8KKworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdDb252OyAgICAgIC8qITwgU2VsZWN0IHRoZSBleHRlcm5hbCBldmVudCBzb3VyY2UgdXNlZCB0byB0cmlnZ2VyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gQURDX1NPRlRXQVJFX1NUQVJULCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQgYW5kIHNvZnR3YXJlIHRyaWdnZXIgaXMgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfcmVndWxhcl9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIGNvbW1vbiB0byBhbGwgQURDIGluc3RhbmNlcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnZFZGdlOyAgLyohPCBTZWxlY3QgdGhlIGV4dGVybmFsIGV2ZW50IGVkZ2UgdXNlZCB0byB0cmlnZ2VyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cmlnZ2VyIHNvdXJjZSBpcyBzZXQgdG8gQURDX1NPRlRXQVJFX1NUQVJULCB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfZWRnZSAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBETUFDb250aW51b3VzUmVxdWVzdHM7IC8qITwgU3BlY2lmeSB3aGV0aGVyIHRoZSBETUEgcmVxdWVzdHMgYXJlIHBlcmZvcm1lZCBpbiBvbmUgc2hvdCBtb2RlIChETUEgdHJhbnNmZXIgc3RvcHMgd2hlbiBudW1iZXIgb2YgY29udmVyc2lvbnMgaXMgcmVhY2hlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGluIGNvbnRpbnVvdXMgbW9kZSAoRE1BIHRyYW5zZmVyIHVubGltaXRlZCwgd2hhdGV2ZXIgbnVtYmVyIG9mIGNvbnZlcnNpb25zKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjb250aW51b3VzIG1vZGUsIERNQSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZS4gT3RoZXJ3aXNlIGFuIG92ZXJydW4gd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBETUEgYnVmZmVyIG1heGltdW0gcG9pbnRlciBpcyByZWFjaGVkLiAqLworCisgIHVpbnQzMl90IE92ZXJydW47ICAgICAgICAgICAgICAgLyohPCBTZWxlY3QgdGhlIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiBvciBwcmVzZXJ2ZWQgKGRlZmF1bHQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2Ygb3ZlcnJ1biBzZXQgdG8gZGF0YSBwcmVzZXJ2ZWQgYW5kIHVzYWdlIHdpdGggcHJvZ3JhbW1pbmcgbW9kZWwgd2l0aCBpbnRlcnJ1cHRpb24gKEhBTF9TdGFydF9JVCgpKTogQURDIElSUSBoYW5kbGVyIGhhcyB0byBjbGVhciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBjb252ZXJzaW9uIGZsYWdzLCB0aGlzIGluZHVjZXMgdGhlIHJlbGVhc2Ugb2YgdGhlIHByZXNlcnZlZCBkYXRhLiBJZiBuZWVkZWQsIHRoaXMgZGF0YSBjYW4gYmUgc2F2ZWQgaW4gZnVuY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSwgcGxhY2VkIGluIHVzZXIgcHJvZ3JhbSBjb2RlIChjYWxsZWQgYmVmb3JlIGVuZCBvZiBjb252ZXJzaW9uIGZsYWdzIGNsZWFyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEVycm9yIHJlcG9ydGluZyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnZlcnNpb24gbW9kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2Ugd2l0aCBBREMgY29udmVyc2lvbiBieSBwb2xsaW5nIGZvciBldmVudCBvciBpbnRlcnJ1cHRpb246IEVycm9yIGlzIHJlcG9ydGVkIG9ubHkgaWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSBwcmVzZXJ2ZWQuIElmIG92ZXJydW4gaXMgc2V0IHRvIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuLCB1c2VyIGNhbiB3aWxsaW5nbHkgbm90IHJlYWQgYWxsIHRoZSBjb252ZXJ0ZWQgZGF0YSwgdGhpcyBpcyBub3QgY29uc2lkZXJlZCBhcyBhbiBlcnJvbmVvdXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2Ugd2l0aCBBREMgY29udmVyc2lvbiBieSBETUE6IEVycm9yIGlzIHJlcG9ydGVkIHdoYXRldmVyIG92ZXJydW4gc2V0dGluZyAoRE1BIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgYWxsIGRhdGEgZnJvbSBkYXRhIHJlZ2lzdGVyKS4gKi8KKworICB1aW50MzJfdCBTYW1wbGluZ1RpbWVDb21tb24xOyAgIC8qITwgU2V0IHNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGEgZ3JvdXAgb2YgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZSAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMsIDEwLjUgY3ljbGVzIGF0IDEwIGJpdHMsIDguNSBjeWNsZXMgYXQgOCBiaXRzLCA2LjUgY3ljbGVzIGF0IDYgYml0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbiB0aGlzIFNUTTMyIGZhbWlseSwgdHdvIGRpZmZlcmVudCBzYW1wbGluZyB0aW1lIHNldHRpbmdzIGFyZSBhdmFpbGFibGUsIGVhY2ggY2hhbm5lbCBjYW4gdXNlIG9uZSBvZiB0aGVzZSB0d28gc2V0dGluZ3MuIE9uIHNvbWUgb3RoZXIgU1RNMzIgZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgaW4gY2hhbm5lbCB3aXNlIGFuZCBpcyBsb2NhdGVkIGludG8gQURDIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lIGNhbiBiZSBhZGp1c3RlZCBpbiBmdW5jdGlvbiBvZiBBREMgY2xvY2sgZnJlcXVlbmN5IGFuZCBzYW1wbGluZyB0aW1lIHNldHRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IGZldyB0ZW5zIG9mIG1pY3Jvc2Vjb25kcykuICovCisKKyAgdWludDMyX3QgU2FtcGxpbmdUaW1lQ29tbW9uMjsgICAvKiE8IFNldCBzYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhIGdyb3VwIG9mIGNoYW5uZWxzLCBzZWNvbmQgY29tbW9uIHNldHRpbmcgcG9zc2libGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZSAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMsIDEwLjUgY3ljbGVzIGF0IDEwIGJpdHMsIDguNSBjeWNsZXMgYXQgOCBiaXRzLCA2LjUgY3ljbGVzIGF0IDYgYml0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbiB0aGlzIFNUTTMyIGZhbWlseSwgdHdvIGRpZmZlcmVudCBzYW1wbGluZyB0aW1lIHNldHRpbmdzIGFyZSBhdmFpbGFibGUsIGVhY2ggY2hhbm5lbCBjYW4gdXNlIG9uZSBvZiB0aGVzZSB0d28gc2V0dGluZ3MuIE9uIHNvbWUgb3RoZXIgU1RNMzIgZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgaW4gY2hhbm5lbCB3aXNlIGFuZCBpcyBsb2NhdGVkIGludG8gQURDIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnRzIG11c3QgYmUgcmVzcGVjdGVkIChzYW1wbGluZyB0aW1lIGNhbiBiZSBhZGp1c3RlZCBpbiBmdW5jdGlvbiBvZiBBREMgY2xvY2sgZnJlcXVlbmN5IGFuZCBzYW1wbGluZyB0aW1lIHNldHRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcywgcGFyYW1ldGVycyBUU192cmVmaW50LCBUU192YmF0LCBUU190ZW1wICh2YWx1ZXMgcm91Z2ggb3JkZXI6IGZldyB0ZW5zIG9mIG1pY3Jvc2Vjb25kcykuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIE92ZXJzYW1wbGluZ01vZGU7ICAgICAgIC8qITwgU3BlY2lmeSB3aGV0aGVyIHRoZSBvdmVyc2FtcGxpbmcgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgbW9kaWZpZWQgb25seSBpZiB0aGVyZSBpcyBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuICovCisKKyAgQURDX092ZXJzYW1wbGluZ1R5cGVEZWYgT3ZlcnNhbXBsaW5nOyAgIC8qITwgU3BlY2lmeSB0aGUgT3ZlcnNhbXBsaW5nIHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBvdmVyc2FtcGxpbmcgY29uZmlndXJhdGlvbiBpZiBvdmVyc2FtcGxpbmcgaXMgYWxyZWFkeSBlbmFibGVkLiAqLworCisgIHVpbnQzMl90IFRyaWdnZXJGcmVxdWVuY3lNb2RlOyAgLyohPCBTZXQgQURDIHRyaWdnZXIgZnJlcXVlbmN5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfUkVHX1RSSUdHRVJfRlJFUS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIG11c3QgYmUgc2V0IHRvIGxvdyBmcmVxdWVuY3kgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkdXJhdGlvbiBpcyBleGNlZWRlZCBiZWZvcmUgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJldHdlZW4gQURDIGVuYWJsZSBhbmQgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYmV0d2VlbiB0d28gQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiB2YWx1ZTogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0SWRsZSIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIGlzIHNldCB0byBsb3cgZnJlcXVlbmN5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhcm0gY3ljbGVzIGFyZSBpbnNlcnRlZCBiZWZvcmUgcGVyZm9ybWluZyBBREMgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGluZHVjaW5nIGEgZGVsYXkgb2YgMiBBREMgY2xvY2sgY3ljbGVzLiAqLworCit9QURDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBjaGFubmVsIGZvciByZWd1bGFyIGdyb3VwCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBncm91cC4KKyAgKiAgICAgICAgIElmIEFEQyBpcyBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZAorICAqICAgICAgICAgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaCBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikKKyAgKiAgICAgICAgIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2hhbm5lbDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZ5IHRoZSBjaGFubmVsIHRvIGNvbmZpZ3VyZSBpbnRvIEFEQyByZWd1bGFyIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIEFEQyBpbnN0YW5jZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gZGV2aWNlIHBhY2thZ2UgcGlucy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LiAqLworCisgIHVpbnQzMl90IFJhbms7ICAgICAgICAgICAgICAgICAgIC8qITwgQWRkIG9yIHJlbW92ZSB0aGUgY2hhbm5lbCBmcm9tIEFEQyByZWd1bGFyIGdyb3VwIHNlcXVlbmNlciBhbmQgc3BlY2lmeSBpdHMgY29udmVyc2lvbiByYW5rLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGRlcGVuZGVudCBvbiBTY2FuQ29udk1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzZXF1ZW5jZXIgY29uZmlndXJlZCB0byBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVscyBvcmRlcmluZyBpbnRvIGVhY2ggcmFuayBvZiBzY2FuIHNlcXVlbmNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXIgY2hhbm5lbCBjYW4gYmUgcGxhY2VkIGludG8gd2hhdGV2ZXIgcmFuay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlcXVlbmNlciBjb25maWd1cmVkIHRvIG5vdCBmdWxseSBjb25maWd1cmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNwaXRlIHRoZSBjaGFubmVsIHJhbmsgaXMgZml4ZWQsIHRoaXMgcGFyYW1ldGVyIGFsbG93IGFuIGFkZGl0aW9uYWwgcG9zc2liaWxpdHk6IHRvIHJlbW92ZSB0aGUgc2VsZWN0ZWQgcmFuayAoc2VsZWN0ZWQgY2hhbm5lbCkgZnJvbSBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX1JFR19TRVFfUkFOS1MgKi8KKworICB1aW50MzJfdCBTYW1wbGluZ1RpbWU7ICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMsIDEwLjUgY3ljbGVzIGF0IDEwIGJpdHMsIDguNSBjeWNsZXMgYXQgOCBiaXRzLCA2LjUgY3ljbGVzIGF0IDYgYml0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX1NBTVBMSU5HVElNRV9DT01NT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBPbiB0aGlzIFNUTTMyIGZhbWlseSwgdHdvIGRpZmZlcmVudCBzYW1wbGluZyB0aW1lIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKHJlZmVyIHRvIHBhcmFtZXRlcnMgIlNhbXBsaW5nVGltZUNvbW1vbjEiIGFuZCAiU2FtcGxpbmdUaW1lQ29tbW9uMiIpLCBlYWNoIGNoYW5uZWwgY2FuIHVzZSBvbmUgb2YgdGhlc2UgdHdvIHNldHRpbmdzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiB1c2FnZSBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVscyAoVnJlZkludC9WYmF0L1RlbXBTZW5zb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciB0aW1pbmdzIHZhbHVlcy4gKi8KKworfUFEQ19DaGFubmVsQ29uZlR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGFuYWxvZyB3YXRjaGRvZworICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzIGV4Y2VwdCAnSGlnaFRocmVzaG9sZCcsICdMb3dUaHJlc2hvbGQnOiBBREMgZGlzYWJsZWQgb3IgQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cHMgcmVndWxhci4KKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdIaWdoVGhyZXNob2xkJywgJ0xvd1RocmVzaG9sZCc6IEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgV2F0Y2hkb2dOdW1iZXI7ICAgIC8qITwgU2VsZWN0IHdoaWNoIEFEQyBhbmFsb2cgd2F0Y2hkb2cgaXMgbW9uaXRvcmluZyB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiBPbmx5IDEgY2hhbm5lbCBjYW4gYmUgbW9uaXRvcmVkIChvciBvdmVyYWxsIGdyb3VwIG9mIGNoYW5uZWxzIGJ5IHNldHRpbmcgcGFyYW1ldGVyICdXYXRjaGRvZ01vZGUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZCAoYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiAnSEFMX0FEQ19BbmFsb2dXREdDb25maWcoKScgZm9yIGVhY2ggY2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0FXRF9OVU1CRVIuICovCisKKyAgdWludDMyX3QgV2F0Y2hkb2dNb2RlOyAgICAgIC8qITwgQ29uZmlndXJlIHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIG1vZGU6IHNpbmdsZS9hbGwvbm9uZSBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZTogc2luZ2xlIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLCBBREMgZ3JvdXAgcmVndWxhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAyIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQgYnkgYXBwbHlpbmcgc3VjY2Vzc2l2ZWx5IHRoZSBBV0QgaW5pdCBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlLiAqLworCisgIHVpbnQzMl90IENoYW5uZWw7ICAgICAgICAgICAvKiE8IFNlbGVjdCB3aGljaCBBREMgY2hhbm5lbCB0byBtb25pdG9yIGJ5IGFuYWxvZyB3YXRjaGRvZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiB0aGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgcGFyYW1ldGVyICdXYXRjaGRvZ01vZGUnIGlzIGNvbmZpZ3VyZWQgb24gc2luZ2xlIGNoYW5uZWwgKG9ubHkgMSBjaGFubmVsIGNhbiBiZSBtb25pdG9yZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZC4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgY2FsbCBzdWNjZXNzaXZlbHkgdGhlIGZ1bmN0aW9uIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgZm9yIGVhY2ggY2hhbm5lbCB0byBiZSBhZGRlZCAob3IgcmVtb3ZlZCB3aXRoIHZhbHVlICdBRENfQU5BTE9HV0FUQ0hET0dfTk9ORScpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTC4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgSVRNb2RlOyAgICAgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBjb25maWd1cmVkIGluIGludGVycnVwdCBvciBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50MzJfdCBIaWdoVGhyZXNob2xkOyAgICAgLyohPCBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYgYml0cyksIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogQW5hbG9nIHdhdGNoZG9nIDIgYW5kIDMgYXJlIGxpbWl0ZWQgdG8gYSByZXNvbHV0aW9uIG9mIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMgMTIgYml0cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzIHRoZSAyIExTQiBhcmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzYW1wbGluZyBmaW5hbCBjb21wdXRhdGlvbiAoYWZ0ZXIgcmF0aW8gYW5kIHNoaWZ0IGFwcGxpY2F0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLiAqLworCisgIHVpbnQzMl90IExvd1RocmVzaG9sZDsgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgTG93IHRocmVzaG9sZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMiwgMTAsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkYsIDB4M0ZGLCAweEZGIG9yIDB4M0YgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBBbmFsb2cgd2F0Y2hkb2cgMiBhbmQgMyBhcmUgbGltaXRlZCB0byBhIHJlc29sdXRpb24gb2YgOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJZiBBREMgb3ZlcnNhbXBsaW5nIGlzIGVuYWJsZWQsIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wYWN0ZWQ6IHRoZSBjb21wYXJpc29uIG9mIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGlzIGRvbmUgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnNhbXBsaW5nIGZpbmFsIGNvbXB1dGF0aW9uIChhZnRlciByYXRpbyBhbmQgc2hpZnQgYXBwbGljYXRpb24pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cykuICovCit9QURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmOworCisvKiogQGRlZmdyb3VwIEFEQ19TdGF0ZXMgQURDIFN0YXRlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSEFMIEFEQyBzdGF0ZSBtYWNoaW5lOiBBREMgc3RhdGVzIGRlZmluaXRpb24gKGJpdGZpZWxkcykKKyAgKiBAbm90ZSAgIEFEQyBzdGF0ZSBtYWNoaW5lIGlzIG1hbmFnZWQgYnkgYml0ZmllbGRzLCBzdGF0ZSBtdXN0IGJlIGNvbXBhcmVkCisgICogICAgICAgICB3aXRoIGJpdCBieSBiaXQuCisgICogICAgICAgICBGb3IgZXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSkgIT0gMFVMKSAiCisgICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMSkgIT0gMFVMKSAiCisgICovCisvKiBTdGF0ZXMgb2YgQURDIGdsb2JhbCBzY29wZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFU0VUICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgLyohPCBBREMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFQURZICAgICAgICAgICAgICgweDAwMDAwMDAxVUwpICAgLyohPCBBREMgcGVyaXBoZXJhbCByZWFkeSBmb3IgdXNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCAgICAgKDB4MDAwMDAwMDJVTCkgICAvKiE8IEFEQyBpcyBidXN5IGR1ZSB0byBhbiBpbnRlcm5hbCBwcm9jZXNzIChpbml0aWFsaXphdGlvbiwgY2FsaWJyYXRpb24pICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfVElNRU9VVCAgICAgICAgICAgKDB4MDAwMDAwMDRVTCkgICAvKiE8IFRpbWVPdXQgb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGVycm9ycyAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMICAgICgweDAwMDAwMDEwVUwpICAgLyohPCBJbnRlcm5hbCBlcnJvciBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHICAgICAgKDB4MDAwMDAwMjBVTCkgICAvKiE8IENvbmZpZ3VyYXRpb24gZXJyb3Igb2NjdXJyZW5jZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSAgICAgICAgICgweDAwMDAwMDQwVUwpICAgLyohPCBETUEgZXJyb3Igb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSAgICAgICAgICAoMHgwMDAwMDEwMFVMKSAgIC8qITwgQSBjb252ZXJzaW9uIG9uIEFEQyBncm91cCByZWd1bGFyIGlzIG9uZ29pbmcgb3IgY2FuIG9jY3VyIChlaXRoZXIgYnkgY29udGludW91cyBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyLCBsb3cgcG93ZXIgYXV0byBwb3dlci1vbiAoaWYgZmVhdHVyZSBhdmFpbGFibGUpLCBtdWx0aW1vZGUgQURDIG1hc3RlciBjb250cm9sIChpZiBmZWF0dXJlIGF2YWlsYWJsZSkpICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX0VPQyAgICAgICAgICAgKDB4MDAwMDAyMDBVTCkgICAvKiE8IENvbnZlcnNpb24gZGF0YSBhdmFpbGFibGUgb24gZ3JvdXAgcmVndWxhciAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19PVlIgICAgICAgICAgICgweDAwMDAwNDAwVUwpICAgLyohPCBPdmVycnVuIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVAgICAgICAgICAoMHgwMDAwMDgwMFVMKSAgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBFbmQgT2YgU2FtcGxpbmcgZmxhZyByYWlzZWQgICovCisKKy8qIFN0YXRlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSAgICAgICAgICAoMHgwMDAwMTAwMFVMKSAgLyohPCBOb3QgYXZhaWxhYmxlIG9uIHRoaXMgU1RNMzIgc2VyaWU6IEEgY29udmVyc2lvbiBvbiBncm91cCBpbmplY3RlZCBpcyBvbmdvaW5nIG9yIGNhbiBvY2N1ciAoZWl0aGVyIGJ5IGF1dG8taW5qZWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciwgbG93IHBvd2VyIGF1dG8gcG93ZXItb24gKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSwgbXVsdGltb2RlIEFEQyBtYXN0ZXIgY29udHJvbCAoaWYgZmVhdHVyZSBhdmFpbGFibGUpKSovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0VPQyAgICAgICAgICAgKDB4MDAwMDIwMDBVTCkgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGICAgICAgICAgKDB4MDAwMDQwMDBVTCkgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBJbmplY3RlZCBxdWV1ZSBvdmVyZmxvdyBvY2N1cnJlbmNlICovCisKKy8qIFN0YXRlcyBvZiBBREMgYW5hbG9nIHdhdGNoZG9ncyAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRDEgICAgICAgICAgICAgICgweDAwMDEwMDAwVUwpICAgLyohPCBPdXQtb2Ytd2luZG93IG9jY3VycmVuY2Ugb2YgQURDIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMiAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVTCkgICAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QzICAgICAgICAgICAgICAoMHgwMDA0MDAwMFVMKSAgIC8qITwgT3V0LW9mLXdpbmRvdyBvY2N1cnJlbmNlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyAqLworCisvKiBTdGF0ZXMgb2YgQURDIG11bHRpLW1vZGUgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9NVUxUSU1PREVfU0xBVkUgICAoMHgwMDEwMDAwMFVMKSAgIC8qITwgTm90IGF2YWlsYWJsZSBvbiB0aGlzIFNUTTMyIHNlcmllOiBBREMgaW4gbXVsdGltb2RlIHNsYXZlIHN0YXRlLCBjb250cm9sbGVkIGJ5IGFub3RoZXIgQURDIG1hc3RlciAod2hlbiBmZWF0dXJlIGF2YWlsYWJsZSkgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAYnJpZWYgIEFEQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZgoreworICBBRENfVHlwZURlZiAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworICBBRENfSW5pdFR5cGVEZWYgICAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFuZCByZWd1bGFyIGNvbnZlcnNpb25zIHNldHRpbmcgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgKkRNQV9IYW5kbGU7ICAgICAgICAgICAgLyohPCBQb2ludGVyIERNQSBIYW5kbGVyICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGxvY2tpbmcgb2JqZWN0ICovCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgIC8qITwgQURDIGNvbW11bmljYXRpb24gc3RhdGUgKGJpdG1hcCBvZiBBREMgc3RhdGVzKSAqLworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAgICAvKiE8IEFEQyBFcnJvciBjb2RlICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgQURDR3JvdXBSZWd1bGFyU2VxdWVuY2VyUmFua3M7IC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIG1lbW9yaXphdGlvbiBvZiByYW5rcyBzZXR0aW5nLCB1c2VkIGluIG1vZGUgImZ1bGx5IGNvbmZpZ3VyYWJsZSIgKHJlZmVyIHRvIHBhcmFtZXRlciAnU2NhbkNvbnZNb2RlJykgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogQ29udkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAgICAgLyohPCBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICB2b2lkICgqIENvbnZIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgICAgIC8qITwgQURDIGVycm9yIGNhbGxiYWNrICovCisgIHZvaWQgKCogTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjayAqLworICB2b2lkICgqIEVuZE9mU2FtcGxpbmdDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgIC8qITwgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAgICAgIC8qITwgQURDIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfUFEQ19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgQURDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwMFUsICAvKiE8IEFEQyBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEICAgICAgICAgPSAweDAxVSwgIC8qITwgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgICA9IDB4MDJVLCAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBBREMgZXJyb3IgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgICA9IDB4MDZVLCAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQgICA9IDB4MDdVLCAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICA9IDB4MDhVLCAgLyohPCBBREMgZW5kIG9mIHNhbXBsaW5nIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA5VSwgIC8qITwgQURDIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9BRENfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDBBVSAgIC8qITwgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICovCit9IEhBTF9BRENfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIEFEQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwQURDX0NhbGxiYWNrVHlwZURlZikoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IHBvaW50ZXIgdG8gYSBBREMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRXJyb3JfQ29kZSBBREMgRXJyb3IgQ29kZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfTk9ORSAgICAgICAgICAgICAgKDB4MDBVKSAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX0lOVEVSTkFMICAgICAgICAgICgweDAxVSkgICAvKiE8IEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yIChwcm9ibGVtIG9mIGNsb2NraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlLCBlcnJvbmVvdXMgc3RhdGUsIC4uLikgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9PVlIgICAgICAgICAgICAgICAoMHgwMlUpICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfRE1BICAgICAgICAgICAgICAgKDB4MDRVKSAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAoMHgxMFUpICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICovCisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfQ09NTU9OX0NMT0NLX1NPVVJDRSAgQURDIGNvbW1vbiAtIENsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMSAgICAgICAgICAgKExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMSkgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIuIFRoaXMgY29uZmlndXJhdGlvbiBtdXN0IGJlIGVuYWJsZWQgb25seSBpZiBQQ0xLIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIHRoZSBSQ0MgbXVzdCBiZSBieXBhc3NlZCBhbmQgdGhlIHN5c3RlbSBjbG9jayBtdXN0IGJ5IDUwJSBkdXR5IGN5Y2xlKSAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVY0ICAgICAgICAgICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0ICovCisKKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEpICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYyICAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYyKSAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAyICAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjQgICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNiAgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY4ICAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVY4KSAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA4ICAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEwICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTIgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIpICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxNiAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNikgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNiAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjMyICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDMyICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNjQgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQpICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNjQgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxMjggICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjgpICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxMjggKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjI1NiAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFU09MVVRJT04gIEFEQyBpbnN0YW5jZSAtIFJlc29sdXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl8xMkIgICAgICAgICAgICAgICAgIChMTF9BRENfUkVTT0xVVElPTl8xMkIpICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTBCICAgICAgICAgICAgICAgICAoTExfQURDX1JFU09MVVRJT05fMTBCKSAgLyohPCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzICovCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzhCICAgICAgICAgICAgICAgICAgKExMX0FEQ19SRVNPTFVUSU9OXzhCKSAgIC8qITwgQURDIHJlc29sdXRpb24gIDggYml0cyAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl82QiAgICAgICAgICAgICAgICAgIChMTF9BRENfUkVTT0xVVElPTl82QikgICAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19EQVRBX0FMSUdOIEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0RBVEFBTElHTl9SSUdIVCAgICAgICAgICAgICAgICAoTExfQURDX0RBVEFfQUxJR05fUklHSFQpLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCAoYWxpZ25tZW50IG9uIGRhdGEgcmVnaXN0ZXIgTFNCIGJpdCAwKSovCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fTEVGVCAgICAgICAgICAgICAgICAgKExMX0FEQ19EQVRBX0FMSUdOX0xFRlQpICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IGxlZnQgYWxpZ25lZCAoYWxpZ21lbnQgb24gZGF0YSByZWdpc3RlciBNU0IgYml0IDE1KSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19TY2FuX21vZGUgQURDIHNlcXVlbmNlciBzY2FuIG1vZGUKKyAgKiBAeworICAqLworLyogTm90ZTogT24gdGhpcyBTVE0zMiBmYW1pbHksIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBib3RoIG1vZGVzICAgICAgICAgKi8KKy8qICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiBhcmUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgU2NhbiBtb2RlIHZhbHVlcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzIGhhdmluZyAgKi8KKy8qICAgICAgIGEgY29uZmlndXJhYmxlIHNlcXVlbmNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBTY2FuIGRpcmVjdGlvbiBzZXR0aW5nIHZhbHVlcyBhcmUgZGVmaW5lZCBieSB0YWtpbmcgaW4gYWNjb3VudCAgICAgICAqLworLyogICAgICAgYWxyZWFkeSBkZWZpbmVkIHZhbHVlcyBmb3Igb3RoZXIgU1RNMzIgZGV2aWNlczogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgQURDX1NDQU5fRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIEFEQ19TQ0FOX0VOQUJMRSAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgU2VxdWVuY2VyIGZ1bGx5IGNvbmZpZ3VyYWJsZSB3aXRoIG9ubHkgcmFuayAxIGVuYWJsZWQgaXMgY29uc2lkZXJlZCAgKi8KKy8qICAgICAgIGFzIGRlZmF1bHQgc2V0dGluZyBlcXVpdmFsZW50IHRvIHNjYW4gZW5hYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJbiBjYXNlIG9mIG1pZ3JhdGlvbiBmcm9tIGFub3RoZXIgU1RNMzIgZGV2aWNlLCB0aGUgdXNlciB3aWxsIGJlICAgICAqLworLyogICAgICAgd2FybmVkIG9mIGNoYW5nZSBvZiBzZXR0aW5nIGNob2ljZXMgd2l0aCBhc3NlcnQgY2hlY2suICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1NDQU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2VxdWVuY2VyIHNldCB0byBmdWxseSBjb25maWd1cmFibGU6IG9ubHkgdGhlIHJhbmsgMSBpcyBlbmFibGVkIChubyBzY2FuIHNlcXVlbmNlIG9uIHNldmVyYWwgcmFua3MpICovCisjZGVmaW5lIEFEQ19TQ0FOX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoQURDX0NGR1IxX0NIU0VMUk1PRCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNlcXVlbmNlciBzZXQgdG8gZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuICovCisKKyNkZWZpbmUgQURDX1NDQU5fU0VRX0ZJWEVEICAgICAgICAgICAgICAgIChBRENfU0NBTl9TRVFfRklYRURfSU5UKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2VxdWVuY2VyIHNldCB0byBub3QgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlciAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLiBTY2FuIGRpcmVjdGlvbiBmb3J3YXJkOiBmcm9tIGNoYW5uZWwgMCB0byBjaGFubmVsIDE4ICovCisjZGVmaW5lIEFEQ19TQ0FOX1NFUV9GSVhFRF9CQUNLV0FSRCAgICAgICAoQURDX1NDQU5fU0VRX0ZJWEVEX0lOVCB8IEFEQ19DRkdSMV9TQ0FORElSKSAvKiE8IFNlcXVlbmNlciBzZXQgdG8gbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4gU2NhbiBkaXJlY3Rpb24gYmFja3dhcmQ6IGZyb20gY2hhbm5lbCAxOCB0byBjaGFubmVsIDAgKi8KKworI2RlZmluZSBBRENfU0NBTl9ESVJFQ1RJT05fRk9SV0FSRCAgICAgICAgKEFEQ19TQ0FOX1NFUV9GSVhFRCkgICAgICAgICAgICAgICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzICovCisjZGVmaW5lIEFEQ19TQ0FOX0RJUkVDVElPTl9CQUNLV0FSRCAgICAgICAoQURDX1NDQU5fU0VRX0ZJWEVEX0JBQ0tXQVJEKSAgICAgICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9zb3VyY2UgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2VzIGZvciBhbGwgQURDIGluc3RhbmNlcyAqLworI2RlZmluZSBBRENfU09GVFdBUkVfU1RBUlQgICAgICAgICAgICAoTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgaW50ZXJuYWw6IFNXIHN0YXJ0LiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yICAgICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0M0ICAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0g0KSAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2lmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPICAgICAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2VuZGlmCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTyAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTyAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDE1X1RSR08gICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTE1IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZW5kaWYKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSAgICAgKExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEpICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfZWRnZSBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIGVkZ2UgKHdoZW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyBzZWxlY3RlZCkKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZWd1bGFyIGNvbnZlcnNpb25zIGhhcmR3YXJlIHRyaWdnZXIgZGV0ZWN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcgICAgICAgICAoTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcpICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX0ZBTExJTkcgICAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcpICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lOR0ZBTExJTkcgIChMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfRU9DU2VsZWN0aW9uIEFEQyBzZXF1ZW5jZXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvciBzZXF1ZW5jZSBjb252ZXJzaW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19FT0NfU0lOR0xFX0NPTlYgICAgICAgICAoQURDX0lTUl9FT0MpICAgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gZmxhZyAgKi8KKyNkZWZpbmUgQURDX0VPQ19TRVFfQ09OViAgICAgICAgICAgIChBRENfSVNSX0VPUykgICAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zIGZsYWcgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IgIEFEQyBncm91cCByZWd1bGFyIC0gT3ZlcnJ1biBiZWhhdmlvciBvbiBjb252ZXJzaW9uIGRhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgICAgICAgIChMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCkgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46IGRhdGEgcHJlc2VydmVkICovCisjZGVmaW5lIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAgICAgICAgKExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4pICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19TRVFfUkFOS1MgIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHJhbmtzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1JBTktfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IFNldHRpbmcgcmVsZXZhbnQgaWYgcGFyYW1ldGVyICJTY2FuQ29udk1vZGUiIGlzIHNldCB0byBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogRW5hYmxlIHRoZSByYW5rIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVscy4gTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSBpcyBkZWZpbmVkIGJ5IG51bWJlciBvZiBjaGFubmVscyBlbmFibGVkLCByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBkZWZpbmVkIGJ5IGNoYW5uZWwgbnVtYmVyIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikgKi8KKyNkZWZpbmUgQURDX1JBTktfTk9ORSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IFNldHRpbmcgcmVsZXZhbnQgaWYgcGFyYW1ldGVyICJTY2FuQ29udk1vZGUiIGlzIHNldCB0byBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgcmFuayAoc2VsZWN0ZWQgY2hhbm5lbCkgZnJvbSBzZXF1ZW5jZXIgKi8KKworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMSkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzIgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMikgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzQgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzUgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNSkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNikgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzcgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzggICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfOCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1NBTVBMSU5HVElNRV9DT01NT04gIEFEQyBpbnN0YW5jZSAtIFNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGEgZ3JvdXAgb2YgY2hhbm5lbHMKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU0FNUExJTkdUSU1FX0NPTU1PTl8xICAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8xKSAvKiE8IFNldCBzYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhIGdyb3VwIG9mIGNoYW5uZWxzOiBzYW1wbGluZyB0aW1lIG5iIDEgKi8KKyNkZWZpbmUgQURDX1NBTVBMSU5HVElNRV9DT01NT05fMiAgICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMikgLyohPCBTZXQgc2FtcGxpbmcgdGltZSBjb21tb24gdG8gYSBncm91cCBvZiBjaGFubmVsczogc2FtcGxpbmcgdGltZSBuYiAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgIENoYW5uZWwgLSBTYW1wbGluZyB0aW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMUNZQ0xFXzUgICAgICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNSkgICAgIC8qITwgU2FtcGxpbmcgdGltZSAxLjUgQURDIGNsb2NrIGN5Y2xlICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSAgICAgICAgICAgKExMX0FEQ19TQU1QTElOR1RJTUVfM0NZQ0xFU181KSAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMy41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfN0NZQ0xFU181ICAgICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV83Q1lDTEVTXzUpICAgIC8qITwgU2FtcGxpbmcgdGltZSA3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8xMkNZQ0xFU181ICAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUpICAgLyohPCBTYW1wbGluZyB0aW1lIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8xOUNZQ0xFU181ICAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzE5Q1lDTEVTXzUpICAgLyohPCBTYW1wbGluZyB0aW1lIDE5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8zOUNZQ0xFU181ICAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzM5Q1lDTEVTXzUpICAgLyohPCBTYW1wbGluZyB0aW1lIDM5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV83OUNZQ0xFU181ICAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzc5Q1lDTEVTXzUpICAgLyohPCBTYW1wbGluZyB0aW1lIDc5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8xNjBDWUNMRVNfNSAgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzE2MENZQ0xFU181KSAgLyohPCBTYW1wbGluZyB0aW1lIDE2MC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMICBBREMgaW5zdGFuY2UgLSBDaGFubmVsIG51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzAgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzApICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xKSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMikgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjIgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzMpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF80KSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjUgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzYgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzYpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42ICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF83KSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONyAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOCAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfOCkgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjggICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzkgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzkpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45ICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMCAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xMCkgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTEgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTEpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzEyKSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMyAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xMykgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTQgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTQpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1ICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE1KSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNiAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xNikgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTcgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTcpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4ICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE4KSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAgICAgIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SKSAgICAgIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvci4gKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfVkJBVCkgICAgICAgICAgICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMyB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFZkZGEuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzEgICAgICAgICAgICAgICAoTExfQURDX0FXRDEpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMSAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfMiAgICAgICAgICAgICAgIChMTF9BRENfQVdEMikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAyICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR18zICAgICAgICAgICAgICAgKExMX0FEQ19BV0QzKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlIEFEQyBBbmFsb2cgV2F0Y2hkb2cgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19OT05FICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gYW5hbG9nIHdhdGNoZG9nIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcgICAgICAgICAgIChBRENfQ0ZHUjFfQVdEMVNHTCB8IEFEQ19DRkdSMV9BV0QxRU4pICAgICAgICAgICAgICAgICAgLyohPCBBbmFsb2cgd2F0Y2hkb2cgYXBwbGllZCB0byBhIHJlZ3VsYXIgZ3JvdXAgc2luZ2xlIGNoYW5uZWwgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRyAgICAgICAgICAgICAgKEFEQ19DRkdSMV9BV0QxRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyB3YXRjaGRvZyBhcHBsaWVkIHRvIHJlZ3VsYXIgZ3JvdXAgYWxsIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1JBVElPICBPdmVyc2FtcGxpbmcgLSBSYXRpbworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMiAgICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fMikgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMiAoMiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT180ICAgICAgICAgICAoTExfQURDX09WU19SQVRJT180KSAgIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiA0ICg0IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzggICAgICAgICAgIChMTF9BRENfT1ZTX1JBVElPXzgpICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDggKDggQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTYgICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fMTYpICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTYgKDE2IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzMyICAgICAgICAgIChMTF9BRENfT1ZTX1JBVElPXzMyKSAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDMyICgzMiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT182NCAgICAgICAgICAoTExfQURDX09WU19SQVRJT182NCkgIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiA2NCAoNjQgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTI4ICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fMTI4KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTI4ICgxMjggQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMjU2ICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fMjU2KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMjU2ICgyNTYgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1NISUZUICBPdmVyc2FtcGxpbmcgLSBEYXRhIHNoaWZ0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfTk9ORSAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9OT05FKSAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgbm8gc2hpZnQgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgbm90IGRpdmlkZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMSAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF8xKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMSAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDIgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMiAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF8yKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMiAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfMyAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF8zKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMyAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDggdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNCAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF80KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNCAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDE2IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzUgICAgICAgICAgICAgICAgKExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNSkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDUgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAzMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF82ICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA2IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgNjQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNyAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF83KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNyAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDEyOCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF84ICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA4IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMjU2IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX0RJU0NPTlRfTU9ERSAgT3ZlcnNhbXBsaW5nIC0gRGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX1RSSUdHRVJFRE1PREVfU0lOR0xFX1RSSUdHRVIgICAoTExfQURDX09WU19SRUdfQ09OVCkgICAgICAgICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZTogY29udGludW91cyBtb2RlIChhbGwgY29udmVyc2lvbnMgb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvIGFyZSBkb25lIGZyb20gMSB0cmlnZ2VyKSAqLworI2RlZmluZSBBRENfVFJJR0dFUkVETU9ERV9NVUxUSV9UUklHR0VSICAgIChMTF9BRENfT1ZTX1JFR19ESVNDT05UKSAgICAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlOiBkaXNjb250aW51b3VzIG1vZGUgKGVhY2ggY29udmVyc2lvbiBvZiBvdmVyc2FtcGxpbmcgcmF0aW8gbmVlZHMgYSB0cmlnZ2VyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19UUklHR0VSX0ZSRVEgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBmcmVxdWVuY3kgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19UUklHR0VSX0ZSRVFfSElHSCAgICAgICAgICAgICAgKExMX0FEQ19UUklHR0VSX0ZSRVFfSElHSCkgLyohPCBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBzZXQgdG8gaGlnaCBmcmVxdWVuY3kuIE5vdGU6IEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIG11c3QgYmUgc2V0IHRvIGxvdyBmcmVxdWVuY3kgd2hlbiBhIGR1cmF0aW9uIGlzIGV4Y2VlZGVkIGJlZm9yZSBBREMgY29udmVyc2lvbiBzdGFydCB0cmlnZ2VyIGV2ZW50IChiZXR3ZWVuIEFEQyBlbmFibGUgYW5kIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQgb3IgYmV0d2VlbiB0d28gQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudCkuIER1cmF0aW9uIHZhbHVlOiBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRJZGxlIi4gKi8KKyNkZWZpbmUgQURDX1RSSUdHRVJfRlJFUV9MT1cgICAgICAgICAgICAgICAoTExfQURDX1RSSUdHRVJfRlJFUV9MT1cpICAvKiE8IEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIHNldCB0byBsb3cgZnJlcXVlbmN5LiBOb3RlOiBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBtdXN0IGJlIHNldCB0byBsb3cgZnJlcXVlbmN5IHdoZW4gYSBkdXJhdGlvbiBpcyBleGNlZWRlZCBiZWZvcmUgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudCAoYmV0d2VlbiBBREMgZW5hYmxlIGFuZCBBREMgY29udmVyc2lvbiBzdGFydCB0cmlnZ2VyIGV2ZW50IG9yIGJldHdlZW4gdHdvIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQpLiBEdXJhdGlvbiB2YWx1ZTogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0SWRsZSIuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FdmVudF90eXBlIEFEQyBFdmVudCB0eXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0VPU01QX0VWRU5UICAgICAgICAgIChBRENfRkxBR19FT1NNUCkgLyohPCBBREMgRW5kIG9mIFNhbXBsaW5nIGV2ZW50ICovCisjZGVmaW5lIEFEQ19BV0QxX0VWRU5UICAgICAgICAgICAoQURDX0ZMQUdfQVdEMSkgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50IChtYWluIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbiBhbGwgU1RNMzIgc2VyaWVzKSAqLworI2RlZmluZSBBRENfQVdEMl9FVkVOVCAgICAgICAgICAgKEFEQ19GTEFHX0FXRDIpICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBldmVudCAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIG5vdCBwcmVzZW50IG9uIGFsbCBTVE0zMiBzZXJpZXMpICovCisjZGVmaW5lIEFEQ19BV0QzX0VWRU5UICAgICAgICAgICAoQURDX0ZMQUdfQVdEMykgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgbm90IHByZXNlbnQgb24gYWxsIFNUTTMyIHNlcmllcykgKi8KKyNkZWZpbmUgQURDX09WUl9FVkVOVCAgICAgICAgICAgIChBRENfRkxBR19PVlIpICAgLyohPCBBREMgb3ZlcnJ1biBldmVudCAqLworLyoqCisgICogQH0KKyAgKi8KKyNkZWZpbmUgQURDX0FXRF9FVkVOVCAgICAgICAgICAgIEFEQ19BV0QxX0VWRU5UICAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZXZlbnQ6IE5hbWluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgaGF2aW5nIG9ubHkgb25lIGFuYWxvZyB3YXRjaGRvZyAqLworCisvKiogQGRlZmdyb3VwIEFEQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gQURDIGludGVycnVwdHMgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19JVF9SRFkgICAgICAgICAgIEFEQ19JRVJfQURSRFlJRSAgICAvKiE8IEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9DQ1JEWSAgICAgICAgIEFEQ19JRVJfQ0NSRFlJRSAgICAvKiE8IEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9TTVAgICAgICAgICBBRENfSUVSX0VPU01QSUUgICAgLyohPCBBREMgRW5kIG9mIHNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPQyAgICAgICAgICAgQURDX0lFUl9FT0NJRSAgICAgIC8qITwgQURDIEVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9TICAgICAgICAgICBBRENfSUVSX0VPU0lFICAgICAgLyohPCBBREMgRW5kIG9mIHJlZ3VsYXIgc2VxdWVuY2Ugb2YgY29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfT1ZSICAgICAgICAgICBBRENfSUVSX09WUklFICAgICAgLyohPCBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9BV0QxICAgICAgICAgIEFEQ19JRVJfQVdEMUlFICAgICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlIChtYWluIGFuYWxvZyB3YXRjaGRvZykgKi8KKyNkZWZpbmUgQURDX0lUX0FXRDIgICAgICAgICAgQURDX0lFUl9BV0QySUUgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfSVRfQVdEMyAgICAgICAgICBBRENfSUVSX0FXRDNJRSAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDMgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19mbGFnc19kZWZpbml0aW9uIEFEQyBmbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0ZMQUdfUkRZICAgICAgICAgICBBRENfSVNSX0FEUkRZICAgIC8qITwgQURDIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQ0NSRFkgICAgICAgICBBRENfSVNSX0NDUkRZICAgIC8qITwgQURDIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWFkeSBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPU01QICAgICAgICAgQURDX0lTUl9FT1NNUCAgICAvKiE8IEFEQyBFbmQgb2YgU2FtcGxpbmcgZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19FT0MgICAgICAgICAgIEFEQ19JU1JfRU9DICAgICAgLyohPCBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPUyAgICAgICAgICAgQURDX0lTUl9FT1MgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX09WUiAgICAgICAgICAgQURDX0lTUl9PVlIgICAgICAvKiE8IEFEQyBvdmVycnVuIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQVdEMSAgICAgICAgICBBRENfSVNSX0FXRDEgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQVdEMiAgICAgICAgICBBRENfSVNSX0FXRDIgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQVdEMyAgICAgICAgICBBRENfSVNSX0FXRDMgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDX1ByaXZhdGVfTWFjcm9zIEFEQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiBNYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgSEFMIGRyaXZlciB1c2FnZSwgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gICAqLworLyogY29kZSBvZiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQGJyaWVmIFRlc3QgaWYgY29udmVyc2lvbiB0cmlnZ2VyIG9mIHJlZ3VsYXIgZ3JvdXAgaXMgc29mdHdhcmUgc3RhcnQKKyAgKiAgICAgICAgb3IgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBTRVQgKHNvZnR3YXJlIHN0YXJ0KSBvciBSRVNFVCAoZXh0ZXJuYWwgdHJpZ2dlcikKKyAgKi8KKyNkZWZpbmUgQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUjEgJiBBRENfQ0ZHUjFfRVhURU4pID09IDBVTCkKKworLyoqCisgICogQGJyaWVmIFJldHVybiByZXNvbHV0aW9uIGJpdHMgaW4gQ0ZHUjEgcmVnaXN0ZXIgUkVTWzE6MF0gZmllbGQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgVmFsdWUgb2YgYml0ZmllbGQgUkVTIGluIENGR1IxIHJlZ2lzdGVyLgorICAqLworI2RlZmluZSBBRENfR0VUX1JFU09MVVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19HZXRSZXNvbHV0aW9uKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgQURDIGVycm9yIGNvZGUgKHNldCBpdCB0byBubyBlcnJvciBjb2RlICJIQUxfQURDX0VSUk9SX05PTkUiKS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DTEVBUl9FUlJPUkNPREUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+RXJyb3JDb2RlID0gSEFMX0FEQ19FUlJPUl9OT05FKSAKKworLyoqCisgICogQGJyaWVmIFNpbXVsdGFuZW91c2x5IGNsZWFyIGFuZCBzZXQgc3BlY2lmaWMgYml0cyBvZiB0aGUgaGFuZGxlIFN0YXRlLgorICAqIEBub3RlICBBRENfU1RBVEVfQ0xSX1NFVCgpIG1hY3JvIGlzIG1lcmVseSBhbGlhc2VkIHRvIGdlbmVyaWMgbWFjcm8gTU9ESUZZX1JFRygpLAorICAqICAgICAgICB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBBREMgaGFuZGxlIFN0YXRlLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUKKyAgKiAgICAgICAgYml0IGZpZWxkIHRvIGNsZWFyLCB0aGUgdGhpcmQgYW5kIGxhc3QgcGFyYW1ldGVyIGlzIHRoZSBiaXQgZmllbGQgdG8gc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfU1RBVEVfQ0xSX1NFVCBNT0RJRllfUkVHCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIGZvciByZWd1bGFyIGdyb3VwCisgICogQHBhcmFtIF9SRUdfRElTQ09OVElOVU9VU19NT0RFXzogUmVndWxhciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMoX1JFR19ESVNDT05USU5VT1VTX01PREVfKSAgICAgICAgICAgICAgICAgXAorICAoKF9SRUdfRElTQ09OVElOVU9VU19NT0RFXykgPDwgMTZVKQorICAKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIEFEQyBhdXRvIG9mZiBtb2RlLgorICAqIEBwYXJhbSBfQVVUT09GRl8gQXV0byBvZmYgYml0IGVuYWJsZSBvciBkaXNhYmxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUjFfQVVUT09GRihfQVVUT09GRl8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfQVVUT09GRl8pIDw8IDE1VSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgQURDIGF1dG8gZGVsYXkgbW9kZS4KKyAgKiBAcGFyYW0gX0FVVE9XQUlUXyBBdXRvIGRlbGF5IGJpdCBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1IxX0FVVE9XQUlUKF9BVVRPV0FJVF8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX0FVVE9XQUlUXykgPDwgMTRVKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZS4KKyAgKiBAcGFyYW0gX0NPTlRJTlVPVVNfTU9ERV8gQ29udGludW91cyBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUjFfQ09OVElOVU9VUyhfQ09OVElOVU9VU19NT0RFXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfQ09OVElOVU9VU19NT0RFXykgPDwgMTNVKQorICAgIAorLyoqCisgICogQGJyaWVmIEVuYWJsZSBBREMgb3ZlcnJ1biBtb2RlLgorICAqIEBwYXJhbSBfT1ZFUlJVTl9NT0RFXyBPdmVycnVuIG1vZGUuCisgICogQHJldHZhbCBPdmVydW4gYml0IHNldHRpbmcgdG8gYmUgcHJvZ3JhbW1lZCBpbnRvIENGR1IgcmVnaXN0ZXIKKyAgKi8KKy8qIE5vdGU6IEJpdCBBRENfQ0ZHUjFfT1ZSTU9EIG5vdCB1c2VkIGRpcmVjdGx5IGluIGNvbnN0YW50ICAgICAgICAgICAgICAgICAgICovCisvKiAiQURDX09WUl9EQVRBX09WRVJXUklUVEVOIiB0byBoYXZlIHRoaXMgY2FzZSBkZWZpbmVkIHRvIDB4MDAsIHRvIHNldCBpdCAgICAqLworLyogYXMgdGhlIGRlZmF1bHQgY2FzZSB0byBiZSBjb21wbGlhbnQgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NGR1IxX09WRVJSVU4oX09WRVJSVU5fTU9ERV8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKCAoX09WRVJSVU5fTU9ERV8pICE9IChBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk/IChBRENfQ0ZHUjFfT1ZSTU9EKSA6ICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgU2V0IEFEQyBzY2FuIG1vZGUgd2l0aCBkaWZmZXJlbnRpYXRpb24gb2Ygc2VxdWVuY2VyIHNldHRpbmcKKyAgKiAgICAgICAgZml4ZWQgb3IgY29uZmlndXJhYmxlCisgICogQHBhcmFtIF9TQ0FOX01PREVfIFNjYW4gY29udmVyc2lvbiBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworLyogTm90ZTogU2NhbiBtb2RlIHNldCB1c2luZyB0aGlzIG1hY3JvIChpbnN0ZWFkIG9mIHBhcmFtZXRlciBkaXJlY3Qgc2V0KSAgICAgKi8KKy8qICAgICAgIGR1ZSB0byBkaWZmZXJlbnQgbW9kZXMgb24gb3RoZXIgU1RNMzIgZGV2aWNlczogICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBpZiBzY2FuIG1vZGUgaXMgZGlzYWJsZWQsIHNlcXVlbmNlciBpcyBzZXQgdG8gZnVsbHkgY29uZmlndXJhYmxlICAgICAqLworLyogICAgICAgd2l0aCBzZXR0aW5nIG9mIG9ubHkgcmFuayAxIGVuYWJsZWQgYWZ0ZXJ3YXJkcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1NDQU5fU0VRX01PREUoX1NDQU5fTU9ERV8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKCgoX1NDQU5fTU9ERV8pICYgQURDX1NDQU5fU0VRX0ZJWEVEX0lOVCkgIT0gMFVMICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChfU0NBTl9NT0RFXykgJiAofkFEQ19TQ0FOX1NFUV9GSVhFRF9JTlQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoQURDX0NGR1IxX0NIU0VMUk1PRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBBREMgRE1BIGNvbnRpbnVvdXMgcmVxdWVzdC4KKyAgKiBAcGFyYW0gX0RNQUNPTlRSRVFfTU9ERV86IERNQSBjb250aW51b3VzIHJlcXVlc3QgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1IxX0RNQUNPTlRSRVEoX0RNQUNPTlRSRVFfTU9ERV8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX0RNQUNPTlRSRVFfTU9ERV8pIDw8IDFVKQorCisvKioKKyAgKiBAYnJpZWYgU2hpZnQgdGhlIEFXRCB0aHJlc2hvbGQgaW4gZnVuY3Rpb24gb2YgdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICAqICAgICAgICBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlIHNldCB0byAwLgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEyIGJpdHMsIG5vIHNoaWZ0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIGxlZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gOCBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSBsZWZ0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDYgYml0cywgc2hpZnQgb2YgNiByYW5rcyBvbiB0aGUgbGVmdC4KKyAgKiAgICAgICAgdGhlcmVmb3JlLCBzaGlmdCA9ICgxMiAtIHJlc29sdXRpb24pID0gMTIgLSAoMTItICgoKFJFU1sxOjBdKSA+PiAzKSoyKSkKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9UaHJlc2hvbGRfIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfVGhyZXNob2xkXykgICAgICAgICAgICBcCisgICgoX1RocmVzaG9sZF8pIDw8ICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IxICYgQURDX0NGR1IxX1JFUykgPj4gM1UpKjJVKSkKKworI2RlZmluZSBJU19BRENfQ0xPQ0tQUkVTQ0FMRVIoQURDX0NMT0NLKSAoKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYyKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19BU1lOQ19ESVYxICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjIgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWNCAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19BU1lOQ19ESVY2ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjggICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMTAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19BU1lOQ19ESVYxMiApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjE2ICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMzIgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0xPQ0spID09IEFEQ19DTE9DS19BU1lOQ19ESVY2NCApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DTE9DSykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEyOCApICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NMT0NLKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMjU2KSkKKworI2RlZmluZSBJU19BRENfUkVTT0xVVElPTihSRVNPTFVUSU9OKSAoKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl8xMkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTT0xVVElPTikgPT0gQURDX1JFU09MVVRJT05fMTBCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU09MVVRJT04pID09IEFEQ19SRVNPTFVUSU9OXzhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNPTFVUSU9OKSA9PSBBRENfUkVTT0xVVElPTl82QikgICAgKQorCisjZGVmaW5lIElTX0FEQ19EQVRBX0FMSUdOKEFMSUdOKSAoKChBTElHTikgPT0gQURDX0RBVEFBTElHTl9SSUdIVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxJR04pID09IEFEQ19EQVRBQUxJR05fTEVGVCkgICAgKQorCisjZGVmaW5lIElTX0FEQ19TQ0FOX01PREUoU0NBTl9NT0RFKSAoKChTQ0FOX01PREUpID09IEFEQ19TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0NBTl9NT0RFKSA9PSBBRENfU0NBTl9FTkFCTEUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNDQU5fTU9ERSkgPT0gQURDX1NDQU5fU0VRX0ZJWEVEKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTQ0FOX01PREUpID09IEFEQ19TQ0FOX1NFUV9GSVhFRF9CQUNLV0FSRCkgICApCisKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdfRURHRShFREdFKSAoKChFREdFKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRURHRSkgPT0gQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lORykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVER0UpID09IEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9GQUxMSU5HKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORykgICkKKworI2lmIGRlZmluZWQoVElNMTUpICYmIGRlZmluZWQoVElNNikgJiYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBJU19BRENfRVhUVFJJRyhSRUdUUklHKSAoKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0M0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDZfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UMTVfVFJHTykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19TT0ZUV0FSRV9TVEFSVCkgICAgICAgICAgKQorI2VsaWYgZGVmaW5lZChUSU0xNSkgJiYgIGRlZmluZWQoVElNNikKKyNkZWZpbmUgSVNfQURDX0VYVFRSSUcoUkVHVFJJRykgKCgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDNCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UNl9UUkdPKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QxNV9UUkdPKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICApCisjZWxpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKFJFR1RSSUcpICgoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QyX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDNfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19FWFRfSVQxMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICkKKyNlbHNlCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKFJFR1RSSUcpICgoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfVFJHTzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdUUklHKSA9PSBBRENfRVhURVJOQUxUUklHX1QzX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1RSSUcpID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVHVFJJRykgPT0gQURDX1NPRlRXQVJFX1NUQVJUKSAgICAgICAgICApCisjZW5kaWYKKworI2RlZmluZSBJU19BRENfRU9DX1NFTEVDVElPTihFT0NfU0VMRUNUSU9OKSAoKChFT0NfU0VMRUNUSU9OKSA9PSBBRENfRU9DX1NJTkdMRV9DT05WKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVPQ19TRUxFQ1RJT04pID09IEFEQ19FT0NfU0VRX0NPTlYpKQorCisjZGVmaW5lIElTX0FEQ19PVkVSUlVOKE9WUikgKCgoT1ZSKSA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9WUikgPT0gQURDX09WUl9EQVRBX09WRVJXUklUVEVOKSAgKQorCisjZGVmaW5lIElTX0FEQ19SRUdVTEFSX1JBTktfU0VRX0ZJWEVEKFJBTkspICgoKFJBTkspID09IEFEQ19SQU5LX0NIQU5ORUxfTlVNQkVSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBTkspID09IEFEQ19SQU5LX05PTkUpICAgICAgICAgICAgICkKKworI2RlZmluZSBJU19BRENfUkVHVUxBUl9SQU5LKFJBTkspICgoKFJBTkspID09IEFEQ19SRUdVTEFSX1JBTktfMSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQU5LKSA9PSBBRENfUkVHVUxBUl9SQU5LXzIgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFOSykgPT0gQURDX1JFR1VMQVJfUkFOS18zICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBTkspID09IEFEQ19SRUdVTEFSX1JBTktfNCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQU5LKSA9PSBBRENfUkVHVUxBUl9SQU5LXzUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkFOSykgPT0gQURDX1JFR1VMQVJfUkFOS182ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBTkspID09IEFEQ19SRUdVTEFSX1JBTktfNyApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQU5LKSA9PSBBRENfUkVHVUxBUl9SQU5LXzggKSAgICkKKworI2RlZmluZSBJU19BRENfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8wKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8yKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8zKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF80KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF81KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF82KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF83KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF84KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF85KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMSkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xMykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNSkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xNykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF8xOCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF9WQkFUKSAgICAgICAgICApCisKKyNkZWZpbmUgSVNfQURDX1NBTVBMSU5HX1RJTUVfQ09NTU9OKFNBTVBMSU5HX1RJTUVfQ09NTU9OKSAoKChTQU1QTElOR19USU1FX0NPTU1PTikgPT0gQURDX1NBTVBMSU5HVElNRV9DT01NT05fMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNBTVBMSU5HX1RJTUVfQ09NTU9OKSA9PSBBRENfU0FNUExJTkdUSU1FX0NPTU1PTl8yKSAgICkKKworI2RlZmluZSBJU19BRENfU0FNUExFX1RJTUUoVElNRSkgKCgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMUNZQ0xFXzUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzNDWUNMRVNfNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV83Q1lDTEVTXzUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfMTJDWUNMRVNfNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzE5Q1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSU1FKSA9PSBBRENfU0FNUExFVElNRV8zOUNZQ0xFU181KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVElNRSkgPT0gQURDX1NBTVBMRVRJTUVfNzlDWUNMRVNfNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRJTUUpID09IEFEQ19TQU1QTEVUSU1FXzE2MENZQ0xFU181KSAgICkKKworI2RlZmluZSBJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihXQVRDSERPRykgKCgoV0FUQ0hET0cpID09IEFEQ19BTkFMT0dXQVRDSERPR18xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVRDSERPRykgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVENIRE9HKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMykgICApCisKKyNkZWZpbmUgSVNfQURDX0FOQUxPR19XQVRDSERPR19NT0RFKFdBVENIRE9HKSAoKChXQVRDSERPRykgPT0gQURDX0FOQUxPR1dBVENIRE9HX05PTkUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVRDSERPRykgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVRDSERPRykgPT0gQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUcpICAgICAgICAgICAgKQorCisjZGVmaW5lIElTX0FEQ19UUklHR0VSX0ZSRVEoVFJJR0dFUl9GUkVRKSAoKChUUklHR0VSX0ZSRVEpID09IExMX0FEQ19UUklHR0VSX0ZSRVFfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUl9GUkVRKSA9PSBMTF9BRENfVFJJR0dFUl9GUkVRX0xPVykgICAgKQorCisjZGVmaW5lIElTX0FEQ19FVkVOVF9UWVBFKEVWRU5UKSAoKChFVkVOVCkgPT0gQURDX0VPU01QX0VWRU5UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gQURDX0FXRDFfRVZFTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gQURDX0FXRDJfRVZFTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gQURDX0FXRDNfRVZFTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gQURDX09WUl9FVkVOVCkgICAgICkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGF0IGEgZ2l2ZW4gdmFsdWUgaXMgYWxpZ25lZCB3aXRoIHRoZSBBREMgcmVzb2x1dGlvbiByYW5nZS4KKyAgKiBAcGFyYW0gX19SRVNPTFVUSU9OX18gQURDIHJlc29sdXRpb24gKDEyLCAxMCwgOCBvciA2IGJpdHMpLgorICAqIEBwYXJhbSBfX0FEQ19WQUxVRV9fIHZhbHVlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcmVzb2x1dGlvbi4gICAgIAorICAqIEByZXR2YWwgU0VUIChfX0FEQ19WQUxVRV9fIGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykgb3IgUkVTRVQgKF9fQURDX1ZBTFVFX18gbm90IGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JBTkdFKF9fUkVTT0xVVElPTl9fLCBfX0FEQ19WQUxVRV9fKSBcCisgICgoX19BRENfVkFMVUVfXykgPD0gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX1JFU09MVVRJT05fXykpCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfbmJfY29udl92ZXJpZmljYXRpb24gQURDIFJlZ3VsYXIgQ29udmVyc2lvbiBOdW1iZXIgVmVyaWZpY2F0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JFR1VMQVJfTkJfQ09OVihMRU5HVEgpICgoKExFTkdUSCkgPj0gMVVMKSAmJiAoKExFTkdUSCkgPD0gOFVMKSkKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9Db25zdGFudHMgQURDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogQ29tYmluYXRpb24gb2YgYWxsIHBvc3QtY29udmVyc2lvbiBmbGFncyBiaXRzOiBFT0MvRU9TLCBPVlIsIEFXRCAqLworI2RlZmluZSBBRENfRkxBR19QT1NUQ09OVl9BTEwgICAgKEFEQ19GTEFHX0FXRCB8IEFEQ19GTEFHX09WUiB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX0VPQykKKworI2RlZmluZSBBRENfU0NBTl9TRVFfRklYRURfSU5UICAweDgwMDAwMDAwVSAgLyogSW50ZXJuYWwgZGVmaW5pdGlvbiB0byBkaWZmZXJlbnRpYXRlIHNlcXVlbmNlciBzZXR0aW5nIGZpeGVkIG9yIGNvbmZpZ3VyYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9NYWNyb3MgQURDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiBNYWNybyBmb3IgaW50ZXJuYWwgSEFMIGRyaXZlciB1c2FnZSwgYW5kIHBvc3NpYmx5IGNhbiBiZSB1c2VkIGludG8gY29kZSBvZiAqLworLyogZmluYWwgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VNX0hBTkRMRV9JVF9GTEFHIEhBTCBBREMgbWFjcm8gdG8gbWFuYWdlIEhBTCBBREMgaGFuZGxlLCBJVCBhbmQgZmxhZ3MuCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgQURDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9BRENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQURDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIEludGVycnVwdAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9SRFkgICAgQURDIFJlYWR5IGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQ0NSRFkgIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPUyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9PVlIgICAgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QxICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UgKG1haW4gYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QyICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgQURDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gQURDIEludGVycnVwdAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9SRFkgICAgQURDIFJlYWR5IGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQ0NSRFkgIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPUyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9PVlIgICAgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QxICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UgKG1haW4gYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QyICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9BRENfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIpICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfUkRZICAgIEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0NDUkRZICBBREMgY2hhbm5lbCBjb25maWd1cmF0aW9uIHJlYWR5IGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TTVAgIEFEQyBFbmQgb2YgU2FtcGxpbmcgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT0MgICAgQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1MgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfT1ZSICAgIEFEQyBvdmVycnVuIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMSAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBpbnRlcnJ1cHQgc291cmNlIChtYWluIGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMiAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfQVdEMyAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGludGVycnVwdGlvbiAoU0VUIG9yIFJFU0VUKQorICAqLworI2RlZmluZSBfX0hBTF9BRENfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKyAgICAKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQURDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfUkRZICAgIEFEQyBSZWFkeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQ0NSRFkgIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPU01QICAgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPQyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gZmxhZyAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPUyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX09WUiAgICAgQURDIG92ZXJydW4gZmxhZyAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMSAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMyAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogQHJldHZhbCBTdGF0ZSBvZiBmbGFnIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfUkRZICAgIEFEQyBSZWFkeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQ0NSRFkgIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPU01QICAgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPQyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gZmxhZyAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPUyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX09WUiAgICAgQURDIG92ZXJydW4gZmxhZyAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMSAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMyAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogQHJldHZhbCBOb25lCisgICovCisvKiBOb3RlOiBiaXQgY2xlYXJlZCBiaXQgYnkgd3JpdGluZyAxICh3cml0aW5nIDAgaGFzIG5vIGVmZmVjdCBvbiBhbnkgYml0IG9mIHJlZ2lzdGVyIElTUikgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FTV9IRUxQRVJfTUFDUk8gSEFMIEFEQyBoZWxwZXIgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0CisgICogICAgICAgICBmcm9tIGxpdGVyYWxzIEFEQ19DSEFOTkVMX3guCisgICogQG5vdGUgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0hBTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKEFEQ19DSEFOTkVMXzQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICI0Ii4KKyAgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpcyByZXR1cm5lZCwgZWl0aGVyIGRlZmluZWQgd2l0aCBudW1iZXIKKyAgKiAgICAgICAgIG9yIHdpdGggYml0ZmllbGQgKG9ubHkgb25lIGJpdCBtdXN0IGJlIHNldCkuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigoX19DSEFOTkVMX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgQURDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogQG5vdGUgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0hBTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKDQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGEgZGF0YSBlcXVpdmFsZW50IHRvICJBRENfQ0hBTk5FTF80Ii4KKyAgKiBAcGFyYW0gIF9fREVDSU1BTF9OQl9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNSAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTcgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAoMikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUICAgICAgICgyKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJHMCwgcGFyYW1ldGVyIGNhbiBiZSBzZXQgaW4gQURDIGdyb3VwIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIG9ubHkgaWYgc2VxdWVuY2VyIGlzIHNldCBpbiBtb2RlICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiwKKyAgKiAgICAgICAgICAgICByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuXG4KKyAgKiAgICAgICAgICgyKSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqLworI2RlZmluZSBfX0hBTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKF9fREVDSU1BTF9OQl9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCgoX19ERUNJTUFMX05CX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2hhbm5lbAorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQG5vdGUgICBUaGUgZGlmZmVyZW50IGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgQURDIGNoYW5uZWxzIGFyZToKKyAgKiAgICAgICAgIC0gQURDIGludGVybmFsIGNoYW5uZWw6CisgICogICAgICAgICAgIEFEQ19DSEFOTkVMX1ZSRUZJTlQsIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLgorICAqICAgICAgICAgLSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbik6CisgICogICAgICAgICAgIEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gbGl0ZXJhbAorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIEFEQyBleHRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLAorICAqICAgICAgICAgbXVzdCBub3QgYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsCisgICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRoZSBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbikuCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsLgorICAqLworI2RlZmluZSBfX0hBTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoKF9fQ0hBTk5FTF9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChBRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwKKyAgKiAgICAgICAgIChBRENfQ0hBTk5FTF8xLCBBRENfQ0hBTk5FTF8yLCAuLi4pLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUKKyAgKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoQURDX0NIQU5ORUxfVlJFRklOVCwgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfMSwgQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkCisgICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4CisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgoX19DSEFOTkVMX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqLworI2RlZmluZSBfX0hBTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICBcCisgICAgICAgICBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRSgoX19BRENfSU5TVEFOQ0VfXyksIChfX0NIQU5ORUxfXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoKKyAgKiAgICAgICAgIC0gU2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKF9fQURDeF9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQorICAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQorICAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAgKiBAcGFyYW0gIF9fQURDWFlfQ09NTU9OX18gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiBhdCBsZWFzdCBvbmUgQURDIGluc3RhbmNlIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgaXMgZW5hYmxlZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKChfX0FEQ1hZX0NPTU1PTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbAorICAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgICogQG5vdGUgICBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQorICAqICAgICAgICAgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLQorICAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfRElHSVRBTF9TQ0FMRSgoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmcm9tCisgICogICAgICAgICBhIHJlc29sdXRpb24gdG8gYW5vdGhlciByZXNvbHV0aW9uLgorICAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQgCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyBSZXNvbHV0aW9uIG9mIHRvIHRoZSBkYXRhIHRvIGJlIGNvbnZlcnRlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fIFJlc29sdXRpb24gb2YgdGhlIGRhdGEgYWZ0ZXIgY29udmVyc2lvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb2x1dGlvbgorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oX19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTigoX19EQVRBX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQorICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfREFUQV9UT19WT0xUQUdFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRSgoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKQorICAqICAgICAgICAgKHVuaXQ6IG1Wb2x0KSBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZQorICAqICAgICAgICAgcmVmZXJlbmNlIFZyZWZJbnQuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyBWcmVmSW50IGNhbGlicmF0aW9uIHZhbHVlCisgICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgICogQG5vdGUgICBUaGlzIHZvbHRhZ2UgZGVwZW5kcyBvbiB1c2VyIGJvYXJkIGVudmlyb25tZW50OiB2b2x0YWdlIGxldmVsCisgICogICAgICAgICBjb25uZWN0ZWQgdG8gcGluIFZyZWYrLgorICAqICAgICAgICAgT24gZGV2aWNlcyB3aXRoIHNtYWxsIHBhY2thZ2UsIHRoZSBwaW4gVnJlZisgaXMgbm90IHByZXNlbnQKKyAgKiAgICAgICAgIGFuZCBpbnRlcm5hbGx5IGJvbmRlZCB0byBwaW4gVmRkYS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNhbGlicmF0aW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UKKyAgKiAgICAgICAgIFZyZWZJbnQgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAgKiAgICAgICAgIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQuCisgICogICAgICAgICBPdGhlcndpc2UsIHRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcgdG8gc2NhbGUKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVlJFRklOVF9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykKKyAgKiAgICAgICAgIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKF9fVlJFRklOVF9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgoX19WUkVGSU5UX0FEQ19EQVRBX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzCisgICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICAqICAgICAgICAgICBUZW1wZXJhdHVyZSA9ICgoVFNfQURDX0RBVEEgLSBUU19DQUwxKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyIC0gVFNfQ0FMMSkgKyBUU19DQUwxX1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieSBBREMKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgPSAoVFNfQ0FMMiAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDEgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMSAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDIgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMiAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhhdCBjYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgY29ycmVjdCAoYWRkcmVzcyBhbmQgZGF0YSkuCisgICogICAgICAgICAgICAgICAgICBUbyBjYWxjdWxhdGUgdGVtcGVyYXR1cmUgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMgKGdlbmVyaWMgdmFsdWVzIGxlc3MsIHRoZXJlZm9yZQorICAqICAgICAgICAgICAgICAgICAgbGVzcyBhY2N1cmF0ZSB0aGFuIGNhbGlicmF0ZWQgdmFsdWVzKSwKKyAgKiAgICAgICAgICAgICAgICAgIHVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfVEVNUEVSQVRVUkUoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIHR5cGljYWwgdmFsdWVzCisgICogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCkuCisgICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICAqICAgICAgICAgICBUZW1wZXJhdHVyZSA9IChUU19UWVBfQ0FMeF9WT0xUKHVWKSAtIFRTX0FEQ19EQVRBICogQ29udmVyc2lvbl91VikKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIEF2Z19TbG9wZSArIENBTHhfVEVNUAorICAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBICAgICAgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKQorICAqICAgICAgICAgICAgICAgIEF2Z19TbG9wZSAgICAgICAgPSB0ZW1wZXJhdHVyZSBzZW5zb3Igc2xvcGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IHVWL0RlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgICAgICAgIFRTX1RZUF9DQUx4X1ZPTFQgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgZGlnaXRhbCB2YWx1ZSBhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBDQUx4X1RFTVAgKHVuaXQ6IG1WKQorICAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZGV2aWNlIGhhcyBjaGFyYWN0ZXJpc3RpY3MgaW4gbGluZSB3aXRoCisgICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMuCisgICogICAgICAgICAgICAgICAgICBJZiB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgb24KKyAgKiAgICAgICAgICAgICAgICAgIG9uIHRoaXMgZGV2aWNlIChwcmVzZW5jZSBvZiBtYWNybyBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkpLAorICAqICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24gd2lsbCBiZSBtb3JlIGFjY3VyYXRlIHVzaW5nCisgICogICAgICAgICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkuCisgICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUKKyAgKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBub3RlICAgQURDIG1lYXN1cmVtZW50IGRhdGEgbXVzdCBjb3JyZXNwb25kIHRvIGEgcmVzb2x1dGlvbiBvZiAxMmJpdHMKKyAgKiAgICAgICAgIChmdWxsIHNjYWxlIGRpZ2l0YWwgdmFsdWUgNDA5NSkuIElmIG5vdCB0aGUgY2FzZSwgdGhlIGRhdGEgbXVzdCBiZQorICAqICAgICAgICAgcHJlbGltaW5hcmlseSByZXNjYWxlZCB0byBhbiBlcXVpdmFsZW50IHJlc29sdXRpb24gb2YgMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlIHR5cGljYWwgdmFsdWUgKHVuaXQ6IHVWL0RlZ0NlbHNpdXMpLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gU1RNMzJHMCwgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIkF2Z19TbG9wZSIuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIHR5cGljYWwgdmFsdWUgKGF0IHRlbXBlcmF0dXJlIGFuZCBWcmVmKyBkZWZpbmVkIGluIHBhcmFtZXRlcnMgYmVsb3cpICh1bml0OiBtVikuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMkcwLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiVjMwIiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwxKS4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgKHNlZSBwYXJhbWV0ZXIgYWJvdmUpIGlzIGNvcnJlc3BvbmRpbmcgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKChfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEFEQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9hZGNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBBRENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3IgaW50ZXJydXB0aW9uICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uIGFuZCBETUEpICovCit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ19Db25maWdDaGFubmVsKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQ2hhbm5lbENvbmZUeXBlRGVmKiBzQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYqIEFuYWxvZ1dER0NvbmZpZyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLwordWludDMyX3QgICAgICAgICAgICAgICAgSEFMX0FEQ19HZXRTdGF0ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19Db252ZXJzaW9uU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9BRENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfYWRjX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9hZGNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWViM2QzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfYWRjX2V4LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2FkY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgSEFMIGV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0FEQ19FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfQURDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXgKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfVHlwZXMgQURDIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19HUk9VUFMgIEFEQyBpbnN0YW5jZSAtIEdyb3VwcworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19SRUdVTEFSX0dST1VQICAgICAgICAgICAgICAgICAgKExMX0FEQ19HUk9VUF9SRUdVTEFSKSAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciAoYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBkZXZpY2VzKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX01hY3JvX2ludGVybmFsX0hBTF9kcml2ZXIgQURDIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qIE1hY3JvIHJlc2VydmVkIGZvciBpbnRlcm5hbCBIQUwgZHJpdmVyIHVzYWdlLCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiAgICovCisvKiBjb2RlIG9mIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgQURDIGlzIGluZGVwZW5kZW50LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQG5vdGUgIFdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIG1hY3JvIGFsd2F5cyByZXR1cm5zIFNFVC4gICAKKyAgKiBAcmV0dmFsIFNFVCAoQURDIGlzIGluZGVwZW5kZW50KSBvciBSRVNFVCAoQURDIGlzIG5vdCkuCisgICovCisjZGVmaW5lIEFEQ19JU19JTkRFUEVOREVOVChfX0hBTkRMRV9fKSAgIChTRVQpCisKKworLyoqCisgICogQGJyaWVmIENhbGlicmF0aW9uIGZhY3RvciBzaXplIHZlcmlmaWNhdGlvbiAoNyBiaXRzIG1heGltdW0pLgorICAqIEBwYXJhbSBfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fIENhbGlicmF0aW9uIGZhY3RvciB2YWx1ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DQUxJQlJBVElPTl9GQUNUT1JfXyBpcyB3aXRoaW4gdGhlIGF1dGhvcml6ZWQgc2l6ZSkgb3IgUkVTRVQgKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18gaXMgdG9vIGxhcmdlKQorICAqLworI2RlZmluZSBJU19BRENfQ0FMRkFDVChfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fKSAoKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18pIDw9ICgweDdGVSkpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8uIAorICAqIEBwYXJhbSBfX1JBVElPX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvLgorICAqIEByZXR2YWwgU0VUIChfX1JBVElPX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkFUSU9fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfT1ZFUlNBTVBMSU5HX1JBVElPKF9fUkFUSU9fXykgICAgICAoKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTYgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMzIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNjQgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTI4ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMjU2ICkpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQuIAorICAqIEBwYXJhbSBfX1NISUZUX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0LgorICAqIEByZXR2YWwgU0VUIChfX1NISUZUX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fU0hJRlRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfUklHSFRfQklUX1NISUZUKF9fU0hJRlRfXykgICAgICAgICgoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMyAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNyAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfOCAgICkpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgdHJpZ2dlcmVkIG1vZGUuIAorICAqIEBwYXJhbSBfX01PREVfXyBwcm9ncmFtbWVkIEFEQyBvdmVyc2FtcGxpbmcgdHJpZ2dlcmVkIG1vZGUuIAorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19UUklHR0VSRURfT1ZFUlNBTVBMSU5HX01PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQURDX1RSSUdHRVJFRE1PREVfTVVMVElfVFJJR0dFUikgKSAKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQURDIGNhbGlicmF0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordWludDMyX3QgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgQ2FsaWJyYXRpb25GYWN0b3IpOworCisvKiBBREMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uLWJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHRpb24pICovCit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9DaGFubmVsQ29uZmlnUmVhZHlDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfRGlzYWJsZVZvbHRhZ2VSZWd1bGF0b3IoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9BRENfRVhfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9jZWMuaCBiL0luYy9zdG0zMmcweHhfaGFsX2NlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDgzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9jZWMuaApAQCAtMCwwICsxLDc5NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfY2VjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENFQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfQ0VDX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9DRUNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQgKENFQykKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENFQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9UeXBlcyBDRUMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ0VDIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFNpZ25hbEZyZWVUaW1lOyAgICAgICAgICAgICAgIC8qITwgU2V0IFNGVCBmaWVsZCwgc3BlY2lmaWVzIHRoZSBTaWduYWwgRnJlZSBUaW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YgQHJlZiBDRUNfU2lnbmFsX0ZyZWVfVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBiZWxvbmdzIHRvIHRoZSBzZXQgezAsLi4uLDd9IHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwIGlzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG1lYW5zIDAuNSArIChTaWduYWxGcmVlVGltZSAtIDEpIG5vbWluYWwgZGF0YSBiaXQgcGVyaW9kcyAqLworCisgIHVpbnQzMl90IFRvbGVyYW5jZTsgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IFJYVE9MIGJpdCwgc3BlY2lmaWVzIHRoZSB0b2xlcmFuY2UgYWNjZXB0ZWQgb24gdGhlIHJlY2VpdmVkIHdhdmVmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENFQ19Ub2xlcmFuY2UgOiBpdCBpcyBlaXRoZXIgQ0VDX1NUQU5EQVJEX1RPTEVSQU5DRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIENFQ19FWFRFTkRFRF9UT0xFUkFOQ0UgKi8KKworICB1aW50MzJfdCBCUkVSeFN0b3A7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBCUkVTVFAgYml0IEByZWYgQ0VDX0JSRVJ4U3RvcCA6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhIEJpdCBSaXNpbmcgRXJyb3Igc3RvcHMgdGhlIHJlY2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfTk9fUlhfU1RPUF9PTl9CUkU6IHJlY2VwdGlvbiBpcyBub3Qgc3RvcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfUlhfU1RPUF9PTl9CUkU6ICAgIHJlY2VwdGlvbiBpcyBzdG9wcGVkLiAqLworCisgIHVpbnQzMl90IEJSRUVycm9yQml0R2VuOyAgICAgICAgICAgICAgIC8qITwgU2V0IEJSRUdFTiBiaXQgQHJlZiBDRUNfQlJFRXJyb3JCaXRHZW4gOiBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgYW4gRXJyb3ItQml0IGlzIGdlbmVyYXRlZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUMgbGluZSB1cG9uIEJpdCBSaXNpbmcgRXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19CUkVfRVJST1JCSVRfTk9fR0VORVJBVElPTjogbm8gZXJyb3ItYml0IGdlbmVyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0JSRV9FUlJPUkJJVF9HRU5FUkFUSU9OOiAgICBlcnJvci1iaXQgZ2VuZXJhdGlvbiBpZiBCUkVTVFAgaXMgc2V0LiAqLworCisgIHVpbnQzMl90IExCUEVFcnJvckJpdEdlbjsgICAgICAgICAgICAgIC8qITwgU2V0IExCUEVHRU4gYml0IEByZWYgQ0VDX0xCUEVFcnJvckJpdEdlbiA6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBhbiBFcnJvci1CaXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQyBsaW5lIHVwb24gTG9uZyBCaXQgUGVyaW9kIEVycm9yIGRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUNfTEJQRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OOiAgbm8gZXJyb3ItYml0IGdlbmVyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0xCUEVfRVJST1JCSVRfR0VORVJBVElPTjogICAgIGVycm9yLWJpdCBnZW5lcmF0aW9uLiAqLworCisgIHVpbnQzMl90IEJyb2FkY2FzdE1zZ05vRXJyb3JCaXRHZW47ICAgIC8qITwgU2V0IEJSRE5PR0VOIGJpdCBAcmVmIENFQ19Ccm9hZENhc3RNc2dFcnJvckJpdEdlbiA6IGFsbG93cyB0byBhdm9pZCBhbiBFcnJvci1CaXQgZ2VuZXJhdGlvbiBvbiB0aGUgQ0VDIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG9uIGFuIGVycm9yIGRldGVjdGVkIG9uIGEgYnJvYWRjYXN0IG1lc3NhZ2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBzdXBlcnNlZGVzIEJSRUdFTiBhbmQgTEJQRUdFTiBiaXRzIGZvciBhIGJyb2FkY2FzdCBtZXNzYWdlIGVycm9yIGhhbmRsaW5nLiBJdCBjYW4gdGFrZSB0d28gdmFsdWVzOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgQ0VDX0JST0FEQ0FTVEVSUk9SX0VSUk9SQklUX0dFTkVSQVRJT04uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSkgQlJFIGRldGVjdGlvbjogZXJyb3ItYml0IGdlbmVyYXRpb24gb24gdGhlIENFQyBsaW5lIGlmIEJSRVNUUD1DRUNfUlhfU1RPUF9PTl9CUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQlJFR0VOPUNFQ19CUkVfRVJST1JCSVRfTk9fR0VORVJBVElPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKSBMQlBFIGRldGVjdGlvbjogZXJyb3ItYml0IGdlbmVyYXRpb24gb24gdGhlIENFQyBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgTEJQR0VOPUNFQ19MQlBFX0VSUk9SQklUX05PX0dFTkVSQVRJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBDRUNfQlJPQURDQVNURVJST1JfTk9fRVJST1JCSVRfR0VORVJBVElPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBlcnJvci1iaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG5laXRoZXIgYSkgbm9yIGIpIGFyZSBzYXRpc2ZpZWQuIEFkZGl0aW9uYWxseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci1iaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIFNob3J0IEJpdCBQZXJpb2QgRXJyb3IgZGV0ZWN0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBicm9hZGNhc3QgbWVzc2FnZSB3aGlsZSBMU1ROIGJpdCBpcyBzZXQuICovCisKKyAgdWludDMyX3QgU2lnbmFsRnJlZVRpbWVPcHRpb247ICAgICAgICAgLyohPCBTZXQgU0ZUT1AgYml0IEByZWYgQ0VDX1NGVF9PcHRpb24gOiBzcGVjaWZpZXMgd2hlbiBTRlQgdGltZXIgc3RhcnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19TRlRfU1RBUlRfT05fVFhTT00gU0ZUOiAgICB0aW1lciBzdGFydHMgd2hlbiBUWFNPTSBpcyBzZXQgYnkgc29mdHdhcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX1NGVF9TVEFSVF9PTl9UWF9SWF9FTkQ6ICBTRlQgdGltZXIgc3RhcnRzIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIHRyYW5zbWlzc2lvbi9yZWNlcHRpb24uICovCisKKyAgdWludDMyX3QgTGlzdGVuTW9kZTsgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgTFNUTiBiaXQgQHJlZiBDRUNfTGlzdGVuaW5nX01vZGUgOiBzcGVjaWZpZXMgZGV2aWNlIGxpc3RlbmluZyBtb2RlLiBJdCBjYW4gdGFrZSB0d28gdmFsdWVzOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX1JFRFVDRURfTElTVEVOSU5HX01PREU6IENFQyBwZXJpcGhlcmFsIHJlY2VpdmVzIG9ubHkgbWVzc2FnZSBhZGRyZXNzZWQgdG8gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gYWRkcmVzcyAoT0FSKS4gTWVzc2FnZXMgYWRkcmVzc2VkIHRvIGRpZmZlcmVudCBkZXN0aW5hdGlvbiBhcmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb2FkY2FzdCBtZXNzYWdlcyBhcmUgYWx3YXlzIHJlY2VpdmVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VDX0ZVTExfTElTVEVOSU5HX01PREU6IENFQyBwZXJpcGhlcmFsIHJlY2VpdmVzIG1lc3NhZ2VzIGFkZHJlc3NlZCB0byBpdHMgb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIChPQVIpIHdpdGggcG9zaXRpdmUgYWNrbm93bGVkZ2UuIE1lc3NhZ2VzIGFkZHJlc3NlZCB0byBkaWZmZXJlbnQgZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSByZWNlaXZlZCwgYnV0IHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgQ0VDIGJ1czogbm8gYWNrbm93bGVkZ2Ugc2VudC4gICovCisKKyAgdWludDE2X3QgIE93bkFkZHJlc3M7ICAgICAgICAgICAgICAgICAvKiE8IE93biBhZGRyZXNzZXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDRUNfT1dOX0FERFJFU1MgKi8KKworICB1aW50OF90ICAqUnhCdWZmZXI7ICAgICAgICAgICAgICAgICAgICAvKiE8IENFQyBSeCBidWZmZXIgcG9pbnRldXIgKi8KKworCit9IENFQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBDRUMgU3RhdGUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgQ0VDIFN0YXRlIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgMiBkaWZmZXJlbnQgc3Vic3RhdGVzOiBnU3RhdGUgYW5kIFJ4U3RhdGUgKHNlZSBAcmVmIENFQ19TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgQ0VDIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgYW5kIGFsc28gaW5mb3JtYXRpb24gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIGdTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3IChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGI2ICBFcnJvciBpbmZvcm1hdGlvbgorICAqICAgICAgICAgICAgIDAgIDogTm8gRXJyb3IKKyAgKiAgICAgICAgICAgICAxICA6IEVycm9yCisgICogICAgICAgICAgYjUgICAgIENFQyBwZXJpcGhlcmFsIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAocGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKHBlcmlwaGVyYWwgaW5pdGlhbGl6ZWQuIEhBTCBDRUMgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKHBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBDRUMgcGVyaXBoZXJhbCBpbml0aWxpc2F0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKHBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChwZXJpcGhlcmFsIGluaXRpYWxpemVkKQorICAqICAgICAgICAgIGI0LWIyICAobm90IHVzZWQpCisgICogICAgICAgICAgICB4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMAorICAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgYjAgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMC4KKyAgKi8KK3R5cGVkZWYgdWludDMyX3QgSEFMX0NFQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgQ0VDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fQ0VDX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBDRUNfVHlwZURlZiAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBDRUMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLworCisgIENFQ19Jbml0VHlwZURlZiAgICAgICAgIEluaXQ7ICAgICAgICAgICAvKiE8IENFQyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgLyohPCBQb2ludGVyIHRvIENFQyBUeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgLyohPCBDRUMgVHggVHJhbnNmZXIgQ291bnRlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAvKiE8IENFQyBSeCBUcmFuc2ZlciBzaXplLCAwOiBoZWFkZXIgcmVjZWl2ZWQgb25seSAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgIExvY2s7ICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICovCisKKyAgSEFMX0NFQ19TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgICAgIC8qITwgQ0VDIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfQ0VDX1N0YXRlVHlwZURlZiAqLworCisgIEhBTF9DRUNfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAgICAvKiE8IENFQyBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX0NFQ19TdGF0ZVR5cGVEZWYgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgLyohPCBGb3IgZXJyb3JzIGhhbmRsaW5nIHB1cnBvc2VzLCBjb3B5IG9mIElTUiByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIGVycm9yIGlzIHJlcG9ydGVkICovCisKKyNpZiAoVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0NFQ19IYW5kbGVUeXBlRGVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICpoY2VjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ0VDIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19DRUNfSGFuZGxlVHlwZURlZiAqaGNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUnhGcmFtZVNpemUpOyAgICAgICAgICAvKiE8IENFQyBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19DRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDRUMgZXJyb3IgY2FsbGJhY2sgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOyAgICAgICAgICAgICAgIC8qITwgQ0VDIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19DRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7ICAgICAgICAgICAgIC8qITwgQ0VDIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAqLworCisjZW5kaWYgLyogKFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KK30gQ0VDX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBDRUMgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DRUNfVFhfQ1BMVF9DQl9JRCAgICAgID0gMHgwMFUsICAgIC8qITwgQ0VDIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX0NFQ19SWF9DUExUX0NCX0lEICAgICAgPSAweDAxVSwgICAgLyohPCBDRUMgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfQ0VDX0VSUk9SX0NCX0lEICAgICAgICA9IDB4MDJVLCAgICAvKiE8IENFQyBlcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NFQ19NU1BJTklUX0NCX0lEICAgICAgPSAweDAzVSwgICAgLyohPCBDRUMgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworICBIQUxfQ0VDX01TUERFSU5JVF9DQl9JRCAgICA9IDB4MDRVICAgICAvKiE8IENFQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICovCit9IEhBTF9DRUNfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIENFQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwQ0VDX0NhbGxiYWNrVHlwZURlZikoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOyAgLyohPCBwb2ludGVyIHRvIGFuIENFQyBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiAgdm9pZCAoKnBDRUNfUnhDYWxsYmFja1R5cGVEZWYpKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJ4RnJhbWVTaXplKTsgIC8qITwgcG9pbnRlciB0byBhbiBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9Db25zdGFudHMgQ0VDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIENFQ19TdGF0ZV9EZWZpbml0aW9uIENFQyBTdGF0ZSBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSAgIEhBTF9DRUNfU1RBVEVfUkVTRVQgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCB5ZXQgSW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICAqLworI2RlZmluZSAgIEhBTF9DRUNfU1RBVEVfUkVBRFkgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjApICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAgKi8KKyNkZWZpbmUgICBIQUxfQ0VDX1NUQVRFX0JVU1kgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDI0KSAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICAgICAgICAgKi8KKyNkZWZpbmUgICBIQUxfQ0VDX1NUQVRFX0JVU1lfUlggICAgKCh1aW50MzJfdCkweDAwMDAwMDIyKSAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAgICAgICAgKi8KKyNkZWZpbmUgICBIQUxfQ0VDX1NUQVRFX0JVU1lfVFggICAgKCh1aW50MzJfdCkweDAwMDAwMDIxKSAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICAgICAgICAgKi8KKyNkZWZpbmUgICBIQUxfQ0VDX1NUQVRFX0JVU1lfUlhfVFggKCh1aW50MzJfdCkweDAwMDAwMDIzKSAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICAgICAgICAgKi8KKyNkZWZpbmUgICBIQUxfQ0VDX1NUQVRFX0VSUk9SICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDUwKSAgIC8qITwgRXJyb3IgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgICAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX0Vycm9yX0NvZGUgQ0VDIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX05PTkUgICAgKHVpbnQzMl90KSAweDAwMDBVICAgICAvKiE8IG5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfUlhPVlIgICBDRUNfSVNSX1JYT1ZSICAgICAgICAgIC8qITwgQ0VDIFJ4LU92ZXJydW4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9CUkUgICAgIENFQ19JU1JfQlJFICAgICAgICAgICAgLyohPCBDRUMgUnggQml0IFJpc2luZyBFcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX1NCUEUgICAgQ0VDX0lTUl9TQlBFICAgICAgICAgICAvKiE8IENFQyBSeCBTaG9ydCBCaXQgcGVyaW9kIEVycm9yICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfTEJQRSAgICBDRUNfSVNSX0xCUEUgICAgICAgICAgIC8qITwgQ0VDIFJ4IExvbmcgQml0IHBlcmlvZCBFcnJvciAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9SWEFDS0UgIENFQ19JU1JfUlhBQ0tFICAgICAgICAgLyohPCBDRUMgUnggTWlzc2luZyBBY2tub3dsZWRnZSAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX0FSQkxTVCAgQ0VDX0lTUl9BUkJMU1QgICAgICAgICAvKiE8IENFQyBBcmJpdHJhdGlvbiBMb3N0ICAgICAgICAgICovCisjZGVmaW5lIEhBTF9DRUNfRVJST1JfVFhVRFIgICBDRUNfSVNSX1RYVURSICAgICAgICAgIC8qITwgQ0VDIFR4LUJ1ZmZlciBVbmRlcnJ1biAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NFQ19FUlJPUl9UWEVSUiAgIENFQ19JU1JfVFhFUlIgICAgICAgICAgLyohPCBDRUMgVHgtRXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQ0VDX0VSUk9SX1RYQUNLRSAgQ0VDX0lTUl9UWEFDS0UgICAgICAgICAvKiE8IENFQyBUeCBNaXNzaW5nIEFja25vd2xlZGdlICAgICovCisjaWYgKFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSAgSEFMX0NFQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICgodWludDMyX3QpMHgwMDAwMjAwMFUpIC8qITwgSW52YWxpZCBDYWxsYmFjayBFcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX1NpZ25hbF9GcmVlX1RpbWUgIENFQyBTaWduYWwgRnJlZSBUaW1lIHNldHRpbmcgcGFyYW1ldGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0RFRkFVTFRfU0ZUICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfMF81X0JJVFBFUklPRF9TRlQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpCisjZGVmaW5lIENFQ18xXzVfQklUUEVSSU9EX1NGVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkKKyNkZWZpbmUgQ0VDXzJfNV9CSVRQRVJJT0RfU0ZUICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKQorI2RlZmluZSBDRUNfM181X0JJVFBFUklPRF9TRlQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpCisjZGVmaW5lIENFQ180XzVfQklUUEVSSU9EX1NGVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA1VSkKKyNkZWZpbmUgQ0VDXzVfNV9CSVRQRVJJT0RfU0ZUICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKQorI2RlZmluZSBDRUNfNl81X0JJVFBFUklPRF9TRlQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19Ub2xlcmFuY2UgQ0VDIFJlY2VpdmVyIFRvbGVyYW5jZQorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19TVEFOREFSRF9UT0xFUkFOQ0UgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQ0VDX0VYVEVOREVEX1RPTEVSQU5DRSAgICAgICAgICAgICAoKHVpbnQzMl90KUNFQ19DRkdSX1JYVE9MKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfQlJFUnhTdG9wIENFQyBSZWNlcHRpb24gU3RvcCBvbiBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19OT19SWF9TVE9QX09OX0JSRSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfUlhfU1RPUF9PTl9CUkUgICAgICAgICAgICAgICAgKCh1aW50MzJfdClDRUNfQ0ZHUl9CUkVTVFApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19CUkVFcnJvckJpdEdlbiAgQ0VDIEVycm9yIEJpdCBHZW5lcmF0aW9uIGlmIEJpdCBSaXNlIEVycm9yIHJlcG9ydGVkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0JSRV9FUlJPUkJJVF9OT19HRU5FUkFUSU9OICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfQlJFX0VSUk9SQklUX0dFTkVSQVRJT04gICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfQlJFR0VOKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfTEJQRUVycm9yQml0R2VuICBDRUMgRXJyb3IgQml0IEdlbmVyYXRpb24gaWYgTG9uZyBCaXQgUGVyaW9kIEVycm9yIHJlcG9ydGVkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0xCUEVfRVJST1JCSVRfTk9fR0VORVJBVElPTiAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgQ0VDX0xCUEVfRVJST1JCSVRfR0VORVJBVElPTiAgICAgICAgKCh1aW50MzJfdClDRUNfQ0ZHUl9MQlBFR0VOKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfQnJvYWRDYXN0TXNnRXJyb3JCaXRHZW4gIENFQyBFcnJvciBCaXQgR2VuZXJhdGlvbiBvbiBCcm9hZGNhc3QgbWVzc2FnZQorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19CUk9BRENBU1RFUlJPUl9FUlJPUkJJVF9HRU5FUkFUSU9OICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBDRUNfQlJPQURDQVNURVJST1JfTk9fRVJST1JCSVRfR0VORVJBVElPTiAgKCh1aW50MzJfdClDRUNfQ0ZHUl9CUkROT0dFTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX1NGVF9PcHRpb24gICAgIENFQyBTaWduYWwgRnJlZSBUaW1lIHN0YXJ0IG9wdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19TRlRfU1RBUlRfT05fVFhTT00gICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19TRlRfU1RBUlRfT05fVFhfUlhfRU5EICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfU0ZUT1BUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfTGlzdGVuaW5nX01vZGUgICAgQ0VDIExpc3RlbmluZyBtb2RlIG9wdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIENFQ19SRURVQ0VEX0xJU1RFTklOR19NT0RFICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIENFQ19GVUxMX0xJU1RFTklOR19NT0RFICAgICAgICAgICAgICgodWludDMyX3QpQ0VDX0NGR1JfTFNUTikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX09BUl9Qb3NpdGlvbiAgIENFQyBEZXZpY2UgT3duIEFkZHJlc3MgcG9zaXRpb24gaW4gQ0VDIENGR1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfQ0ZHUl9PQVJfTFNCX1BPUyAgICAgICAgICAgICgodWludDMyX3QpIDE2VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX0luaXRpYXRvcl9Qb3NpdGlvbiAgIENFQyBJbml0aWF0b3IgbG9naWNhbCBhZGRyZXNzIHBvc2l0aW9uIGluIG1lc3NhZ2UgaGVhZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0lOSVRJQVRPUl9MU0JfUE9TICAgICAgICAgICAoKHVpbnQzMl90KSA0VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX09XTl9BRERSRVNTICAgQ0VDIE93biBBZGRyZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTX05PTkUgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMFUpICAgLyogUmVzZXQgdmFsdWUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMVUpICAgLyogTG9naWNhbCBBZGRyZXNzIDAgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzEgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMlUpICAgLyogTG9naWNhbCBBZGRyZXNzIDEgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzIgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwNFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDIgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzMgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwOFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDMgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzQgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAxMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDQgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzUgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAyMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDUgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzYgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDA0MFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDYgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzcgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDA4MFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDcgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzggICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDEwMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDkgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzkgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDIwMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDEwICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU18xMCAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDA0MDBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyAxMSAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfMTEgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwODAwVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgMTIgKi8KKyNkZWZpbmUgQ0VDX09XTl9BRERSRVNTXzEyICAgICAgICAgICAgICgodWludDE2X3QpIDB4MTAwMFUpICAgLyogTG9naWNhbCBBZGRyZXNzIDEzICovCisjZGVmaW5lIENFQ19PV05fQUREUkVTU18xMyAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDIwMDBVKSAgIC8qIExvZ2ljYWwgQWRkcmVzcyAxNCAqLworI2RlZmluZSBDRUNfT1dOX0FERFJFU1NfMTQgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHg0MDAwVSkgICAvKiBMb2dpY2FsIEFkZHJlc3MgMTUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX0ludGVycnVwdHNfRGVmaW5pdGlvbnMgIENFQyBJbnRlcnJ1cHRzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfSVRfVFhBQ0tFICAgICAgICAgICAgICAgICAgIENFQ19JRVJfVFhBQ0tFSUUKKyNkZWZpbmUgQ0VDX0lUX1RYRVJSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYRVJSSUUKKyNkZWZpbmUgQ0VDX0lUX1RYVURSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYVURSSUUKKyNkZWZpbmUgQ0VDX0lUX1RYRU5EICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYRU5ESUUKKyNkZWZpbmUgQ0VDX0lUX1RYQlIgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYQlJJRQorI2RlZmluZSBDRUNfSVRfQVJCTFNUICAgICAgICAgICAgICAgICAgIENFQ19JRVJfQVJCTFNUSUUKKyNkZWZpbmUgQ0VDX0lUX1JYQUNLRSAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYQUNLRUlFCisjZGVmaW5lIENFQ19JVF9MQlBFICAgICAgICAgICAgICAgICAgICAgQ0VDX0lFUl9MQlBFSUUKKyNkZWZpbmUgQ0VDX0lUX1NCUEUgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1NCUEVJRQorI2RlZmluZSBDRUNfSVRfQlJFICAgICAgICAgICAgICAgICAgICAgIENFQ19JRVJfQlJFSUUKKyNkZWZpbmUgQ0VDX0lUX1JYT1ZSICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYT1ZSSUUKKyNkZWZpbmUgQ0VDX0lUX1JYRU5EICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYRU5ESUUKKyNkZWZpbmUgQ0VDX0lUX1JYQlIgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1JYQlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfRmxhZ3NfRGVmaW5pdGlvbnMgIENFQyBGbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0ZMQUdfVFhBQ0tFICAgICAgICAgICAgICAgICBDRUNfSVNSX1RYQUNLRQorI2RlZmluZSBDRUNfRkxBR19UWEVSUiAgICAgICAgICAgICAgICAgIENFQ19JU1JfVFhFUlIKKyNkZWZpbmUgQ0VDX0ZMQUdfVFhVRFIgICAgICAgICAgICAgICAgICBDRUNfSVNSX1RYVURSCisjZGVmaW5lIENFQ19GTEFHX1RYRU5EICAgICAgICAgICAgICAgICAgQ0VDX0lTUl9UWEVORAorI2RlZmluZSBDRUNfRkxBR19UWEJSICAgICAgICAgICAgICAgICAgIENFQ19JU1JfVFhCUgorI2RlZmluZSBDRUNfRkxBR19BUkJMU1QgICAgICAgICAgICAgICAgIENFQ19JU1JfQVJCTFNUCisjZGVmaW5lIENFQ19GTEFHX1JYQUNLRSAgICAgICAgICAgICAgICAgQ0VDX0lTUl9SWEFDS0UKKyNkZWZpbmUgQ0VDX0ZMQUdfTEJQRSAgICAgICAgICAgICAgICAgICBDRUNfSVNSX0xCUEUKKyNkZWZpbmUgQ0VDX0ZMQUdfU0JQRSAgICAgICAgICAgICAgICAgICBDRUNfSVNSX1NCUEUKKyNkZWZpbmUgQ0VDX0ZMQUdfQlJFICAgICAgICAgICAgICAgICAgICBDRUNfSVNSX0JSRQorI2RlZmluZSBDRUNfRkxBR19SWE9WUiAgICAgICAgICAgICAgICAgIENFQ19JU1JfUlhPVlIKKyNkZWZpbmUgQ0VDX0ZMQUdfUlhFTkQgICAgICAgICAgICAgICAgICBDRUNfSVNSX1JYRU5ECisjZGVmaW5lIENFQ19GTEFHX1JYQlIgICAgICAgICAgICAgICAgICAgQ0VDX0lTUl9SWEJSCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19BTExfRVJST1IgQ0VDIGFsbCBSWCBvciBUWCBlcnJvcnMgZmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBDRUNfSVNSX0FMTF9FUlJPUiAgICAgICAgICAgICAgKCh1aW50MzJfdClDRUNfSVNSX1JYT1ZSfENFQ19JU1JfQlJFfENFQ19JU1JfU0JQRXxDRUNfSVNSX0xCUEV8Q0VDX0lTUl9SWEFDS0V8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFQ19JU1JfQVJCTFNUfENFQ19JU1JfVFhVRFJ8Q0VDX0lTUl9UWEVSUnxDRUNfSVNSX1RYQUNLRSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDX0lFUl9BTExfUlggQ0VDIGFsbCBSWCBlcnJvcnMgaW50ZXJydXB0cyBlbmFibGluZyBmbGFnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0VDX0lFUl9SWF9BTExfRVJSICAgICAgICAgICAgICAoKHVpbnQzMl90KUNFQ19JRVJfUlhBQ0tFSUV8Q0VDX0lFUl9MQlBFSUV8Q0VDX0lFUl9TQlBFSUV8Q0VDX0lFUl9CUkVJRXxDRUNfSUVSX1JYT1ZSSUUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19JRVJfQUxMX1RYIENFQyBhbGwgVFggZXJyb3JzIGludGVycnVwdHMgZW5hYmxpbmcgZmxhZworICAqIEB7CisgICovCisjZGVmaW5lIENFQ19JRVJfVFhfQUxMX0VSUiAgICAgICAgICAgICAgKCh1aW50MzJfdClDRUNfSUVSX1RYQUNLRUlFfENFQ19JRVJfVFhFUlJJRXxDRUNfSUVSX1RYVURSSUV8Q0VDX0lFUl9BUkJMU1RJRSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9NYWNyb3MgQ0VDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IENFQyBoYW5kbGUgZ3N0YXRlICYgUnhTdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDRUMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfQ0VDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVTRVQ7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9DRUNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX0NFQ19TVEFURV9SRVNFVDsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZW5kaWYgLyogVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKiogQGJyaWVmICBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBDRUMgaW50ZXJydXB0IGZsYWcgaXMgc2V0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYQUNLRTogVHggTWlzc2luZyBhY2tub3dsZWRnZSBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWEVSUjogVHggRXJyb3IuCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYVURSOiBUeC1CdWZmZXIgVW5kZXJydW4uCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYRU5EOiBFbmQgb2YgdHJhbnNtaXNzaW9uIChzdWNjZXNzZnVsIHRyYW5zbWlzc2lvbiBvZiB0aGUgbGFzdCBieXRlKS4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhCUjogVHgtQnl0ZSBSZXF1ZXN0LgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19BUkJMU1Q6IEFyYml0cmF0aW9uIExvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfUlhBQ0tFOiBSeC1NaXNzaW5nIEFja25vd2xlZGdlCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0xCUEU6IFJ4IExvbmcgcGVyaW9kIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1NCUEU6IFJ4IFNob3J0IHBlcmlvZCBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19CUkU6IFJ4IEJpdCBSaXNpbmcgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfUlhPVlI6IFJ4IE92ZXJydW4uCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1JYRU5EOiBFbmQgT2YgUmVjZXB0aW9uLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWEJSOiBSeC1CeXRlIFJlY2VpdmVkLgorICAqIEByZXR2YWwgSVRTdGF0dXMKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFycyB0aGUgaW50ZXJydXB0IG9yIHN0YXR1cyBmbGFnIHdoZW4gcmFpc2VkICh3cml0ZSBhdCAxKQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdC9zdGF0dXMgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhBQ0tFOiBUeCBNaXNzaW5nIGFja25vd2xlZGdlIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1RYRVJSOiBUeCBFcnJvci4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhVRFI6IFR4LUJ1ZmZlciBVbmRlcnJ1bi4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfVFhFTkQ6IEVuZCBvZiB0cmFuc21pc3Npb24gKHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIG9mIHRoZSBsYXN0IGJ5dGUpLgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19UWEJSOiBUeC1CeXRlIFJlcXVlc3QuCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0FSQkxTVDogQXJiaXRyYXRpb24gTG9zdAorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWEFDS0U6IFJ4LU1pc3NpbmcgQWNrbm93bGVkZ2UKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfTEJQRTogUnggTG9uZyBwZXJpb2QgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfU0JQRTogUnggU2hvcnQgcGVyaW9kIEVycm9yCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX0JSRTogUnggQml0IFJpc2luZyBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBDRUNfRkxBR19SWE9WUjogUnggT3ZlcnJ1bi4KKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0ZMQUdfUlhFTkQ6IEVuZCBPZiBSZWNlcHRpb24uCisgICogICAgICAgICAgICBAYXJnIENFQ19GTEFHX1JYQlI6IFJ4LUJ5dGUgUmVjZWl2ZWQuCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgfD0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIENFQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBDRUMgaW50ZXJydXB0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhBQ0tFOiBUeCBNaXNzaW5nIGFja25vd2xlZGdlIEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhFUlI6IFR4IEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhVRFI6IFR4LUJ1ZmZlciBVbmRlcnJ1biBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYRU5EOiBFbmQgb2YgdHJhbnNtaXNzaW9uIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhCUjogVHgtQnl0ZSBSZXF1ZXN0IElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfQVJCTFNUOiBBcmJpdHJhdGlvbiBMb3N0IElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhBQ0tFOiBSeC1NaXNzaW5nIEFja25vd2xlZGdlIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfTEJQRTogUnggTG9uZyBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9TQlBFOiBSeCBTaG9ydCBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9CUkU6IFJ4IEJpdCBSaXNpbmcgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWE9WUjogUnggT3ZlcnJ1biBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYRU5EOiBFbmQgT2YgUmVjZXB0aW9uIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhCUjogUngtQnl0ZSBSZWNlaXZlZCBJVCBFbmFibGUKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGVzIHRoZSBzcGVjaWZpZWQgQ0VDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENFQyBpbnRlcnJ1cHQgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhBQ0tFOiBUeCBNaXNzaW5nIGFja25vd2xlZGdlIEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhFUlI6IFR4IEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhVRFI6IFR4LUJ1ZmZlciBVbmRlcnJ1biBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYRU5EOiBFbmQgb2YgdHJhbnNtaXNzaW9uIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfVFhCUjogVHgtQnl0ZSBSZXF1ZXN0IElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfQVJCTFNUOiBBcmJpdHJhdGlvbiBMb3N0IElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhBQ0tFOiBSeC1NaXNzaW5nIEFja25vd2xlZGdlIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfTEJQRTogUnggTG9uZyBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9TQlBFOiBSeCBTaG9ydCBwZXJpb2QgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9CUkU6IFJ4IEJpdCBSaXNpbmcgRXJyb3IgSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWE9WUjogUnggT3ZlcnJ1biBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYRU5EOiBFbmQgT2YgUmVjZXB0aW9uIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhCUjogUngtQnl0ZSBSZWNlaXZlZCBJVCBFbmFibGUKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmPSAofihfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIENFQyBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENFQyBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYQUNLRTogVHggTWlzc2luZyBhY2tub3dsZWRnZSBFcnJvciBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYRVJSOiBUeCBFcnJvciBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYVURSOiBUeC1CdWZmZXIgVW5kZXJydW4gSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9UWEVORDogRW5kIG9mIHRyYW5zbWlzc2lvbiBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1RYQlI6IFR4LUJ5dGUgUmVxdWVzdCBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX0FSQkxTVDogQXJiaXRyYXRpb24gTG9zdCBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYQUNLRTogUngtTWlzc2luZyBBY2tub3dsZWRnZSBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX0xCUEU6IFJ4IExvbmcgcGVyaW9kIEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfU0JQRTogUnggU2hvcnQgcGVyaW9kIEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfQlJFOiBSeCBCaXQgUmlzaW5nIEVycm9yIElUIEVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBDRUNfSVRfUlhPVlI6IFJ4IE92ZXJydW4gSVQgRW5hYmxlCisgICogICAgICAgICAgICBAYXJnIENFQ19JVF9SWEVORDogRW5kIE9mIFJlY2VwdGlvbiBJVCBFbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQ0VDX0lUX1JYQlI6IFJ4LUJ5dGUgUmVjZWl2ZWQgSVQgRW5hYmxlCisgICogQHJldHZhbCBGbGFnU3RhdHVzCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJiAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZXMgdGhlIENFQyBkZXZpY2UKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DRUNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgQ0VDX0NSX0NFQ0VOKQorCisvKiogQGJyaWVmICBEaXNhYmxlcyB0aGUgQ0VDIGRldmljZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICB+Q0VDX0NSX0NFQ0VOKQorCisvKiogQGJyaWVmICBTZXQgVHJhbnNtaXNzaW9uIFN0YXJ0IGZsYWcKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DRUNfRklSU1RfQllURV9UWF9TRVQoX19IQU5ETEVfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgQ0VDX0NSX1RYU09NKQorCisvKiogQGJyaWVmICBTZXQgVHJhbnNtaXNzaW9uIEVuZCBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ0VDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKiBJZiB0aGUgQ0VDIG1lc3NhZ2UgY29uc2lzdHMgb2Ygb25seSBvbmUgYnl0ZSwgVFhFT00gbXVzdCBiZSBzZXQgYmVmb3JlIG9mIFRYU09NLgorICAqLworI2RlZmluZSBfX0hBTF9DRUNfTEFTVF9CWVRFX1RYX1NFVChfX0hBTkRMRV9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgQ0VDX0NSX1RYRU9NKQorCisvKiogQGJyaWVmICBHZXQgVHJhbnNtaXNzaW9uIFN0YXJ0IGZsYWcKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEByZXR2YWwgRmxhZ1N0YXR1cworICAqLworI2RlZmluZSBfX0hBTF9DRUNfR0VUX1RSQU5TTUlTU0lPTl9TVEFSVF9GTEFHKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIENFQ19DUl9UWFNPTSkKKworLyoqIEBicmllZiAgR2V0IFRyYW5zbWlzc2lvbiBFbmQgZmxhZworICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHJldHZhbCBGbGFnU3RhdHVzCisgICovCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfVFJBTlNNSVNTSU9OX0VORF9GTEFHKF9fSEFORExFX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICYgQ0VDX0NSX1RYRU9NKQorCisvKiogQGJyaWVmICBDbGVhciBPQVIgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDRUMgSGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DRUNfQ0xFQVJfT0FSKF9fSEFORExFX18pICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IsIENFQ19DRkdSX09BUikKKworLyoqIEBicmllZiAgU2V0IE9BUiByZWdpc3RlciAod2l0aG91dCByZXNldHRpbmcgcHJldmlvdXNseSBzZXQgYWRkcmVzcyBpbiBjYXNlIG9mIG11bHRpLWFkZHJlc3MgbW9kZSkKKyAgKiAgICAgICAgICBUbyByZXNldCBPQVIsIF9fSEFMX0NFQ19DTEVBUl9PQVIoKSBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlaGFuZAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENFQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0FERFJFU1NfXyBPd24gQWRkcmVzcyB2YWx1ZSAoQ0VDIGxvZ2ljYWwgYWRkcmVzcyBpcyBpZGVudGlmaWVkIGJ5IGJpdCBwb3NpdGlvbikKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ0VDX1NFVF9PQVIoX19IQU5ETEVfXyxfX0FERFJFU1NfXykgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGR1IsIChfX0FERFJFU1NfXyk8PCBDRUNfQ0ZHUl9PQVJfTFNCX1BPUykKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX0luaXQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19EZUluaXQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19TZXREZXZpY2VBZGRyZXNzKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCB1aW50MTZfdCBDRUNfT3duQWRkcmVzcyk7Cit2b2lkIEhBTF9DRUNfTXNwSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7Cit2b2lkIEhBTF9DRUNfTXNwRGVJbml0KENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKKworI2lmIChVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfUmVnaXN0ZXJDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgSEFMX0NFQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDRUNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1VuUmVnaXN0ZXJDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgSEFMX0NFQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19SZWdpc3RlclJ4Q3BsdENhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCBwQ0VDX1J4Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1VuUmVnaXN0ZXJSeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYyk7CisjZW5kaWYgLyogVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ0VDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfVHJhbnNtaXRfSVQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQ4X3QgSW5pdGlhdG9yQWRkcmVzcywgdWludDhfdCBEZXN0aW5hdGlvbkFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBTaXplKTsKK3VpbnQzMl90IEhBTF9DRUNfR2V0TGFzdFJlY2VpdmVkRnJhbWVTaXplKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKK3ZvaWQgSEFMX0NFQ19DaGFuZ2VSeEJ1ZmZlcihDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgdWludDhfdCAqUnhidWZmZXIpOwordm9pZCBIQUxfQ0VDX0lSUUhhbmRsZXIoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOwordm9pZCBIQUxfQ0VDX1R4Q3BsdENhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKK3ZvaWQgSEFMX0NFQ19SeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgdWludDMyX3QgUnhGcmFtZVNpemUpOwordm9pZCBIQUxfQ0VDX0Vycm9yQ2FsbGJhY2soQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfQ0VDX1N0YXRlVHlwZURlZiBIQUxfQ0VDX0dldFN0YXRlKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKTsKK3VpbnQzMl90IEhBTF9DRUNfR2V0RXJyb3IoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfVHlwZXMgQ0VDIFByaXZhdGUgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDRUNfUHJpdmF0ZV9WYXJpYWJsZXMgQ0VDIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfQ29uc3RhbnRzIENFQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENFQ19Qcml2YXRlX01hY3JvcyBDRUMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NFQ19TSUdOQUxGUkVFVElNRShfX1NGVF9fKSAgICAgKChfX1NGVF9fKSA8PSBDRUNfQ0ZHUl9TRlQpCisKKyNkZWZpbmUgSVNfQ0VDX1RPTEVSQU5DRShfX1JYVE9MX18pICAgICAgICAoKChfX1JYVE9MX18pID09IENFQ19TVEFOREFSRF9UT0xFUkFOQ0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYVE9MX18pID09IENFQ19FWFRFTkRFRF9UT0xFUkFOQ0UpKQorCisjZGVmaW5lIElTX0NFQ19CUkVSWFNUT1AoX19CUkVSWFNUT1BfXykgICAoKChfX0JSRVJYU1RPUF9fKSA9PSBDRUNfTk9fUlhfU1RPUF9PTl9CUkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQlJFUlhTVE9QX18pID09IENFQ19SWF9TVE9QX09OX0JSRSkpCisKKyNkZWZpbmUgSVNfQ0VDX0JSRUVSUk9SQklUR0VOKF9fRVJST1JCSVRHRU5fXykgKCgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJFX0VSUk9SQklUX05PX0dFTkVSQVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJFX0VSUk9SQklUX0dFTkVSQVRJT04pKQorCisjZGVmaW5lIElTX0NFQ19MQlBFRVJST1JCSVRHRU4oX19FUlJPUkJJVEdFTl9fKSAoKChfX0VSUk9SQklUR0VOX18pID09IENFQ19MQlBFX0VSUk9SQklUX05PX0dFTkVSQVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVJST1JCSVRHRU5fXykgPT0gQ0VDX0xCUEVfRVJST1JCSVRfR0VORVJBVElPTikpCisKKyNkZWZpbmUgSVNfQ0VDX0JST0FEQ0FTVEVSUk9SX05PX0VSUk9SQklUX0dFTkVSQVRJT04oX19FUlJPUkJJVEdFTl9fKSAoKChfX0VSUk9SQklUR0VOX18pID09IENFQ19CUk9BRENBU1RFUlJPUl9FUlJPUkJJVF9HRU5FUkFUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FUlJPUkJJVEdFTl9fKSA9PSBDRUNfQlJPQURDQVNURVJST1JfTk9fRVJST1JCSVRfR0VORVJBVElPTikpCisKKyNkZWZpbmUgSVNfQ0VDX1NGVE9QKF9fU0ZUT1BfXykgICAgICAgICAgKCgoX19TRlRPUF9fKSA9PSBDRUNfU0ZUX1NUQVJUX09OX1RYU09NKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0ZUT1BfXykgPT0gQ0VDX1NGVF9TVEFSVF9PTl9UWF9SWF9FTkQpKQorCisjZGVmaW5lIElTX0NFQ19MSVNURU5JTkdfTU9ERShfX01PREVfXykgICAgICgoKF9fTU9ERV9fKSA9PSBDRUNfUkVEVUNFRF9MSVNURU5JTkdfTU9ERSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ0VDX0ZVTExfTElTVEVOSU5HX01PREUpKQorCisvKiogQGJyaWVmIENoZWNrIENFQyBtZXNzYWdlIHNpemUuCisgICogICAgICAgVGhlIG1lc3NhZ2Ugc2l6ZSBpcyB0aGUgcGF5bG9hZCBzaXplOiB3aXRob3V0IGNvdW50aW5nIHRoZSBoZWFkZXIsCisgICogICAgICAgaXQgdmFyaWVzIGZyb20gMCBieXRlIChwaW5nIG9wZXJhdGlvbiwgb25lIGhlYWRlciBvbmx5LCBubyBwYXlsb2FkKSB0bworICAqICAgICAgIDE1IGJ5dGVzICgxIG9wY29kZSBhbmQgdXAgdG8gMTQgb3BlcmFuZHMgZm9sbG93aW5nIHRoZSBoZWFkZXIpLgorICAqIEBwYXJhbSAgX19TSVpFX18gQ0VDIG1lc3NhZ2Ugc2l6ZS4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgSVNfQ0VDX01TR1NJWkUoX19TSVpFX18pICgoX19TSVpFX18pIDw9IDB4MTBVKQorCisvKiogQGJyaWVmIENoZWNrIENFQyBkZXZpY2UgT3duIEFkZHJlc3MgUmVnaXN0ZXIgKE9BUikgc2V0dGluZy4KKyAgKiAgICAgICAgT0FSIGFkZHJlc3MgaXMgd3JpdHRlbiBpbiBhIDE1LWJpdCBmaWVsZCB3aXRoaW4gQ0VDX0NGR1IgcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0FERFJFU1NfXyBDRUMgb3duIGFkZHJlc3MuCisgICogQHJldHZhbCBUZXN0IHJlc3VsdCAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIElTX0NFQ19PV05fQUREUkVTUyhfX0FERFJFU1NfXykgKChfX0FERFJFU1NfXykgPD0gMHg3RkZGVSkKKworLyoqIEBicmllZiBDaGVjayBDRUMgaW5pdGlhdG9yIG9yIGRlc3RpbmF0aW9uIGxvZ2ljYWwgYWRkcmVzcyBzZXR0aW5nLgorICAqICAgICAgICBJbml0aWF0b3IgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBhcmUgY29kZWQgb3ZlciA0IGJpdHMuCisgICogQHBhcmFtICBfX0FERFJFU1NfXyBDRUMgaW5pdGlhdG9yIG9yIGxvZ2ljYWwgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgSVNfQ0VDX0FERFJFU1MoX19BRERSRVNTX18pICgoX19BRERSRVNTX18pIDw9IDB4RlUpCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfRnVuY3Rpb25zIENFQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eEhBTF9DRUNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfY29tcC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmM3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9jb21wLmgKQEAgLTAsMCArMSw3NjIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2NvbXAuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09NUCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfQ09NUF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfQ09NUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9leHRpLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoQ09NUDEpIHx8IGRlZmluZWQgKENPTVAyKQorCisvKiogQGFkZHRvZ3JvdXAgQ09NUAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfVHlwZXMgQ09NUCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ09NUCBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworCisgIHVpbnQzMl90IFdpbmRvd01vZGU7ICAgICAgICAgLyohPCBTZXQgd2luZG93IG1vZGUgb2YgYSBwYWlyIG9mIGNvbXBhcmF0b3JzIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgY29uc2VjdXRpdmUgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSEFMIENPTVAgZHJpdmVyIGFsbG93cyB0byBzZXQgd2luZG93IG1vZGUgZnJvbSBhbnkgQ09NUCBpbnN0YW5jZSBvZiB0aGUgcGFpciBvZiBDT01QIGluc3RhbmNlcyBjb21wb3Npbmcgd2luZG93IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfV2luZG93TW9kZSAqLworCisgIHVpbnQzMl90IFdpbmRvd091dHB1dDsgICAgICAgLyohPCBTZXQgd2luZG93IG1vZGUgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX1dpbmRvd091dHB1dCAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcGFyYXRvciBwb3dlciBtb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BhZ2F0aW9uIGRlbGF5IGFuZCBwb3dlciBjb25zdW1wdGlvbiksIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfUG93ZXJNb2RlICovCisKKyAgdWludDMyX3QgSW5wdXRQbHVzOyAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0lucHV0UGx1cyAqLworCisgIHVpbnQzMl90IElucHV0TWludXM7ICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9JbnB1dE1pbnVzICovCisKKyAgdWludDMyX3QgSHlzdGVyZXNpczsgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGh5c3RlcmVzaXMgbW9kZSBvZiB0aGUgaW5wdXQgbWludXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfSHlzdGVyZXNpcyAqLworCisgIHVpbnQzMl90IE91dHB1dFBvbDsgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfT3V0cHV0UG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBCbGFua2luZ1NyY2U7ICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgYmxhbmtpbmcgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0JsYW5raW5nU3JjZSAqLworCisgIHVpbnQzMl90IFRyaWdnZXJNb2RlOyAgICAgICAgLyohPCBTZXQgdGhlIGNvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgKEVYVEkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0VYVElfVHJpZ2dlck1vZGUgKi8KKworfSBDT01QX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBDT01QIHN0YXRlIG1hY2hpbmU6IEhBTCBDT01QIHN0YXRlcyBkZWZpbml0aW9uCisgICovCisjZGVmaW5lIENPTVBfU1RBVEVfQklURklFTERfTE9DSyAgKDB4MTBVKQordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DT01QX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX1JFU0VUX0xPQ0tFRCAgICAgID0gKEhBTF9DT01QX1NUQVRFX1JFU0VUIHwgQ09NUF9TVEFURV9CSVRGSUVMRF9MT0NLKSwgLyohPCBDT01QIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgYW5kIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkICovCisgIEhBTF9DT01QX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX1JFQURZX0xPQ0tFRCAgICAgID0gKEhBTF9DT01QX1NUQVRFX1JFQURZIHwgQ09NUF9TVEFURV9CSVRGSUVMRF9MT0NLKSwgLyohPCBDT01QIGluaXRpYWxpemVkIGJ1dCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIGlzIHJ1bm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9DT01QX1NUQVRFX0JVU1lfTE9DS0VEICAgICAgID0gKEhBTF9DT01QX1NUQVRFX0JVU1kgfCBDT01QX1NUQVRFX0JJVEZJRUxEX0xPQ0spICAgLyohPCBDT01QIGlzIHJ1bm5pbmcgYW5kIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkICAgICAgICAgICovCit9IEhBTF9DT01QX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBDT01QIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX0NPTVBfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgQ09NUF9UeXBlRGVmICAgICAgICpJbnN0YW5jZTsgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKyAgQ09NUF9Jbml0VHlwZURlZiAgIEluaXQ7ICAgICAgICAgICAgLyohPCBDT01QIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKyAgSEFMX0xvY2tUeXBlRGVmICAgIExvY2s7ICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgKi8KKyAgX19JTyBIQUxfQ09NUF9TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgLyohPCBDT01QIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKyAgX19JTyB1aW50MzJfdCAgICAgIEVycm9yQ29kZTsgICAgICAgLyohPCBDT01QIGVycm9yIGNvZGUgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIFRyaWdnZXJDYWxsYmFjaykoc3RydWN0IF9fQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7ICAgLyohPCBDT01QIHRyaWdnZXIgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOyAgIC8qITwgQ09NUCBNc3AgSW5pdCBjYWxsYmFjayAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19DT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsgLyohPCBDT01QIE1zcCBEZUluaXQgY2FsbGJhY2sgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IENPTVBfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBDT01QIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQ09NUF9UUklHR0VSX0NCX0lEICAgICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IENPTVAgdHJpZ2dlciBjYWxsYmFjayBJRCAqLworICBIQUxfQ09NUF9NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IENPTVAgTXNwIEluaXQgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICA9IDB4MDJVICAgLyohPCBDT01QIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgKi8KK30gSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIENPTVAgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcENPTVBfQ2FsbGJhY2tUeXBlRGVmKShDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsgLyohPCBwb2ludGVyIHRvIGEgQ09NUCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0NvbnN0YW50cyBDT01QIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FcnJvcl9Db2RlIENPTVAgRXJyb3IgQ29kZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9DT01QX0VSUk9SX05PTkUgICAgICAgICAgICAgKDB4MDBVTCkgIC8qITwgTm8gZXJyb3IgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfQ09NUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICgweDAxVUwpICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfV2luZG93TW9kZSBDT01QIFdpbmRvdyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBXaW5kb3cgbW9kZSBkaXNhYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgYXJlIGluZGVwZW5kZW50ICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTiAoQ09NUF9DU1JfV0lOTU9ERSkgICAgIC8qITwgV2luZG93IG1vZGUgZW5hYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgaGF2ZSB0aGVpciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0b2dldGhlci4gVGhlIGNvbW1vbiBpbnB1dCBpcyBDT01QMSBpbnB1dCBwbHVzIChDT01QMiBpbnB1dCBwbHVzIGlzIG5vIG1vcmUgYWNjZXNzaWJsZSkuICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9DT01QMl9JTlBVVF9QTFVTX0NPTU1PTiAoQ09NUF9DU1JfV0lOTU9ERSB8IENPTVBfV0lORE9XTU9ERV9DT01QMikgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAxIGFuZCBDT01QMiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAyIGlucHV0IHBsdXMgKENPTVAxIGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9XaW5kb3dPdXRwdXQgQ09NUCBXaW5kb3cgb3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9XSU5ET1dPVVRQVVRfRUFDSF9DT01QICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93IG91dHB1dCBkZWZhdWx0IG1vZGU6IENvbXBhcmF0b3JzIG91dHB1dCBhcmUgaW5kaWNhdGluZyBlYWNoIHRoZWlyIG93biBzdGF0ZS4gVG8ga25vdyB3aW5kb3cgbW9kZSBzdGF0ZTogZWFjaCBjb21wYXJhdG9yIG91dHB1dCBtdXN0IGJlIHJlYWQsIGlmICIoKENPTVB4IGV4Y2x1c2l2ZSBvciBDT01QeSkgPT0gMSkiIHRoZW4gbW9uaXRvcmVkIHNpZ25hbCBpcyB3aXRoaW4gY29tcGFyYXRvcnMgd2luZG93LiAgKi8KKyNkZWZpbmUgQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDEgICAgICAgICAgICAgICAgIChDT01QX0NTUl9XSU5PVVQpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93IG91dHB1dCBzeW50aGV0aXplZCBvbiBDT01QMSBvdXRwdXQ6IENPTVAxIG91dHB1dCBpcyBubyBtb3JlIGluZGljYXRpbmcgaXRzIG93biBzdGF0ZSwgYnV0IGdsb2JhbCB3aW5kb3cgbW9kZSBzdGF0ZSAobG9naWNhbCBoaWdoIG1lYW5zIG1vbml0b3JlZCBzaWduYWwgaXMgd2l0aGluIGNvbXBhcmF0b3JzIHdpbmRvdykuICovCisjZGVmaW5lIENPTVBfV0lORE9XT1VUUFVUX0NPTVAyICAgICAgICAgICAgICAgICAoQ09NUF9DU1JfV0lOT1VUIHwgQ09NUF9XSU5ET1dNT0RFX0NPTVAyKSAvKiE8IFdpbmRvdyBvdXRwdXQgc3ludGhldGl6ZWQgb24gQ09NUDIgb3V0cHV0OiBDT01QMiBvdXRwdXQgaXMgbm8gbW9yZSBpbmRpY2F0aW5nIGl0cyBvd24gc3RhdGUsIGJ1dCBnbG9iYWwgd2luZG93IG1vZGUgc3RhdGUgKGxvZ2ljYWwgaGlnaCBtZWFucyBtb25pdG9yZWQgc2lnbmFsIGlzIHdpdGhpbiBjb21wYXJhdG9ycyB3aW5kb3cpLiAqLworI2RlZmluZSBDT01QX1dJTkRPV09VVFBVVF9CT1RIICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXaW5kb3cgb3V0cHV0IHN5bnRoZXRpemVkIG9uIGJvdGggQ09NUDEgYW5kIENPTVAyIG91dHB1dDogQ09NUDEgYW5kIENPTVAyIG91dHB1dHMgYXJlIG5vIG1vcmUgaW5kaWNhdGluZyB0aGVpciBvd24gc3RhdGUsIGJ1dCBnbG9iYWwgd2luZG93IG1vZGUgc3RhdGUgKGxvZ2ljYWwgaGlnaCBtZWFucyBtb25pdG9yZWQgc2lnbmFsIGlzIHdpdGhpbiBjb21wYXJhdG9ycyB3aW5kb3cpLiBUaGlzIGlzIGEgc3BlY2lmaWMgY29uZmlndXJhdG9uICh0ZWNobmljYWxseSBwb3NzaWJsZSBidXQgbm90IHJlbGV2YW50IGZyb20gYXBwbGljYXRpb24gcG9pbnQgb2YgdmlldzogMiBjb21wYXJhdG9ycyBvdXRwdXQgdXNlZCBmb3IgdGhlIHNhbWUgc2lnbmFsIGxldmVsKSwgc3RhbmRhcmQgY29uZmlndXJhdG9uIGZvciB3aW5kb3cgbW9kZSBpcyBvbmUgb2YgdGhlIDMgc2V0dGluZ3MgYWJvdmUuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfUG93ZXJNb2RlIENPTVAgcG93ZXIgbW9kZQorICAqIEB7CisgICovCisvKiBOb3RlOiBGb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBjb21wYXJhdG9yIHBvd2VyIG1vZGVzICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgKHByb3BhZ2F0aW9uIGRlbGF5IGFuZCBwb3dlciBjb25zdW1wdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgSGlnaCBTcGVlZCAqLworI2RlZmluZSBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCAgICAgKENPTVBfQ1NSX1BXUk1PREVfMCkgICAvKiE8IE1lZGl1bSBTcGVlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0lucHV0UGx1cyBDT01QIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9QTFVTX0lPMSAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBDNSBmb3IgQ09NUDEsIHBpbiBQQjQgZm9yIENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgICAgKENPTVBfQ1NSX0lOUFNFTF8wKSAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEIyIGZvciBDT01QMSwgcGluIFBCNiBmb3IgQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfUExVU19JTzMgICAgICAgICAgICAoQ09NUF9DU1JfSU5QU0VMXzEpICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzMgKHBpbiBQQTEgZm9yIENPTVAxLCBwaW4gUEEzIGZvciBDT01QMikgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9JbnB1dE1pbnVzIENPTVAgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvNCBWcmVmSW50ICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvMiBWcmVmSW50ICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMSAgICAgICAgICAgICAgICAgICAgKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDMvNCBWcmVmSW50ICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMSB8IENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIFZyZWZJbnQgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSAgICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSAoREFDX09VVDEpICAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyICAgICAgKCAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfSU5NU0VMXzIgICAgICAgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIERBQzEgY2hhbm5lbCAyIChEQUNfT1VUMikgICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfSU8xICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8xIChwaW4gUEE5IGZvciBDT01QMSwgcGluIFBCMyBmb3IgQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfSU8yICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEM0IGZvciBDT01QMSwgcGluIFBCNyBmb3IgQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfSU8zICAgICAgICAgICAoQ09NUF9DU1JfSU5NU0VMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8zIChwaW4gUEEwIGZvciBDT01QMSwgcGluIFBBMiBmb3IgQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSHlzdGVyZXNpcyBDT01QIGh5c3RlcmVzaXMKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0hZU1RFUkVTSVNfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gaHlzdGVyZXNpcyAqLworI2RlZmluZSBDT01QX0hZU1RFUkVTSVNfTE9XICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0hZU1RfMCkgIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBsb3cgKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICAgIChDT01QX0NTUl9IWVNUXzEgICAgICAgICAgICAgICAgICApICAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgbWVkaXVtICovCisjZGVmaW5lIENPTVBfSFlTVEVSRVNJU19ISUdIICAgICAgICAgICAoQ09NUF9DU1JfSFlTVF8xIHwgQ09NUF9DU1JfSFlTVF8wKSAgLyohPCBIeXN0ZXJlc2lzIGxldmVsIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9PdXRwdXRQb2xhcml0eSBDT01QIG91dHB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgbGV2ZWwgaXMgbm90IGludmVydGVkIChjb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cykgKi8KKyNkZWZpbmUgQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQgICAgICAgIChDT01QX0NTUl9QT0xBUklUWSkgICAgLyohPCBDT01QIG91dHB1dCBsZXZlbCBpcyBpbnZlcnRlZCAgICAgKGNvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyAgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0JsYW5raW5nU3JjZSAgQ09NUCBibGFua2luZyBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDX05PTkUgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAvKiE8Q29tcGFyYXRvciBvdXRwdXQgd2l0aG91dCBibGFua2luZyAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNfVElNMV9PQzQgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18wKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M0IChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNfVElNMV9PQzUgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18xKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M1IChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzMgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18yKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0MzIChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNfVElNM19PQzMgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18zKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTMgT0MzIChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNfVElNMTVfT0MyICAgICAgIChDT01QX0NTUl9CTEFOS0lOR180KSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTE1IE9DMiAoY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlczogQ09NUDEsIENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX091dHB1dExldmVsIENPTVAgT3V0cHV0IExldmVsCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIHZhbHVlcyBhcmUgZml4ZWQgdG8gIjAiIGFuZCAiMSIsICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIENPTVAgcmVnaXN0ZXIgYml0IGlzIG1hbmFnZWQgYnkgSEFMIGZ1bmN0aW9uIHRvIG1hdGNoICAgICAgICAqLworLyogd2l0aCB0aGVzZSB2YWx1ZXMgKGluZGVwZW5kZW50bHkgb2YgYml0IHBvc2l0aW9uIGluIHJlZ2lzdGVyKS4gICAgICAgICAgICAgKi8KKworLyogV2hlbiBvdXRwdXQgcG9sYXJpdHkgaXMgbm90IGludmVydGVkLCBjb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbgorICAgdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0xPVyAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkKKy8qIFdoZW4gb3V0cHV0IHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgY29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuCisgICB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0hJR0ggICAgICAgICAgICAgKDB4MDAwMDAwMDFVTCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FWFRJX1RyaWdnZXJNb2RlIENPTVAgb3V0cHV0IHRvIEVYVEkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgbm8gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkcgICAgICAgICAgICAoQ09NUF9FWFRJX0lUIHwgQ09NUF9FWFRJX1JJU0lORykgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCB0cmlnZ2VyaW5nIEV4dGVybmFsIEludGVycnVwdCBMaW5lIGV2ZW50IHdpdGggaW50ZXJydXB0aW9uLCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX0ZBTExJTkcgICAgICAgICAgIChDT01QX0VYVElfSVQgfCBDT01QX0VYVElfRkFMTElORykgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24sIG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgIChDT01QX0VYVElfSVQgfCBDT01QX0VYVElfUklTSU5HIHwgQ09NUF9FWFRJX0ZBTExJTkcpICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24sIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HICAgICAgICAgKENPTVBfRVhUSV9FVkVOVCB8IENPTVBfRVhUSV9SSVNJTkcpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbiksIG9uIHJpc2luZyBlZGdlICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfRkFMTElORyAgICAgICAgKENPTVBfRVhUSV9FVkVOVCB8IENPTVBfRVhUSV9GQUxMSU5HKSAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbiksIG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HIChDT01QX0VYVElfRVZFTlQgfCBDT01QX0VYVElfUklTSU5HIHwgQ09NUF9FWFRJX0ZBTExJTkcpICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgb25seSAod2l0aG91dCBpbnRlcnJ1cHRpb24pLCBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9NYWNyb3MgQ09NUCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSGFuZGxlX01hbmFnZW1lbnQgIENPTVAgSGFuZGxlIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBDT01QIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgQ09NUCBlcnJvciBjb2RlIChzZXQgaXQgdG8gbm8gZXJyb3IgY29kZSAiSEFMX0NPTVBfRVJST1JfTk9ORSIpLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIENPTVBfQ0xFQVJfRVJST1JDT0RFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkVycm9yQ29kZSA9IEhBTF9DT01QX0VSUk9SX05PTkUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfRU4pCisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIFVzaW5nIHRoaXMgbWFjcm8gaW5kdWNlIEhBTCBDT01QIGhhbmRsZSBzdGF0ZSBtYWNoaW5lIGJlaW5nIG5vCisgICogICAgICAgICBtb3JlIGluIGxpbmUgd2l0aCBDT01QIGluc3RhbmNlIHN0YXRlLgorICAqICAgICAgICAgVG8ga2VlcCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgbWFjaGluZSB1cGRhdGVkLCBpdCBpcyByZWNvbW1lbmRlZAorICAqICAgICAgICAgdG8gdXNlIGZ1bmN0aW9uICJIQUxfQ09NUF9Mb2NrJykiLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9MT0NLKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yIGlzIGxvY2tlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBWYWx1ZSAwIGlmIENPTVAgaW5zdGFuY2UgaXMgbm90IGxvY2tlZCwgdmFsdWUgMSBpZiBDT01QIGluc3RhbmNlIGlzIGxvY2tlZAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0lTX0xPQ0tFRChfX0hBTkRMRV9fKSAgICAgICAgICAgKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfTE9DSykgPT0gQ09NUF9DU1JfTE9DSykKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4dGlfTWFuYWdlbWVudCAgQ09NUCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBDT01QMSBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICBMTF9FWFRJX0dlbmVyYXRlU1dJXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyBmbGFnIGlzIHNldC4KKyAgKiBAcmV0dmFsIFJFU0VUIG9yIFNFVAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX1JJU0lOR19GTEFHKCkgICAgICAgTExfRVhUSV9Jc0FjdGl2ZVJpc2luZ0ZsYWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ09NUDEgRVhUSSByaXNpbmcgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX1JJU0lOR19GTEFHKCkgICAgIExMX0VYVElfQ2xlYXJSaXNpbmdGbGFnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDEgRVhUSSBsaW5lIGZhbGxpbmcgZmxhZyBpcyBzZXQuCisgICogQHJldHZhbCBSRVNFVCBvciBTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GQUxMSU5HX0ZMQUcoKSAgICAgIExMX0VYVElfSXNBY3RpdmVGYWxsaW5nRmxhZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QMSBFWFRJIGZhbGxpbmcgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0NMRUFSX0ZBTExJTkdfRkxBRygpICAgIExMX0VYVElfQ2xlYXJGYWxsaW5nRmxhZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAyIEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGludGVycnVwdCBvbiB0aGUgQ09NUDIgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVAyIEVYVEkgbGluZSByaXNpbmcgZmxhZyBpcyBzZXQuCisgICogQHJldHZhbCBSRVNFVCBvciBTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9SSVNJTkdfRkxBRygpICAgICAgIExMX0VYVElfSXNBY3RpdmVSaXNpbmdGbGFnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENPTVAyIEVYVEkgcmlzaW5nIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9SSVNJTkdfRkxBRygpICAgICBMTF9FWFRJX0NsZWFyUmlzaW5nRmxhZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVAyIEVYVEkgbGluZSBmYWxsaW5nIGZsYWcgaXMgc2V0LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkFMTElOR19GTEFHKCkgICAgICBMTF9FWFRJX0lzQWN0aXZlRmFsbGluZ0ZsYWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ09NUDIgRVhUSSBmYWxsaW5nIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GQUxMSU5HX0ZMQUcoKSAgICBMTF9FWFRJX0NsZWFyRmFsbGluZ0ZsYWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9Qcml2YXRlX0NvbnN0YW50cyBDT01QIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX1dpbmRvd01vZGVfSW5zdGFuY2VfRGlmZmVyZW50aWF0b3IgQ09NUCB3aW5kb3cgbW9kZSBpbnN0YW5jZSBkaWZmZXJlbnRpYXRvcgorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9DT01QMiAgICAgICAgICAweDAwMDAxMDAwVSAgICAgICAvKiE8IENPTVAgd2luZG93IG1vZGUgdXNpbmcgY29tbW9uIGlucHV0IG9mIENPTVAgaW5zdGFuY2U6IENPTVAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXh0aUxpbmUgQ09NUCBFWFRJIExpbmVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDEgICAgICAgICAgIChFWFRJX0lNUjFfSU0xNykgIC8qITwgRVhUSSBsaW5lIDE3IGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDIgICAgICAgICAgIChFWFRJX0lNUjFfSU0xOCkgIC8qITwgRVhUSSBsaW5lIDE4IGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHRpTGluZSBDT01QIEVYVEkgTGluZXMKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0VYVElfSVQgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAgLyohPCBFWFRJIGxpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVTCkgIC8qITwgRVhUSSBsaW5lIGV2ZW50IG9ubHkgKHdpdGhvdXQgaW50ZXJydXB0aW9uKSAqLworI2RlZmluZSBDT01QX0VYVElfUklTSU5HICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFVMKSAgLyohPCBFWFRJIGxpbmUgZXZlbnQgb24gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjBVTCkgIC8qITwgRVhUSSBsaW5lIGV2ZW50IG9uIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9Qcml2YXRlX01hY3JvcyBDT01QIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0dFVF9FWFRJX0xJTkUgQ09NUCBwcml2YXRlIG1hY3JvcyB0byBnZXQgRVhUSSBsaW5lIGFzc29jaWF0ZWQgd2l0aCBjb21wYXJhdG9ycworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBmb3IgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBzcGVjaWZpZXMgdGhlIENPTVAgaW5zdGFuY2UuCisgICogQHJldHZhbCB2YWx1ZSBvZiBAcmVmIENPTVBfRXh0aUxpbmUKKyAgKi8KKyNkZWZpbmUgQ09NUF9HRVRfRVhUSV9MSU5FKF9fSU5TVEFOQ0VfXykgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBDT01QMSkgPyBDT01QX0VYVElfTElORV9DT01QMSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT01QX0VYVElfTElORV9DT01QMikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9JU19DT01QX0RlZmluaXRpb25zIENPTVAgcHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovCisjZGVmaW5lIElTX0NPTVBfV0lORE9XTU9ERShfX1dJTkRPV01PREVfXykgICgoKF9fV0lORE9XTU9ERV9fKSA9PSBDT01QX1dJTkRPV01PREVfRElTQUJMRSkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dJTkRPV01PREVfXykgPT0gQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XSU5ET1dNT0RFX18pID09IENPTVBfV0lORE9XTU9ERV9DT01QMl9JTlBVVF9QTFVTX0NPTU1PTikgICkKKworI2RlZmluZSBJU19DT01QX1dJTkRPV09VVFBVVChfX1dJTkRPV09VVFBVVF9fKSAoKChfX1dJTkRPV09VVFBVVF9fKSA9PSBDT01QX1dJTkRPV09VVFBVVF9FQUNIX0NPTVApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XSU5ET1dPVVRQVVRfXykgPT0gQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDEpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0lORE9XT1VUUFVUX18pID09IENPTVBfV0lORE9XT1VUUFVUX0NPTVAyKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dJTkRPV09VVFBVVF9fKSA9PSBDT01QX1dJTkRPV09VVFBVVF9CT1RIKSAgICAgICAgKQorCisjZGVmaW5lIElTX0NPTVBfUE9XRVJNT0RFKF9fUE9XRVJNT0RFX18pICAgICgoKF9fUE9XRVJNT0RFX18pID09IENPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPV0VSTU9ERV9fKSA9PSBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgICAgKQorCisjZGVmaW5lIElTX0NPTVBfSU5QVVRfUExVUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9QTFVTX18pICgoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfUExVU19fKSA9PSBDT01QX0lOUFVUX1BMVVNfSU8zKSkKKworI2RlZmluZSBJU19DT01QX0lOUFVUX01JTlVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX01JTlVTX18pICgoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19JTzEpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19JTzIpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRfTUlOVVNfXykgPT0gQ09NUF9JTlBVVF9NSU5VU19JTzMpKQorCisjZGVmaW5lIElTX0NPTVBfSFlTVEVSRVNJUyhfX0hZU1RFUkVTSVNfXykgICgoKF9fSFlTVEVSRVNJU19fKSA9PSBDT01QX0hZU1RFUkVTSVNfTk9ORSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFlTVEVSRVNJU19fKSA9PSBDT01QX0hZU1RFUkVTSVNfTE9XKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFlTVEVSRVNJU19fKSA9PSBDT01QX0hZU1RFUkVTSVNfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSFlTVEVSRVNJU19fKSA9PSBDT01QX0hZU1RFUkVTSVNfSElHSCkpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRQT0woX19QT0xfXykgICAgICAgICAgKCgoX19QT0xfXykgPT0gQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xfXykgPT0gQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQpKQorCisjZGVmaW5lIElTX0NPTVBfQkxBTktJTkdTUkNFKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gQ09NUF9CTEFOS0lOR1NSQ19OT05FKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IENPTVBfQkxBTktJTkdTUkNfVElNMV9PQzQpICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1KSAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMykgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IENPTVBfQkxBTktJTkdTUkNfVElNM19PQzMpICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBDT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMikgICAgICAgICAgXAorICApCisKKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2UgY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlcyAqLworLyogICAgICAgTWFjcm8ga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIHNlcmllcyAqLworI2RlZmluZSBJU19DT01QX0JMQU5LSU5HU1JDX0lOU1RBTkNFKF9fSU5TVEFOQ0VfXywgX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pICBcCisgICAoSVNfQ09NUF9CTEFOS0lOR1NSQ0UoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pKQorCisKKyNkZWZpbmUgSVNfQ09NUF9UUklHR0VSTU9ERShfX01PREVfXykgICAgICAgKCgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfTk9ORSkgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfSVRfUklTSU5HKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfSVRfRkFMTElORykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfSVRfUklTSU5HX0ZBTExJTkcpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfRkFMTElORykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0NPTVBfT1VUUFVUX0xFVkVMKF9fT1VUUFVUX0xFVkVMX18pICgoKF9fT1VUUFVUX0xFVkVMX18pID09IENPTVBfT1VUUFVUX0xFVkVMX0xPVykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVVRQVVRfTEVWRUxfXykgPT0gQ09NUF9PVVRQVVRfTEVWRUxfSElHSCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0RlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX01zcEluaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfQ09NUF9Nc3BEZUluaXQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisKKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENPTVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1N0YXJ0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RvcChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX0lSUUhhbmRsZXIoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0xvY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfQ09NUF9HZXRPdXRwdXRMZXZlbChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qIENhbGxiYWNrIGluIGludGVycnVwdCBtb2RlICovCit2b2lkICAgICAgICAgICAgICBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0CisgICogQHsKKyAgKi8KK0hBTF9DT01QX1N0YXRlVHlwZURlZiBIQUxfQ09NUF9HZXRTdGF0ZShDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3VpbnQzMl90ICAgICAgICAgICAgICBIQUxfQ09NUF9HZXRFcnJvcihDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogQ09NUDEgfHwgQ09NUDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0NPTVBfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfY29uZl90ZW1wbGF0ZS5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfY29uZl90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjUzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9jb25mX3RlbXBsYXRlLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2NvbmYuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSEFMIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGUgZmlsZS4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCByZW5hbWVkCisgICogICAgICAgICAgdG8gc3RtMzJnMHh4X2hhbF9jb25mLmguCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0NPTkZfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0NPTkZfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNb2R1bGUgU2VsZWN0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworLyoqCisgICogQGJyaWVmIFRoaXMgaXMgdGhlIGxpc3Qgb2YgbW9kdWxlcyB0byBiZSB1c2VkIGluIHRoZSBIQUwgZHJpdmVyCisgICovCisjZGVmaW5lIEhBTF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQURDX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9DRUNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0kyQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfSTJTX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9MUFRJTV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1JOR19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfUlRDX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVnaXN0ZXIgQ2FsbGJhY2tzIHNlbGVjdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKy8qKgorICAqIEBicmllZiBUaGlzIGlzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hlcmUgcmVnaXN0ZXIgY2FsbGJhY2sgY2FuIGJlIHVzZWQKKyAgKi8KKyNkZWZpbmUgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyAgICAwdQorI2RlZmluZSBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAgIDB1CisjZGVmaW5lIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAgICAwdQorI2RlZmluZSBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgICAwdQorI2RlZmluZSBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAgMHUKKyNkZWZpbmUgVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAgICAwdQorI2RlZmluZSBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAgMHUKKyNkZWZpbmUgVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAgICAwdQorI2RlZmluZSBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgIDB1CisjZGVmaW5lIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgICAwdQorCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPc2NpbGxhdG9yIFZhbHVlcyBhZGFwdGF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qKgorICAqIEBicmllZiBBZGp1c3QgdGhlIHZhbHVlIG9mIEV4dGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNFKSB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24uCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgUkNDIEhBTCBtb2R1bGUgdG8gY29tcHV0ZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeQorICAqICAgICAgICAod2hlbiBIU0UgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBQTEwpLgorICAqLworI2lmICFkZWZpbmVkICAoSFNFX1ZBTFVFKQorI2RlZmluZSBIU0VfVkFMVUUgICAgKDgwMDAwMDBVTCkgICAgICAgICAgICAvKiE8IFZhbHVlIG9mIHRoZSBFeHRlcm5hbCBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogSFNFX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZCAgKEhTRV9TVEFSVFVQX1RJTUVPVVQpCisjZGVmaW5lIEhTRV9TVEFSVFVQX1RJTUVPVVQgICAgKDEwMFVMKSAgICAgIC8qITwgVGltZSBvdXQgZm9yIEhTRSBzdGFydCB1cCwgaW4gbXMgKi8KKyNlbmRpZiAvKiBIU0VfU1RBUlRVUF9USU1FT1VUICovCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgdmFsdWUuCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgUkNDIEhBTCBtb2R1bGUgdG8gY29tcHV0ZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeQorICAqICAgICAgICAod2hlbiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBQTEwpLgorICAqLworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorI2RlZmluZSBIU0lfVkFMVUUgICAgKDE2MDAwMDAwVUwpICAgICAgICAgICAvKiE8IFZhbHVlIG9mIHRoZSBJbnRlcm5hbCBvc2NpbGxhdG9yIGluIEh6Ki8KKyNlbmRpZiAvKiBIU0lfVkFMVUUgKi8KKworLyoqCisgICogQGJyaWVmIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpIHZhbHVlLgorICAqLworI2lmICFkZWZpbmVkICAoTFNJX1ZBTFVFKQorI2RlZmluZSBMU0lfVkFMVUUgICgzMjAwMFVMKSAgICAgICAgICAgICAgICAvKiE8IExTSSBUeXBpY2FsIFZhbHVlIGluIEh6Ki8KKyNlbmRpZiAvKiBMU0lfVkFMVUUgKi8gICAgICAgICAgICAgICAgICAgICAgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgaW4gSHoKK1RoZSByZWFsIHZhbHVlIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgdmFyaWF0aW9ucworaW4gdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUuKi8KKy8qKgorICAqIEBicmllZiBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKSB2YWx1ZS4KKyAgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBVQVJULCBSVEMgSEFMIG1vZHVsZSB0byBjb21wdXRlIHRoZSBzeXN0ZW0gZnJlcXVlbmN5CisgICovCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisjZGVmaW5lIExTRV9WQUxVRSAgICAoMzI3NjhVTCkgICAgICAgICAgICAgIC8qITwgVmFsdWUgb2YgdGhlIEV4dGVybmFsIG9zY2lsbGF0b3IgaW4gSHoqLworI2VuZGlmIC8qIExTRV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgKExTRV9TVEFSVFVQX1RJTUVPVVQpCisjZGVmaW5lIExTRV9TVEFSVFVQX1RJTUVPVVQgICAgKDUwMDBVTCkgICAgIC8qITwgVGltZSBvdXQgZm9yIExTRSBzdGFydCB1cCwgaW4gbXMgKi8KKyNlbmRpZiAvKiBMU0VfU1RBUlRVUF9USU1FT1VUICovCisKKy8qKgorICAqIEBicmllZiBFeHRlcm5hbCBjbG9jayBzb3VyY2UgZm9yIEkyUzEgcGVyaXBoZXJhbAorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIFJDQyBIQUwgbW9kdWxlIHRvIGNvbXB1dGUgdGhlIEkyUzEgY2xvY2sgc291cmNlCisgICogICAgICAgIGZyZXF1ZW5jeS4KKyAgKi8KKyNpZiAhZGVmaW5lZCAgKEVYVEVSTkFMX0kyUzFfQ0xPQ0tfVkFMVUUpCisjZGVmaW5lIEVYVEVSTkFMX0kyUzFfQ0xPQ0tfVkFMVUUgICAgKDQ4MDAwVUwpIC8qITwgVmFsdWUgb2YgdGhlIEkyUzEgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGluIEh6Ki8KKyNlbmRpZiAvKiBFWFRFUk5BTF9JMlMxX0NMT0NLX1ZBTFVFICovCisKKy8qIFRpcDogVG8gYXZvaWQgbW9kaWZ5aW5nIHRoaXMgZmlsZSBlYWNoIHRpbWUgeW91IG5lZWQgdG8gdXNlIGRpZmZlcmVudCBIU0UsCisgICA9PT0gIHlvdSBjYW4gZGVmaW5lIHRoZSBIU0UgdmFsdWUgaW4geW91ciB0b29sY2hhaW4gY29tcGlsZXIgcHJlcHJvY2Vzc29yLiAqLworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3lzdGVtIENvbmZpZ3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworLyoqCisgICogQGJyaWVmIFRoaXMgaXMgdGhlIEhBTCBzeXN0ZW0gY29uZmlndXJhdGlvbiBzZWN0aW9uCisgICovCisjZGVmaW5lICBWRERfVkFMVUUgICAgICAgICAgICAgICAgICAgICgzMzAwVUwpIC8qITwgVmFsdWUgb2YgVkREIGluIG12ICovCisjZGVmaW5lICBUSUNLX0lOVF9QUklPUklUWSAgICAgICAgICAgICgoMVVMPDxfX05WSUNfUFJJT19CSVRTKSAtIDFVTCkgLyohPCB0aWNrIGludGVycnVwdCBwcmlvcml0eSAqLworI2RlZmluZSAgVVNFX1JUT1MgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSAgUFJFRkVUQ0hfRU5BQkxFICAgICAgICAgICAgICAxVQorI2RlZmluZSAgSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFICAgICAxVQorCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMgU1BJIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworCisvKiBDUkMgRkVBVFVSRTogVXNlIHRvIGFjdGl2YXRlIENSQyBmZWF0dXJlIGluc2lkZSBIQUwgU1BJIERyaXZlcgorKiBBY3RpdmF0ZWQ6IENSQyBjb2RlIGlzIHByZXNlbnQgaW5zaWRlIGRyaXZlcgorKiBEZWFjdGl2YXRlZDogQ1JDIGNvZGUgY2xlYW5lZCBmcm9tIGRyaXZlcgorKi8KKworI2RlZmluZSBVU0VfU1BJX0NSQyAgICAgICAgICAgICAgICAgICAgIDFVCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyBDUllQIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworCisjZGVmaW5lIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAgICAgMVUKKworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBc3NlcnQgU2VsZWN0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworLyoqCisgICogQGJyaWVmIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBleHBhbnNlIHRoZSAiYXNzZXJ0X3BhcmFtIiBtYWNybyBpbiB0aGUKKyAgKiAgICAgICAgSEFMIGRyaXZlcnMgY29kZQorICAqLworLyogI2RlZmluZSBVU0VfRlVMTF9BU1NFUlQgICAgMVUgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICAqIEBicmllZiBJbmNsdWRlIG1vZHVsZXMgaGVhZGVyIGZpbGUKKyAgKi8KKworI2lmZGVmIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX3JjYy5oIgorI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9HUElPX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9ncGlvLmgiCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RtYS5oIgorI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2NvcnRleC5oIgorI2VuZGlmIC8qIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2FkYy5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfYWRjX2V4LmgiCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NFQ19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfY2VjLmgiCisjZW5kaWYgLyogSEFMX0NFQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2NvbXAuaCIKKyNlbmRpZiAvKiBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfY3JjLmgiCisjZW5kaWYgLyogSEFMX0NSQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2NyeXAuaCIKKyNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGFjLmgiCisjZW5kaWYgLyogSEFMX0RBQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0VYVElfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2V4dGkuaCIKKyNlbmRpZiAvKiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9mbGFzaC5oIgorI2VuZGlmIC8qIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0kyQ19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfaTJjLmgiCisjZW5kaWYgLyogSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0kyU19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfaTJzLmgiCisjZW5kaWYgLyogSEFMX0kyU19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2lyZGEuaCIKKyNlbmRpZiAvKiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2l3ZGcuaCIKKyNlbmRpZiAvKiBIQUxfSVdER19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0xQVElNX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9scHRpbS5oIgorI2VuZGlmIC8qIEhBTF9MUFRJTV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfcHdyLmgiCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1JOR19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfcm5nLmgiCisjZW5kaWYgLyogSEFMX1JOR19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfcnRjLmgiCisjZW5kaWYgLyogSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfc21hcnRjYXJkLmgiCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9zbWJ1cy5oIgorI2VuZGlmIC8qIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfc3BpLmgiCisjZW5kaWYgLyogSEFMX1NQSV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRAorI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfdGltLmgiCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX3VhcnQuaCIKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF91c2FydC5oIgorI2VuZGlmIC8qIEhBTF9VU0FSVF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX3d3ZGcuaCIKKyNlbmRpZiAvKiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKy8qKgorICAqIEBicmllZiAgVGhlIGFzc2VydF9wYXJhbSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgcGFyYW1ldGVycyBjaGVjay4KKyAgKiBAcGFyYW0gIGV4cHIgSWYgZXhwciBpcyBmYWxzZSwgaXQgY2FsbHMgYXNzZXJ0X2ZhaWxlZCBmdW5jdGlvbgorICAqICAgICAgICAgd2hpY2ggcmVwb3J0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBzb3VyY2UKKyAgKiAgICAgICAgIGxpbmUgbnVtYmVyIG9mIHRoZSBjYWxsIHRoYXQgZmFpbGVkLgorICAqICAgICAgICAgSWYgZXhwciBpcyB0cnVlLCBpdCByZXR1cm5zIG5vIHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKChleHByKSA/ICh2b2lkKTBVIDogYXNzZXJ0X2ZhaWxlZCgodWludDhfdCAqKV9fRklMRV9fLCBfX0xJTkVfXykpCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBhc3NlcnRfZmFpbGVkKHVpbnQ4X3QgKmZpbGUsIHVpbnQzMl90IGxpbmUpOworI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfQ09ORl9IICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2NvcnRleC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfY29ydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyYzI0NAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2NvcnRleC5oCkBAIC0wLDAgKzEsMzg3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jb3J0ZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0NPUlRFWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfQ09SVEVYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYIENPUlRFWAorICAqIEBicmllZiBDT1JURVggSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfVHlwZXMgQ09SVEVYIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworI2lmIChfX01QVV9QUkVTRU5UID09IDEpCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX0luaXRpYWxpemF0aW9uX1N0cnVjdHVyZV9kZWZpbml0aW9uIE1QVSBSZWdpb24gSW5pdGlhbGl6YXRpb24gU3RydWN0dXJlIERlZmluaXRpb24KKyAgKiBAYnJpZWYgIE1QVSBSZWdpb24gaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4X3QgRW5hYmxlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSByZWdpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fRW5hYmxlICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgTnVtYmVyOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT1JURVhfTVBVX1JlZ2lvbl9OdW1iZXIgICAgICAgICAgICAgICAgKi8KKyAgdWludDMyX3QgQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB1aW50OF90IFNpemU7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBwcm90ZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgICAgICAgICAgICAgICAgICAqLworICB1aW50OF90IFN1YlJlZ2lvbkRpc2FibGU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgc3VicmVnaW9uIHByb3RlY3Rpb24gdG8gZGlzYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICAgKi8KKyAgdWludDhfdCBUeXBlRXh0RmllbGQ7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBURVggZmllbGQgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9URVhfTGV2ZWxzICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgQWNjZXNzUGVybWlzc2lvbjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcmVnaW9uIGFjY2VzcyBwZXJtaXNzaW9uIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fUGVybWlzc2lvbl9BdHRyaWJ1dGVzICovCisgIHVpbnQ4X3QgRGlzYWJsZUV4ZWM7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5zdHJ1Y3Rpb24gYWNjZXNzIHN0YXR1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyAgICAgICAgICAgKi8KKyAgdWludDhfdCBJc1NoYXJlYWJsZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzaGFyZWFiaWxpdHkgc3RhdHVzIG9mIHRoZSBwcm90ZWN0ZWQgcmVnaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX1NoYXJlYWJsZSAgICAgICAgICAgICAqLworICB1aW50OF90IElzQ2FjaGVhYmxlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNhY2hlYWJsZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbiBwcm90ZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9BY2Nlc3NfQ2FjaGVhYmxlICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgSXNCdWZmZXJhYmxlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnVmZmVyYWJsZSBzdGF0dXMgb2YgdGhlIHByb3RlY3RlZCByZWdpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9BY2Nlc3NfQnVmZmVyYWJsZSAgICAgICAgICAgICovCit9IE1QVV9SZWdpb25fSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9TeXNUaWNrX2Nsb2NrX3NvdXJjZSBDT1JURVggU3lzVGljayBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjggICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMSyAgICAgICAgICAgIDB4MDAwMDAwMDRVCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0hGTk1JX1BSSVZERUZfQ29udHJvbCBDT1JURVggTVBVIEhGTk1JIGFuZCBQUklWSUxFR0VEIEFjY2VzcyBjb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9IRk5NSV9QUklWREVGX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lICBNUFVfSEFSREZBVUxUX05NSSAgICAgICAgICAgICAgICAoTVBVX0NUUkxfSEZOTUlFTkFfTXNrKQorI2RlZmluZSAgTVBVX1BSSVZJTEVHRURfREVGQVVMVCAgICAgICAgICAgKE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKQorI2RlZmluZSAgTVBVX0hGTk1JX1BSSVZERUYgICAgICAgICAgICAgICAgKE1QVV9DVFJMX0hGTk1JRU5BX01zayB8IE1QVV9DVFJMX1BSSVZERUZFTkFfTXNrKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9FbmFibGUgQ09SVEVYIE1QVSBSZWdpb24gRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fRU5BQkxFICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSAgTVBVX1JFR0lPTl9ESVNBQkxFICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfSW5zdHJ1Y3Rpb25fQWNjZXNzIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFICAgICgodWludDhfdCkweDAwKQorI2RlZmluZSAgTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19ESVNBQkxFICAgKCh1aW50OF90KTB4MDEpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfQWNjZXNzX1NoYXJlYWJsZSBDT1JURVggTVBVIEluc3RydWN0aW9uIEFjY2VzcyBTaGFyZWFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19TSEFSRUFCTEUgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9TSEFSRUFCTEUgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9BY2Nlc3NfQ2FjaGVhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIENhY2hlYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfQUNDRVNTX0NBQ0hFQUJMRSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgIE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSAgICAgICAgICgodWludDhfdCkweDAwKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIEJ1ZmZlcmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19CVUZGRVJBQkxFICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9URVhfTGV2ZWxzIENPUlRFWCBNUFUgVEVYIExldmVscworICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfVEVYX0xFVkVMMCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgIE1QVV9URVhfTEVWRUwxICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSAgTVBVX1RFWF9MRVZFTDIgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDIpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgQ09SVEVYIE1QVSBSZWdpb24gU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzI1NkIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNTEyQiAgICAgICAgICAgICgodWludDhfdCkweDA4KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xS0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MDkpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzJLQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNEtCICAgICAgICAgICAgICgodWludDhfdCkweDBCKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV84S0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MEMpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzE2S0IgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRCkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMzJLQiAgICAgICAgICAgICgodWludDhfdCkweDBFKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV82NEtCICAgICAgICAgICAgKCh1aW50OF90KTB4MEYpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzEyOEtCICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMCkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMjU2S0IgICAgICAgICAgICgodWludDhfdCkweDExKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV81MTJLQiAgICAgICAgICAgKCh1aW50OF90KTB4MTIpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzFNQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMk1CICAgICAgICAgICAgICgodWludDhfdCkweDE0KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV80TUIgICAgICAgICAgICAgKCh1aW50OF90KTB4MTUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzhNQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxNikKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTZNQiAgICAgICAgICAgICgodWludDhfdCkweDE3KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8zMk1CICAgICAgICAgICAgKCh1aW50OF90KTB4MTgpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzY0TUIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxOSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4TUIgICAgICAgICAgICgodWludDhfdCkweDFBKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yNTZNQiAgICAgICAgICAgKCh1aW50OF90KTB4MUIpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICAgICAgICAoKHVpbnQ4X3QpMHgxQykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMUdCICAgICAgICAgICAgICgodWludDhfdCkweDFEKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yR0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MUUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzRHQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxRikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fUGVybWlzc2lvbl9BdHRyaWJ1dGVzIENPUlRFWCBNUFUgUmVnaW9uIFBlcm1pc3Npb24gQXR0cmlidXRlcworICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfUkVHSU9OX05PX0FDQ0VTUyAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9SVyAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSAgTVBVX1JFR0lPTl9QUklWX1JXX1VSTyAgICAgICAgICAgKCh1aW50OF90KTB4MDIpCisjZGVmaW5lICBNUFVfUkVHSU9OX0ZVTExfQUNDRVNTICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMykKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9STyAgICAgICAgICAgICAgICgodWludDhfdCkweDA1KQorI2RlZmluZSAgTVBVX1JFR0lPTl9QUklWX1JPX1VSTyAgICAgICAgICAgKCh1aW50OF90KTB4MDYpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX051bWJlciBDT1JURVggTVBVIFJlZ2lvbiBOdW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIwICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjEgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMiAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIzICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDMpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjQgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSNSAgICAgICAgICAgICAgICgodWludDhfdCkweDA1KQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI2ICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDYpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjcgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNykKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfTWFjcm9zIENPUlRFWCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zIENPUlRFWCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX05WSUNfU2V0UHJpb3JpdHkoSVJRbl9UeXBlIElSUW4sdWludDMyX3QgUHJlZW1wdFByaW9yaXR5LCB1aW50MzJfdCBTdWJQcmlvcml0eSk7Cit2b2lkIEhBTF9OVklDX0VuYWJsZUlSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX0Rpc2FibGVJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19TeXN0ZW1SZXNldCh2b2lkKTsKK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgQ29ydGV4IGNvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbik7Cit1aW50MzJfdCBIQUxfTlZJQ19HZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX05WSUNfU2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX0NsZWFyUGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9TWVNUSUNLX0NMS1NvdXJjZUNvbmZpZyh1aW50MzJfdCBDTEtTb3VyY2UpOwordm9pZCBIQUxfU1lTVElDS19JUlFIYW5kbGVyKHZvaWQpOwordm9pZCBIQUxfU1lTVElDS19DYWxsYmFjayh2b2lkKTsKKworI2lmIChfX01QVV9QUkVTRU5UID09IDFVKQordm9pZCBIQUxfTVBVX0VuYWJsZSh1aW50MzJfdCBNUFVfQ29udHJvbCk7Cit2b2lkIEhBTF9NUFVfRGlzYWJsZSh2b2lkKTsKK3ZvaWQgSEFMX01QVV9Db25maWdSZWdpb24oTVBVX1JlZ2lvbl9Jbml0VHlwZURlZiAqTVBVX0luaXQpOworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPUlRFWF9Qcml2YXRlX01hY3JvcyBDT1JURVggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19OVklDX1BSRUVNUFRJT05fUFJJT1JJVFkoUFJJT1JJVFkpICAgICAoKFBSSU9SSVRZKSA8IDB4NFUpCisKKyNkZWZpbmUgSVNfTlZJQ19ERVZJQ0VfSVJRKElSUSkgICAgICAgICAgICAgICAgICAgKChJUlEpID4gU3lzVGlja19JUlFuKQorCisjZGVmaW5lIElTX1NZU1RJQ0tfQ0xLX1NPVVJDRShTT1VSQ0UpICAgICAgICAgICAgICgoKFNPVVJDRSkgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCkpCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorI2RlZmluZSBJU19NUFVfUkVHSU9OX0VOQUJMRShTVEFURSkgICAgICAgICAgICAgICAoKChTVEFURSkgPT0gTVBVX1JFR0lPTl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9SRUdJT05fRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTUyhTVEFURSkgICAgICAgICAgKCgoU1RBVEUpID09IE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKFNUQVRFKSAgICAgICAgICAgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX1NIQVJFQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFKSkKKworI2RlZmluZSBJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShTVEFURSkgICAgICAgICAgICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19DQUNIRUFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKFNUQVRFKSAgICAgICAgICAgKCgoU1RBVEUpID09IE1QVV9BQ0NFU1NfQlVGRkVSQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX1RFWF9MRVZFTChUWVBFKSAgICAgICAgICAgICAgICAgICAgKCgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9URVhfTEVWRUwxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfVEVYX0xFVkVMMikpCisKKyNkZWZpbmUgSVNfTVBVX1JFR0lPTl9QRVJNSVNTSU9OX0FUVFJJQlVURShUWVBFKSAgKCgoVFlQRSkgPT0gTVBVX1JFR0lPTl9OT19BQ0NFU1MpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUlcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9SV19VUk8pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUk8pICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9ST19VUk8pKQorCisjZGVmaW5lIElTX01QVV9SRUdJT05fTlVNQkVSKE5VTUJFUikgICAgICAgICAgICAgICgoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI3KSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX1NJWkUoU0laRSkgICAgICAgICAgICAgICAgICAoKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2QikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzUxMkIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xS0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMktCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRLQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV84S0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTZLQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzMyS0IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEtCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTI4S0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzI1NktCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJLQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMU1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzJNQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV80TUIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfOE1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzE2TUIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMk1CKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNjRNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzEyOE1CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZNQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNTEyTUIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzFHQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yR0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNEdCKSkKKworI2RlZmluZSBJU19NUFVfU1VCX1JFR0lPTl9ESVNBQkxFKFNVQlJFR0lPTikgICAgICAoKFNVQlJFR0lPTikgPCAodWludDE2X3QpMHgwMEZGVSkKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0NPUlRFWF9IICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfY3JjLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9jcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRmOGRkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfY3JjLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2NyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0NSQ19ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfQ1JDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfVHlwZXMgQ1JDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDUkMgSEFMIFN0YXRlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NSQ19TVEFURV9SRVNFVCAgICAgPSAweDAwVSwgIC8qITwgQ1JDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyAgSEFMX0NSQ19TVEFURV9SRUFEWSAgICAgPSAweDAxVSwgIC8qITwgQ1JDIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgKi8KKyAgSEFMX0NSQ19TVEFURV9CVVNZICAgICAgPSAweDAyVSwgIC8qITwgQ1JDIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgKi8KKyAgSEFMX0NSQ19TVEFURV9USU1FT1VUICAgPSAweDAzVSwgIC8qITwgQ1JDIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NSQ19TVEFURV9FUlJPUiAgICAgPSAweDA0VSAgIC8qITwgQ1JDIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX0NSQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBDUkMgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBEZWZhdWx0UG9seW5vbWlhbFVzZTsgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBhIHZhbHVlIG9mIEByZWYgQ1JDX0RlZmF1bHRfUG9seW5vbWlhbCBhbmQgaW5kaWNhdGVzIGlmIGRlZmF1bHQgcG9seW5vbWlhbCBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gREVGQVVMVF9QT0xZTk9NSUFMX0VOQUJMRSwgcmVzb3J0IHRvIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF4zMiArIFheMjYgKyBYXjIzICsgWF4yMiArIFheMTYgKyBYXjEyICsgWF4xMSArIFheMTAgK1heOCArIFheNyArIFheNSArIFheNCArIFheMisgWCArMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhhdCBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBHZW5lcmF0aW5nUG9seW5vbWlhbCBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb3RoZXJ3aXNlIHNldCB0byBERUZBVUxUX1BPTFlOT01JQUxfRElTQUJMRSwgR2VuZXJhdGluZ1BvbHlub21pYWwgYW5kIENSQ0xlbmd0aCBmaWVsZHMgbXVzdCBiZSBzZXQuICovCisKKyAgdWludDhfdCBEZWZhdWx0SW5pdFZhbHVlVXNlOyAgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBhIHZhbHVlIG9mIEByZWYgQ1JDX0RlZmF1bHRfSW5pdFZhbHVlX1VzZSBhbmQgaW5kaWNhdGVzIGlmIGRlZmF1bHQgaW5pdCB2YWx1ZSBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFLCByZXNvcnQgdG8gZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYgdmFsdWUuIEluIHRoYXQgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgSW5pdFZhbHVlIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG90aGVyd2lzZSBzZXQgdG8gREVGQVVMVF9JTklUX1ZBTFVFX0RJU0FCTEUsICBJbml0VmFsdWUgZmllbGQgbXVzdCBiZSBzZXQuICovCisKKyAgdWludDMyX3QgR2VuZXJhdGluZ1BvbHlub21pYWw7ICAgICAgLyohPCBTZXQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbCBhcyBhIDcsIDgsIDE2IG9yIDMyLWJpdCBsb25nIHZhbHVlIGZvciBhIHBvbHlub21pYWwgZGVncmVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5IGVxdWFsIHRvIDcsIDgsIDE2IG9yIDMyLiBUaGlzIGZpZWxkIGlzIHdyaXR0ZW4gaW4gbm9ybWFsIHJlcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDcsIFheNyArIFheNiArIFheNSArIFheMiArIDEgaXMgd3JpdHRlbiAweDY1LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG5lZWQgdG8gc3BlY2lmeSBpdCBpZiBEZWZhdWx0UG9seW5vbWlhbFVzZSBpcyBzZXQgdG8gREVGQVVMVF9QT0xZTk9NSUFMX0VOQUJMRS4gICAqLworCisgIHVpbnQzMl90IENSQ0xlbmd0aDsgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ19Qb2x5bm9taWFsX1NpemVzIGFuZCBpbmRpY2F0ZXMgQ1JDIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBjYW4gYmUgZWl0aGVyIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF8zMkIgICAgICAgICAgICAgICAgICAoMzItYml0IENSQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzE2QiAgICAgICAgICAgICAgICAgICgxNi1iaXQgQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAgKDgtYml0IENSQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgICAgICg3LWJpdCBDUkMpLiAqLworCisgIHVpbnQzMl90IEluaXRWYWx1ZTsgICAgICAgICAgICAgICAgIC8qITwgSW5pdCB2YWx1ZSB0byBpbml0aWF0ZSBDUkMgY29tcHV0YXRpb24uIE5vIG5lZWQgdG8gc3BlY2lmeSBpdCBpZiBEZWZhdWx0SW5pdFZhbHVlVXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUuICAgKi8KKworICB1aW50MzJfdCBJbnB1dERhdGFJbnZlcnNpb25Nb2RlOyAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNFeF9JbnB1dF9EYXRhX0ludmVyc2lvbiBhbmQgc3BlY2lmaWVzIGlucHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fTk9ORSAgICAgICBubyBpbnB1dCBkYXRhIGludmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFICAgICAgIGJ5dGUtd2lzZSBpbnZlcnNpb24sIDB4MUEyQjNDNEQgYmVjb21lcyAweDU4RDQzQ0IyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0hBTEZXT1JEICAgaGFsZndvcmQtd2lzZSBpbnZlcnNpb24sIDB4MUEyQjNDNEQgYmVjb21lcyAweEQ0NThCMjNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX1dPUkQgICAgICAgd29yZC13aXNlIGludmVyc2lvbiwgMHgxQTJCM0M0RCBiZWNvbWVzIDB4QjIzQ0Q0NTggKi8KKworICB1aW50MzJfdCBPdXRwdXREYXRhSW52ZXJzaW9uTW9kZTsgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNFeF9PdXRwdXRfRGF0YV9JbnZlcnNpb24gYW5kIHNwZWNpZmllcyBvdXRwdXQgZGF0YSAoaS5lLiBDUkMpIGludmVyc2lvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRSAgIG5vIENSQyBpbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFICAgIENSQyAweDExMjIzMzQ0IGlzIGNvbnZlcnRlZCBpbnRvIDB4MjJDQzQ0ODggKi8KK30gQ1JDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIENSQyBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIENSQ19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICovCisKKyAgQ1JDX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgICAvKiE8IENSQyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAgIC8qITwgQ1JDIExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0NSQ19TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgLyohPCBDUkMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICovCisKKyAgdWludDMyX3QgSW5wdXREYXRhRm9ybWF0OyAgICAgICAgICAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfSW5wdXRfQnVmZmVyX0Zvcm1hdCBhbmQgc3BlY2lmaWVzIGlucHV0IGRhdGEgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUyAgICAgICBpbnB1dCBkYXRhIGlzIGEgc3RyZWFtIG9mIGJ5dGVzICg4LWJpdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9GT1JNQVRfSEFMRldPUkRTICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiBoYWxmLXdvcmRzICgxNi1iaXQgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfRk9STUFUX1dPUkRTICAgICAgIGlucHV0IGRhdGEgaXMgYSBzdHJlYW0gb2Ygd29yZHMgKDMyLWJpdCBkYXRhKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGNvbnN0YW50IENSQ19JTlBVVF9GT1JNQVRfVU5ERUZJTkVEIGlzIGRlZmluZWQgYnV0IGFuIGluaXRpYWxpemF0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBvY2N1ciBpZiBJbnB1dEJ1ZmZlckZvcm1hdCBpcyBub3Qgb25lIG9mIHRoZSB0aHJlZSB2YWx1ZXMgbGlzdGVkIGFib3ZlICAqLworfSBDUkNfSGFuZGxlVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9Db25zdGFudHMgQ1JDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0RlZmF1bHRfUG9seW5vbWlhbF9WYWx1ZSAgICBEZWZhdWx0IENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX0NSQzMyX1BPTFkgICAgICAweDA0QzExREI3VSAgLyohPCAgWF4zMiArIFheMjYgKyBYXjIzICsgWF4yMiArIFheMTYgKyBYXjEyICsgWF4xMSArIFheMTAgK1heOCArIFheNyArIFheNSArIFheNCArIFheMisgWCArMSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Jbml0VmFsdWUgICAgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX0NSQ19JTklUVkFMVUUgICAweEZGRkZGRkZGVSAgLyohPCBJbml0aWFsIENSQyBkZWZhdWx0IHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19EZWZhdWx0X1BvbHlub21pYWwgICAgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRlZmF1bHQgcG9seW5vbWlhbCBpcyB1c2VkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREVGQVVMVF9QT0xZTk9NSUFMX0VOQUJMRSAgICAgICAoKHVpbnQ4X3QpMHgwMFUpICAvKiE8IEVuYWJsZSBkZWZhdWx0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAweDA0QzExREI3ICAqLworI2RlZmluZSBERUZBVUxUX1BPTFlOT01JQUxfRElTQUJMRSAgICAgICgodWludDhfdCkweDAxVSkgIC8qITwgRGlzYWJsZSBkZWZhdWx0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAweDA0QzExREI3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19EZWZhdWx0X0luaXRWYWx1ZV9Vc2UgICAgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRlZmF1bHQgaW5pdCB2YWx1ZSBpcyB1c2VkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRSAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBFbmFibGUgaW5pdGlhbCBDUkMgZGVmYXVsdCB2YWx1ZSAgKi8KKyNkZWZpbmUgREVGQVVMVF9JTklUX1ZBTFVFX0RJU0FCTEUgICAgICgodWludDhfdCkweDAxVSkgLyohPCBEaXNhYmxlIGluaXRpYWwgQ1JDIGRlZmF1bHQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX1BvbHlub21pYWxfU2l6ZXMgUG9seW5vbWlhbCBzaXplcyB0byBjb25maWd1cmUgdGhlIHBlcmlwaGVyYWwKKyAgKiBAeworICAqLworI2RlZmluZSBDUkNfUE9MWUxFTkdUSF8zMkIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgLyohPCBSZXNvcnQgdG8gYSAzMi1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyNkZWZpbmUgQ1JDX1BPTFlMRU5HVEhfMTZCICAgICAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzAgIC8qITwgUmVzb3J0IHRvIGEgMTYtYml0IGxvbmcgZ2VuZXJhdGluZyBwb2x5bm9taWFsICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzhCICAgICAgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRV8xICAvKiE8IFJlc29ydCB0byBhIDgtYml0IGxvbmcgZ2VuZXJhdGluZyBwb2x5bm9taWFsICAqLworI2RlZmluZSBDUkNfUE9MWUxFTkdUSF83QiAgICAgICAgICAgICAgICAgICBDUkNfQ1JfUE9MWVNJWkUgICAgLyohPCBSZXNvcnQgdG8gYSA3LWJpdCBsb25nIGdlbmVyYXRpbmcgcG9seW5vbWlhbCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX1BvbHlub21pYWxfU2l6ZV9EZWZpbml0aW9ucyBDUkMgcG9seW5vbWlhbCBwb3NzaWJsZSBzaXplcyBhY3R1YWwgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF8zMkIgICAgIDMyVSAgICAgICAgICAvKiE8IDMyLWJpdCBsb25nIENSQyAqLworI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF8xNkIgICAgIDE2VSAgICAgICAgICAvKiE8IDE2LWJpdCBsb25nIENSQyAqLworI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF84QiAgICAgICA4VSAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgQ1JDICAqLworI2RlZmluZSBIQUxfQ1JDX0xFTkdUSF83QiAgICAgICA3VSAgICAgICAgICAvKiE8IDctYml0IGxvbmcgQ1JDICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfSW5wdXRfQnVmZmVyX0Zvcm1hdCBJbnB1dCBCdWZmZXIgRm9ybWF0CisgICogQHsKKyAgKi8KKy8qIFdBUk5JTkc6IENSQ19JTlBVVF9GT1JNQVRfVU5ERUZJTkVEIGlzIGNyZWF0ZWQgZm9yIHJlZmVyZW5jZSBwdXJwb3NlcyBidXQKKyAqIGFuIGVycm9yIGlzIHRyaWdnZXJlZCBpbiBIQUxfQ1JDX0luaXQoKSBpZiBJbnB1dERhdGFGb3JtYXQgZmllbGQgaXMgc2V0CisgKiB0byBDUkNfSU5QVVRfRk9STUFUX1VOREVGSU5FRDogdGhlIGZvcm1hdCBNVVNUIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgZm9yCisgKiB0aGUgQ1JDIEFQSXMgdG8gcHJvdmlkZSBhIGNvcnJlY3QgcmVzdWx0ICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfRk9STUFUX1VOREVGSU5FRCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyohPCBVbmRlZmluZWQgaW5wdXQgZGF0YSBmb3JtYXQgICAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfQllURVMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IElucHV0IGRhdGEgaW4gYnl0ZSBmb3JtYXQgICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMgICAgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgSW5wdXQgZGF0YSBpbiBoYWxmLXdvcmQgZm9ybWF0ICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfRk9STUFUX1dPUkRTICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgLyohPCBJbnB1dCBkYXRhIGluIHdvcmQgZm9ybWF0ICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0FsaWFzZXMgQ1JDIEFQSSBhbGlhc2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NSQ19JbnB1dF9EYXRhX1JldmVyc2UgICBIQUxfQ1JDRXhfSW5wdXRfRGF0YV9SZXZlcnNlICAgIC8qITwgQWxpYXNlZCB0byBIQUxfQ1JDRXhfSW5wdXRfRGF0YV9SZXZlcnNlIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAgKi8KKyNkZWZpbmUgSEFMX0NSQ19PdXRwdXRfRGF0YV9SZXZlcnNlICBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZSAgIC8qITwgQWxpYXNlZCB0byBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZSBmb3IgaW50ZXIgU1RNMzIgc2VyaWVzIGNvbXBhdGliaWxpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9NYWNyb3MgQ1JDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgQ1JDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgQ1JDIERhdGEgUmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX0RSX1JFU0VUKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBDUkNfQ1JfUkVTRVQpCisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBJTklUIG5vbi1kZWZhdWx0IHZhbHVlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5JVF9fIDMyLWJpdCBpbml0aWFsIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19JTklUSUFMQ1JDVkFMVUVfQ09ORklHKF9fSEFORExFX18sIF9fSU5JVF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU5JVCA9IChfX0lOSVRfXykpCisKKy8qKgorICAqIEBicmllZiBTdG9yZSBkYXRhIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhIChJRCkgcmVnaXN0ZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSBfX1ZBTFVFX18gIFZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUgSUQgcmVnaXN0ZXIKKyAgKiBAbm90ZSAgUmVmZXIgdG8gdGhlIFJlZmVyZW5jZSBNYW51YWwgdG8gZ2V0IHRoZSBhdXRob3JpemVkIF9fVkFMVUVfXyBsZW5ndGggaW4gYml0cworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfU0VUX0lEUihfX0hBTkRMRV9fLCBfX1ZBTFVFX18pIChXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SURSLCAoX19WQUxVRV9fKSkpCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhIChJRCkgcmVnaXN0ZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBub3RlICBSZWZlciB0byB0aGUgUmVmZXJlbmNlIE1hbnVhbCB0byBnZXQgdGhlIGF1dGhvcml6ZWQgX19WQUxVRV9fIGxlbmd0aCBpbiBiaXRzCisgICogQHJldHZhbCBWYWx1ZSBvZiB0aGUgSUQgcmVnaXN0ZXIKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX0dFVF9JRFIoX19IQU5ETEVfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRFIpICYgQ1JDX0lEUl9JRFIpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgIENSQ19Qcml2YXRlX01hY3JvcyBDUkMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0RFRkFVTFRfUE9MWU5PTUlBTChERUZBVUxUKSAoKChERUZBVUxUKSA9PSBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUZBVUxUKSA9PSBERUZBVUxUX1BPTFlOT01JQUxfRElTQUJMRSkpCisKKworI2RlZmluZSBJU19ERUZBVUxUX0lOSVRfVkFMVUUoVkFMVUUpICAoKChWQUxVRSkgPT0gREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREVGQVVMVF9JTklUX1ZBTFVFX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0NSQ19QT0xfTEVOR1RIKExFTkdUSCkgICAgICgoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfMzJCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfMTZCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfOEIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFTkdUSCkgPT0gQ1JDX1BPTFlMRU5HVEhfN0IpKQorCisjZGVmaW5lIElTX0NSQ19JTlBVVERBVEFfRk9STUFUKEZPUk1BVCkgICAgICAgICAgICgoKEZPUk1BVCkgPT0gQ1JDX0lOUFVUREFUQV9GT1JNQVRfQllURVMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZPUk1BVCkgPT0gQ1JDX0lOUFVUREFUQV9GT1JNQVRfSEFMRldPUkRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZPUk1BVCkgPT0gQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENSQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9jcmNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0luaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ19EZUluaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpOwordm9pZCBIQUxfQ1JDX01zcEluaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpOwordm9pZCBIQUxfQ1JDX01zcERlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3VpbnQzMl90IEhBTF9DUkNfQWNjdW11bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOwordWludDMyX3QgSEFMX0NSQ19DYWxjdWxhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9DUkNfU3RhdGVUeXBlRGVmIEhBTF9DUkNfR2V0U3RhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfQ1JDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2NyY19leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfY3JjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNjY1NAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2NyY19leC5oCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jcmNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ1JDIEhBTCBleHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9DUkNfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0NSQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIENSQyBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ0V4X0lucHV0X0RhdGFfSW52ZXJzaW9uIElucHV0IERhdGEgSW52ZXJzaW9uIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fTk9ORSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IE5vIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fQllURSAgICAgICAgICAgICAgIENSQ19DUl9SRVZfSU5fMCAvKiE8IEJ5dGUtd2lzZSBpbnB1dCBkYXRhIGludmVyc2lvbiAgICAgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQgICAgICAgICAgIENSQ19DUl9SRVZfSU5fMSAvKiE8IEhhbGZXb3JkLXdpc2UgaW5wdXQgZGF0YSBpbnZlcnNpb24gKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgICAgICAgICAgIENSQ19DUl9SRVZfSU4gICAvKiE8IFdvcmQtd2lzZSBpbnB1dCBkYXRhIGludmVyc2lvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfT3V0cHV0X0RhdGFfSW52ZXJzaW9uIE91dHB1dCBEYXRhIEludmVyc2lvbiBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBObyBvdXRwdXQgZGF0YSBpbnZlcnNpb24gICAgICAgKi8KKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0VOQUJMRSAgICAgICAgICBDUkNfQ1JfUkVWX09VVCAgICAvKiE8IEJpdC13aXNlIG91dHB1dCBkYXRhIGludmVyc2lvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfTWFjcm9zIENSQyBFeHRlbmRlZCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBDUkMgb3V0cHV0IHJldmVyc2FsCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgIF9fSEFMX0NSQ19PVVRQVVRSRVZFUlNBTF9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IENSQ19DUl9SRVZfT1VUKQorCisvKioKKyAgKiBAYnJpZWYgIFVuc2V0IENSQyBvdXRwdXQgcmV2ZXJzYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfT1VUUFVUUkVWRVJTQUxfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihDUkNfQ1JfUkVWX09VVCkpCisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBub24tZGVmYXVsdCBwb2x5bm9taWFsCisgICogQHBhcmFtICBfX0hBTkRMRV9fIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fUE9MWU5PTUlBTF9fIDcsIDgsIDE2IG9yIDMyLWJpdCBwb2x5bm9taWFsCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19QT0xZTk9NSUFMX0NPTkZJRyhfX0hBTkRMRV9fLCBfX1BPTFlOT01JQUxfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlBPTCA9IChfX1BPTFlOT01JQUxfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfUHJpdmF0ZV9NYWNyb3MgQ1JDIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19DUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9NT0RFKE1PREUpICAgICAoKChNT0RFKSA9PSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9IQUxGV09SRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9XT1JEKSkKKworI2RlZmluZSBJU19DUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fTU9ERShNT0RFKSAgICAoKChNT0RFKSA9PSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDRXhfUG9seW5vbWlhbF9TZXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IFBvbCwgdWludDMyX3QgUG9seUxlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDRXhfSW5wdXRfRGF0YV9SZXZlcnNlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBJbnB1dFJldmVyc2VNb2RlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBPdXRwdXRSZXZlcnNlTW9kZSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0NSQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9jcnlwLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9jcnlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2Y2MxYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2NyeXAuaApAQCAtMCwwICsxLDYyNyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfY3J5cC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUllQIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9DUllQX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9DUllQX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEFFUykKKworLyoqIEBkZWZncm91cCBDUllQIENSWVAKKyAgKiBAYnJpZWYgQ1JZUCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfVHlwZXMgQ1JZUCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBDUllQIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRGF0YVR5cGU7ICAgICAgICAgICAgICAgICAgIC8qITwgMzItYml0IGRhdGEsIDE2LWJpdCBkYXRhLCA4LWJpdCBkYXRhIG9yIDEtYml0IHN0cmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfRGF0YV9UeXBlICovCisgIHVpbnQzMl90IEtleVNpemU7ICAgICAgICAgICAgICAgICAgICAvKiE8IFVzZWQgb25seSBpbiBBRVMgbW9kZSA6IDEyOCwgMTkyIG9yIDI1NiBiaXQga2V5IGxlbmd0aCBpbiBDUllQMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjggb3IgMjU2IGJpdCBrZXkgbGVuZ3RoIGluIFRpbnlBRVMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDUllQX0tleV9TaXplICovCisgIHVpbnQzMl90ICpwS2V5OyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uICovCisgIHVpbnQzMl90ICpwSW5pdFZlY3Q7ICAgICAgICAgICAgICAgICAvKiE8IFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdXNlZCBhbHNvIGFzIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgaW4gQ1RSIG1vZGUgKi8KKyAgdWludDMyX3QgQWxnb3JpdGhtOyAgICAgICAgICAgICAgICAgIC8qITwgIERFUy8gVERFUyBBbGdvcml0aG0gRUNCL0NCQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFUyBBbGdvcml0aG0gRUNCL0NCQy9DVFIvR0NNIG9yIENDTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9BbGdvcml0aG1fTW9kZSAqLworICB1aW50MzJfdCAqSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgLyohPCB1c2VkIG9ubHkgaW4gQUVTIEdDTSBhbmQgQ0NNIEFsZ29yaXRobSBmb3IgYXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NNIDogYWxzbyBrbm93biBhcyBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0aW9uIERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ00gOiBuYW1lZCBCMSBjb21wb3NlZCBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBhbmQgQXNzb2NpYXRlZCBEYXRhLiAqLworICB1aW50MzJfdCBIZWFkZXJTaXplOyAgICAgICAgICAgICAgICAgLyohPCBUaGUgc2l6ZSBvZiBoZWFkZXIgYnVmZmVyIGluIHdvcmQgICovCisgIHVpbnQzMl90ICpCMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEIwIGlzIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGJsb2NrIHVzZWQgb25seSAgaW4gQUVTIENDTSBtb2RlICovCisgIHVpbnQzMl90IERhdGFXaWR0aFVuaXQ7ICAgICAgICAgICAgICAvKiE8IERhdGEgV2l0aCBVbml0LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgdmFsdWUgb2YgQHJlZiBDUllQX0RhdGFfV2lkdGhfVW5pdCovCisgIHVpbnQzMl90IEtleUlWQ29uZmlnU2tpcDsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gc2tpcCwgdG8gY29uZmlnIEtleSBhbmQgSW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3Igb25seSBvbmNlIGFuZCB0byBza2lwIGNvbmZpZ3VyYXRpb24gZm9yIGNvbnNlY3V0aXZlIHByb2Nlc3NpbmdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9Db25maWd1cmF0aW9uX1NraXAgKi8KKworfSBDUllQX0NvbmZpZ1R5cGVEZWY7CisKKworLyoqCisgICogQGJyaWVmICBDUllQIFN0YXRlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisKK3R5cGVkZWYgZW51bQoreworICBIQUxfQ1JZUF9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBDUllQIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9DUllQX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IENSWVAgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX0NSWVBfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgQ1JZUCBCVVNZLCBpbnRlcm5hbCBwcm9jZXNzaW5nIGlzIG9uZ29pbmcgICovCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEICAgICAgICAgPSAweDAzVSwgICAvKiE8IENSWVAgc3VzcGVuZGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KK30gSEFMX0NSWVBfU1RBVEVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKy8qKgorICAqIEBicmllZiBIQUwgQ1JZUCBtb2RlIHN1c3BlbmQgZGVmaW5pdGlvbnMKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQ1JZUF9TVVNQRU5EX05PTkUgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IENSWVAgcHJvY2Vzc2luZyBzdXNwZW5zaW9uIG5vdCByZXF1ZXN0ZWQgKi8KKyAgSEFMX0NSWVBfU1VTUEVORCAgICAgICAgICAgICAgICAgPSAweDAxVSAgICAgLyohPCBDUllQIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiByZXF1ZXN0ZWQgICAgICovCit9SEFMX1N1c3BlbmRUeXBlRGVmOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworCisvKioKKyAgKiBAYnJpZWYgIENSWVAgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZgoreworICBBRVNfVHlwZURlZiAgICAgICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgIC8qITwgQUVTIFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCisgIENSWVBfQ29uZmlnVHlwZURlZiAgICAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAvKiE8IENSWVAgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSAgICAgICAgICAgICAgICAgICBBdXRvS2V5RGVyaXZhdGlvbjsgICAvKiE8IFVzZWQgb25seSBpbiBUaW55QUVTIHRvIGFsbG93IHRvIGJ5cGFzcyBvciBub3Qga2V5IHdyaXRlLXVwIGJlZm9yZSBkZWNyeXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgRU5BQkxFL0RJU0FCTEUgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDcnlwSW5CdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIENSWVAgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwuLi4pIGJ1ZmZlciAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAqcENyeXBPdXRCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gQ1JZUCBwcm9jZXNzaW5nIChlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLC4uLikgYnVmZmVyICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBIZWFkZXJDb3VudDsgICAvKiE8IENvdW50ZXIgb2YgaGVhZGVyIGRhdGEgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgQ3J5cEluQ291bnQ7ICAgICAgLyohPCBDb3VudGVyIG9mIGlucHV0IGRhdGEgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgQ3J5cE91dENvdW50OyAgICAgLyohPCBDb3VudGVyIG9mIG91dHB1dCBkYXRhICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgIC8qITwgbGVuZ3RoIG9mIGlucHV0IGRhdGEgaW4gd29yZHMgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgUGhhc2U7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgcGhhc2UgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWFpbjsgICAgICAgICAgLyohPCBDUllQIEluIERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICAgICAqaGRtYW91dDsgICAgICAgICAvKiE8IENSWVAgT3V0IERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IENSWVAgbG9ja2luZyBvYmplY3QgKi8KKworICBfX0lPICBIQUxfQ1JZUF9TVEFURVR5cGVEZWYgICAgICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgZXJyb3IgY29kZSAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJVkNvbmZpZzsgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gZmxhZywgdXNlZCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHNraXBwZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZXNTdW07ICAgICAgICAgLyohPCBTdW0gb2Ygc3VjY2Vzc2l2ZSBwYXlsb2FkcyBsZW5ndGhzIChpbiBieXRlcyksIHN0b3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBzaW5nbGUgc2lnbmF0dXJlIGNvbXB1dGF0aW9uIGFmdGVyIHNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgcHJvY2Vzc2luZyAqLworCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIHZvaWQgKCpJbkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgICAgLyohPCBDUllQIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqT3V0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgICAgIC8qITwgQ1JZUCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAgICAvKiE8IENSWVAgRXJyb3IgY2FsbGJhY2sgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgIC8qITwgQ1JZUCBNc3AgSW5pdCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAvKiE8IENSWVAgTXNwIERlSW5pdCBjYWxsYmFjayAgKi8KKworI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKworICBfX0lPIEhBTF9TdXNwZW5kVHlwZURlZiAgICAgU3VzcGVuZFJlcXVlc3Q7ICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHN1c3BlbnNpb24gcmVxdWVzdCBmbGFnICovCisKKyAgQ1JZUF9Db25maWdUeXBlRGVmICAgICAgICAgIEluaXRfc2F2ZWQ7ICAgICAgICAgICAgICAvKiE8IGNvcHkgb2YgQ1JZUCByZXF1aXJlZCBwYXJhbWV0ZXJzIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgKnBDcnlwSW5CdWZmUHRyX3NhdmVkOyAgIC8qITwgY29weSBvZiBDUllQIGlucHV0IHBvaW50ZXIgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAqcENyeXBPdXRCdWZmUHRyX3NhdmVkOyAgLyohPCBjb3B5IG9mIENSWVAgb3V0cHV0IHBvaW50ZXIgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBDcnlwSW5Db3VudF9zYXZlZDsgICAgICAgLyohPCBjb3B5IG9mIENSWVAgaW5wdXQgZGF0YSBjb3VudGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgQ3J5cE91dENvdW50X3NhdmVkOyAgICAgIC8qITwgY29weSBvZiBDUllQIG91dHB1dCBkYXRhIGNvdW50ZXIgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBQaGFzZV9zYXZlZDsgICAgICAgICAgICAgLyohPCBjb3B5IG9mIENSWVAgYXV0aGVudGljYXRpb24gcGhhc2Ugd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIF9fSU8gSEFMX0NSWVBfU1RBVEVUeXBlRGVmICBTdGF0ZV9zYXZlZDsgICAgICAgICAgICAgLyohPCBjb3B5IG9mIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIElWX3NhdmVkWzRdOyAgICAgICAgICAgICAvKiE8IGNvcHkgb2YgSW5pdGlhbGlzYXRpb24gVmVjdG9yIHJlZ2lzdGVycyAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBTVVNQeFJfc2F2ZWRbOF07ICAgICAgICAgLyohPCBjb3B5IG9mIHN1c3BlbnNpb24gcmVnaXN0ZXJzICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIENSX3NhdmVkOyAgICAgICAgICAgICAgICAvKiE8IGNvcHkgb2YgQ1JZUCBjb250cm9sIHJlZ2lzdGVyICB3aGVuIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgS2V5X3NhdmVkWzhdOyAgICAgICAgICAgIC8qITwgY29weSBvZiBrZXkgcmVnaXN0ZXJzICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIFNpemVfc2F2ZWQ7ICAgICAgICAgICAgICAvKiE8IGNvcHkgb2YgaW5wdXQgYnVmZmVyIHNpemUgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgQ3J5cEhlYWRlckNvdW50X3NhdmVkOyAgIC8qITwgY29weSBvZiBDUllQIGhlYWRlciBkYXRhIGNvdW50ZXIgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBSZXN1bWluZ0ZsYWc7ICAgICAgICAgICAgLyohPCByZXN1bXB0aW9uIGZsYWcgdG8gYnlwYXNzIHN0ZXBzIGFscmVhZHkgY2FycmllZCBvdXQgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgICAgICAgICAgICAgQXV0b0tleURlcml2YXRpb25fc2F2ZWQ7IC8qITwgY29weSBvZiBDUllQIGhhbmRsZSBhdXRvIGtleSBkZXJpdmF0aW9uIHBhcmFtZXRlciAqLworCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisKK30gQ1JZUF9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisvKiogQGRlZmdyb3VwIEhBTF9DUllQX0NhbGxiYWNrX0lEX2VudW1lcmF0aW9uX2RlZmluaXRpb24gSEFMIENSWVAgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIENSWVAgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBDUllQIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICA9IDB4MDFVLCAgICAgLyohPCBDUllQIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCAgICA9IDB4MDJVLCAgICAvKiE8IENSWVAgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCAgID0gMHgwM1UsICAgIC8qITwgQ1JZUCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0NSWVBfRVJST1JfQ0JfSUQgICAgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBDUllQIEVycm9yIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NSWVBfQ2FsbGJhY2tfcG9pbnRlcl9kZWZpbml0aW9uIEhBTCBDUllQIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIENSWVAgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKwordHlwZWRlZiAgdm9pZCAoKnBDUllQX0NhbGxiYWNrVHlwZURlZikoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgIC8qITwgcG9pbnRlciB0byBhIGNvbW1vbiBDUllQIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfQ29uc3RhbnRzIENSWVAgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0Vycm9yX0RlZmluaXRpb24gICBDUllQIEVycm9yIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyohPCBObyBlcnJvciAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfV1JJVEUgICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgV3JpdGUgZXJyb3IgICAgICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX1JFQUQgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAvKiE8IFJlYWQgZXJyb3IgICAgICAqLworI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9ETUEgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBETUEgZXJyb3IgICAgICAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfQlVTWSAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgIC8qITwgQnVzeSBmbGFnIGVycm9yICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX1RJTUVPVVQgICAgICAgICAgIDB4MDAwMDAwMTBVICAvKiE8IFRpbWVvdXQgZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRCAgICAgMHgwMDAwMDAyMFUgIC8qITwgTm90IHN1cHBvcnRlZCBtb2RlICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX0FVVEhfVEFHX1NFUVVFTkNFIDB4MDAwMDAwNDBVICAvKiE8IFNlcXVlbmNlIGFyZSBub3QgcmVzcGVjdGVkIG9ubHkgZm9yIEdDTSBvciBDQ00gKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgIEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0RhdGFfV2lkdGhfVW5pdCBDUllQIERhdGEgV2lkdGggVW5pdAorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQgICAweDAwMDAwMDAwVSAgLyohPCBCeSBkZWZhdWx0LCBzaXplIHVuaXQgaXMgd29yZCAqLworI2RlZmluZSBDUllQX0RBVEFXSURUSFVOSVRfQllURSAgIDB4MDAwMDAwMDFVICAvKiE8IEJ5IGRlZmF1bHQsIHNpemUgdW5pdCBpcyBieXRlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9BbGdvcml0aG1fTW9kZSBDUllQIEFsZ29yaXRobSBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUllQX0FFU19FQ0IgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbGVjdHJvbmljIGNvZGVib29rIGNoYWluaW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0FFU19DQkMgICAgICAgICAgICBBRVNfQ1JfQ0hNT0RfMCAgICAgICAgICAgICAgICAgICAgLyohPCBDaXBoZXIgYmxvY2sgY2hhaW5pbmcgYWxnb3JpdGhtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0FFU19DVFIgICAgICAgICAgICBBRVNfQ1JfQ0hNT0RfMSAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIG1vZGUgY2hhaW5pbmcgYWxnb3JpdGhtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0FFU19HQ01fR01BQyAgICAgICAoQUVTX0NSX0NITU9EXzAgfCBBRVNfQ1JfQ0hNT0RfMSkgLyohPCBHYWxvaXMgY291bnRlciBtb2RlIC0gR2Fsb2lzIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSAqLworI2RlZmluZSBDUllQX0FFU19DQ00gICAgICAgICAgICBBRVNfQ1JfQ0hNT0RfMiAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHdpdGggQ2lwaGVyIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfS2V5X1NpemUgQ1JZUCBLZXkgU2l6ZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzEyOEIgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IDEyOC1iaXQgbG9uZyBrZXkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzI1NkIgICAgICAgICBBRVNfQ1JfS0VZU0laRSAgICAgICAvKiE8IDI1Ni1iaXQgbG9uZyBrZXkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0RhdGFfVHlwZSBDUllQIERhdGEgVHlwZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9EQVRBVFlQRV8zMkIgICAgICAgICAweDAwMDAwMDAwVSAgLyohPCAzMi1iaXQgZGF0YSB0eXBlIChubyBzd2FwcGluZykgICAgICAgICovCisjZGVmaW5lIENSWVBfREFUQVRZUEVfMTZCICAgICAgICAgQUVTX0NSX0RBVEFUWVBFXzAgICAgICAgLyohPCAxNi1iaXQgZGF0YSB0eXBlIChoYWxmLXdvcmQgc3dhcHBpbmcpICovCisjZGVmaW5lIENSWVBfREFUQVRZUEVfOEIgICAgICAgICAgQUVTX0NSX0RBVEFUWVBFXzEgICAgICAgLyohPCA4LWJpdCBkYXRhIHR5cGUgKGJ5dGUgc3dhcHBpbmcpICAgICAgICovCisjZGVmaW5lIENSWVBfREFUQVRZUEVfMUIgICAgICAgICAgQUVTX0NSX0RBVEFUWVBFICAgICAgICAgLyohPCAxLWJpdCBkYXRhIHR5cGUgKGJpdCBzd2FwcGluZykgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9JbnRlcnJ1cHQgIENSWVAgSW50ZXJydXB0CisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUllQX0lUX0NDRklFICAgICBBRVNfQ1JfQ0NGSUUgLyohPCBDb21wdXRhdGlvbiBDb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIENSWVBfSVRfRVJSSUUgICAgIEFFU19DUl9FUlJJRSAvKiE8IEVycm9yIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9JVF9XUkVSUiAgICAgQUVTX1NSX1dSRVJSICAvKiE8IFdyaXRlIEVycm9yICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0lUX1JERVJSICAgICBBRVNfU1JfUkRFUlIgIC8qITwgUmVhZCBFcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIENSWVBfSVRfQ0NGICAgICAgIEFFU19TUl9DQ0YgICAgLyohPCBDb21wdXRhdGlvbiBjb21wbGV0ZWQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0ZsYWdzIENSWVAgRmxhZ3MKKyAgKiBAeworICAqLworCisvKiBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgQ1JZUF9GTEFHX0JVU1kgICAgQUVTX1NSX0JVU1kgICAvKiE8IEdDTSBwcm9jZXNzIHN1c3BlbnNpb24gZm9yYmlkZGVuICovCisjZGVmaW5lIENSWVBfRkxBR19XUkVSUiAgIEFFU19TUl9XUkVSUiAgLyohPCBXcml0ZSBFcnJvciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0ZMQUdfUkRFUlIgICBBRVNfU1JfUkRFUlIgIC8qITwgUmVhZCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9GTEFHX0NDRiAgICAgQUVTX1NSX0NDRiAgICAvKiE8IENvbXB1dGF0aW9uIGNvbXBsZXRlZCAgICAgICAgICAgICovCisvKiBjbGVhcmluZyBmbGFncyAqLworI2RlZmluZSBDUllQX0NDRl9DTEVBUiAgICBBRVNfQ1JfQ0NGQyAgIC8qITwgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBDbGVhciAqLworI2RlZmluZSBDUllQX0VSUl9DTEVBUiAgICBBRVNfQ1JfRVJSQyAgIC8qITwgRXJyb3IgRmxhZyBDbGVhciAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0NvbmZpZ3VyYXRpb25fU2tpcCBDUllQIEtleSBhbmQgSVYgQ29uZmlndXJhdGlvbiBTa2lwIE1vZGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfS0VZSVZDT05GSUdfQUxXQVlTICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gdG8gZG8gc3lzdGVtYXRpY2FsbHkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlJVkNPTkZJR19PTkNFICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiB0byBkbyBvbmx5IG9uY2UgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfTWFjcm9zIENSWVAgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBDUllQIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSBfX0hBTF9DUllQX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3tcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQ1JZUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKCAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZS9EaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisKKyNkZWZpbmUgX19IQUxfQ1JZUF9FTkFCTEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgQUVTX0NSX0VOKQorI2RlZmluZSBfX0hBTF9DUllQX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICB+QUVTX0NSX0VOKQorCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDUllQIHN0YXR1cyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBUaW55QUVTOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfRkxBR19CVVNZIEdDTSBwcm9jZXNzIHN1c3BlbnNpb24gZm9yYmlkZGVuCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9XUkVSUiBXcml0ZSBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfUkRFUlIgUmVhZCBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGIENvbXB1dGF0aW9uIENvbXBsZXRlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBDUllQOgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfQlVTWTogVGhlIENSWVAgY29yZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIGJsb2NrIG9mIGRhdGEKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEga2V5IHByZXBhcmF0aW9uIChmb3IgQUVTIGRlY3J5cHRpb24pLgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZFTTogSW5wdXQgRklGTyBpcyBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZORjogSW5wdXQgRklGTyBpcyBub3QgZnVsbAorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSU5SSVM6IElucHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IGlzIHBlbmRpbmcKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX09GTkU6IE91dHB1dCBGSUZPIGlzIG5vdCBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT0ZGVTogT3V0cHV0IEZJRk8gaXMgZnVsbAorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT1VUUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nCisgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisKKyNkZWZpbmUgQ1JZUF9GTEFHX01BU0sgIDB4MDAwMDAwMUZVCisjZGVmaW5lIF9fSEFMX0NSWVBfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgQ1JZUCBwZW5kaW5nIHN0YXR1cyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0VSUl9DTEVBUiBSZWFkIChSREVSUikgb3IgV3JpdGUgRXJyb3IgKFdSRVJSKSBGbGFnIENsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9DQ0ZfQ0xFQVIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAoQ0NGKSBDbGVhcgorICAqIEByZXR2YWwgTm9uZQorICAqLworCisjZGVmaW5lIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fRkxBR19fKSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIENSWVAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CisgICogQHJldHZhbCBTdGF0ZSBvZiBpbnRlcnJ1cHRpb24gKFRSVUUgb3IgRkFMU0UpLgorICAqLworCisjZGVmaW5lIF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBDUllQIGludGVycnVwdCBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9XUkVSUiBXcml0ZSBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfUkRFUlIgUmVhZCBFcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGICBDb21wdXRhdGlvbiBDb21wbGV0ZQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9JVF9JTkk6IElucHV0IEZJRk8gc2VydmljZSBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBDUllQX0lUX09VVEk6IE91dHB1dCBGSUZPIHNlcnZpY2UgbWFza2VkIGludGVycnVwdCBzdGF0dXMKKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKworI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDUllQIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gQ1JZUCBJbnRlcnJ1cHQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBUaW55QUVTOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfRVJSSUUgRXJyb3IgaW50ZXJydXB0ICh1c2VkIGZvciBSREVSUiBhbmQgV1JFUlIpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9DQ0ZJRSBDb21wdXRhdGlvbiBDb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIENSWVA6CisgICogICAgICAgICAgICBAIENSWVBfSVRfSU5JIDogSW5wdXQgRklGTyBzZXJ2aWNlIGludGVycnVwdCBtYXNrLgorICAqICAgICAgICAgICAgQCBDUllQX0lUX09VVEkgOiBPdXRwdXQgRklGTyBzZXJ2aWNlIGludGVycnVwdCBtYXNrLkNSWVAgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworCisjZGVmaW5lIF9fSEFMX0NSWVBfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDUllQIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gQ1JZUCBJbnRlcnJ1cHQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBUaW55QUVTOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfRVJSSUUgRXJyb3IgaW50ZXJydXB0ICh1c2VkIGZvciBSREVSUiBhbmQgV1JFUlIpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9DQ0ZJRSBDb21wdXRhdGlvbiBDb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIENSWVA6CisgICogICAgICAgICAgICBAIENSWVBfSVRfSU5JIDogSW5wdXQgRklGTyBzZXJ2aWNlIGludGVycnVwdCBtYXNrLgorICAqICAgICAgICAgICAgQCBDUllQX0lUX09VVEkgOiBPdXRwdXQgRklGTyBzZXJ2aWNlIGludGVycnVwdCBtYXNrLkNSWVAgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworCisjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIENSWVAgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfY3J5cF9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgSEFMX0NSWVBfTXNwSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgSEFMX0NSWVBfTXNwRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfR2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYpOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1VuUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKK3ZvaWQgSEFMX0NSWVBfUHJvY2Vzc1N1c3BlbmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TdXNwZW5kKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVzdW1lKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworI2VuZGlmIC8qIGRlZmluZWQgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworCisvKiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIEludGVycnVwdCBIYW5kbGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK0hBTF9DUllQX1NUQVRFVHlwZURlZiBIQUxfQ1JZUF9HZXRTdGF0ZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3VpbnQzMl90IEhBTF9DUllQX0dldEVycm9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9NYWNyb3MgQ1JZUCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9JU19DUllQX0RlZmluaXRpb25zIENSWVAgUHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfQ1JZUF9BTEdPUklUSE0oQUxHT1JJVEhNKSAoKChBTEdPUklUSE0pID09IENSWVBfQUVTX0VDQikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0JDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NUUikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19HQ01fR01BQyl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0NNKSkKKworCisjZGVmaW5lIElTX0NSWVBfS0VZU0laRShLRVlTSVpFKSgoKEtFWVNJWkUpID09IENSWVBfS0VZU0laRV8xMjhCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoS0VZU0laRSkgPT0gQ1JZUF9LRVlTSVpFXzI1NkIpKQorCisjZGVmaW5lIElTX0NSWVBfREFUQVRZUEUoREFUQVRZUEUpKCgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMzJCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMTZCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMUIpKQorCisjZGVmaW5lIElTX0NSWVBfSU5JVChDT05GSUcpKCgoQ09ORklHKSA9PSBDUllQX0tFWUlWQ09ORklHX0FMV0FZUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENPTkZJRykgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGVfQ29uc3RhbnRzIENSWVAgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX0RlZmluZXMgQ1JZUCBQcml2YXRlIERlZmluZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGVfVmFyaWFibGVzIENSWVAgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zIENSWVAgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQUVTICovCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9DUllQX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2NyeXBfZXguaCBiL0luYy9zdG0zMmcweHhfaGFsX2NyeXBfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNmMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfY3J5cF9leC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jcnlwX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSWVBFeCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9DUllQX0VYX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9DUllQX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEFFUykKKworLyoqIEBkZWZncm91cCBDUllQRXggQ1JZUEV4CisgICogQGJyaWVmIENSWVAgRXh0ZW5zaW9uIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfVHlwZXMgQ1JZUEV4IFByaXZhdGUgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9WYXJpYWJsZXMgQ1JZUEV4IFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfQ29uc3RhbnRzIENSWVBFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX01hY3JvcyBDUllQRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAqIEB9CisgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRnVuY3Rpb25zIENSWVBFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JZUEV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUEV4X0FFU0dDTV9HZW5lcmF0ZUF1dGhUQUcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKkF1dGhUYWcsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KK3ZvaWQgIEhBTF9DUllQRXhfRW5hYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkICBIQUxfQ1JZUEV4X0Rpc2FibGVBdXRvS2V5RGVyaXZhdGlvbihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBBRVMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfQ1JZUF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9kYWMuaCBiL0luYy9zdG0zMmcweHhfaGFsX2RhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTYxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9kYWMuaApAQCAtMCwwICsxLDUzMyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfZGFjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERBQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfREFDX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9EQUNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQoREFDMSkKKworLyoqIEBhZGR0b2dyb3VwIERBQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX1R5cGVzIERBQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9EQUNfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgREFDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9EQUNfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgREFDIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9EQUNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgREFDIGludGVybmFsIHByb2Nlc3NpbmcgaXMgb25nb2luZyAgICovCisgIEhBTF9EQUNfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgREFDIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9EQUNfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgIC8qITwgREFDIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX0RBQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgREFDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIERBQ19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0RBQ19TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAvKiE8IERBQyBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAvKiE8IERBQyBsb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAqRE1BX0hhbmRsZTE7ICAvKiE8IFBvaW50ZXIgRE1BIGhhbmRsZXIgZm9yIGNoYW5uZWwgMSAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAqRE1BX0hhbmRsZTI7ICAvKiE8IFBvaW50ZXIgRE1BIGhhbmRsZXIgZm9yIGNoYW5uZWwgMiAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAvKiE8IERBQyBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIENvbnZDcGx0Q2FsbGJhY2tDaDEpKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKyAgdm9pZCAoKiBDb252SGFsZkNwbHRDYWxsYmFja0NoMSkoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworICB2b2lkICgqIEVycm9yQ2FsbGJhY2tDaDEpKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKyAgdm9pZCAoKiBETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKShzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisgIHZvaWQgKCogQ29udkNwbHRDYWxsYmFja0NoMikoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworICB2b2lkICgqIENvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKShzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisgIHZvaWQgKCogRXJyb3JDYWxsYmFja0NoMikoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworICB2b2lkICgqIERNQVVuZGVycnVuQ2FsbGJhY2tDaDIpKHN0cnVjdCBfX0RBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19EQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gREFDX0hhbmRsZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgIERBQyBDb25maWd1cmF0aW9uIHNhbXBsZSBhbmQgaG9sZCBDaGFubmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBEQUNfU2FtcGxlVGltZSA7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTYW1wbGUgdGltZSBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBhcHBsaWVzIHdoZW4gREFDX1NhbXBsZUFuZEhvbGQgaXMgREFDX1NBTVBMRUFOREhPTERfRU5BQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMDIzICovCisKKyAgdWludDMyX3QgREFDX0hvbGRUaW1lIDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaG9sZCB0aW1lIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB3aGVuIERBQ19TYW1wbGVBbmRIb2xkIGlzIERBQ19TQU1QTEVBTkRIT0xEX0VOQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTAyMyAqLworCisgIHVpbnQzMl90IERBQ19SZWZyZXNoVGltZSA7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlZnJlc2ggdGltZSBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgd2hlbiBEQUNfU2FtcGxlQW5kSG9sZCBpcyBEQUNfU0FNUExFQU5ESE9MRF9FTkFCTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NSAqLworfSBEQUNfU2FtcGxlQW5kSG9sZENvbmZUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgICBEQUMgQ29uZmlndXJhdGlvbiByZWd1bGFyIENoYW5uZWwgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IERBQ19TYW1wbGVBbmRIb2xkOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERBQyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX1NhbXBsZUFuZEhvbGQgKi8KKworICB1aW50MzJfdCBEQUNfVHJpZ2dlcjsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX3RyaWdnZXJfc2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgREFDX091dHB1dEJ1ZmZlcjsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19vdXRwdXRfYnVmZmVyICovCisKKyAgdWludDMyX3QgREFDX0Nvbm5lY3RPbkNoaXBQZXJpcGhlcmFsIDsgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgREFDIG91dHB1dCBpcyBjb25uZWN0ZWQgb3Igbm90IHRvIG9uIGNoaXAgcGVyaXBoZXJhbCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfQ29ubmVjdE9uQ2hpcFBlcmlwaGVyYWwgKi8KKworICB1aW50MzJfdCBEQUNfVXNlclRyaW1taW5nOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgdHJpbW1pbmcgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19Vc2VyVHJpbW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfVXNlclRyaW1taW5nIGlzIGVpdGhlciBmYWN0b3J5IG9yIHVzZXIgdHJpbW1pbmcgKi8KKworICB1aW50MzJfdCBEQUNfVHJpbW1pbmdWYWx1ZTsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9mZnNldCB0cmltbWluZyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmUuIHdoZW4gREFDX1NhbXBsZUFuZEhvbGQgaXMgREFDX1RSSU1NSU5HX1VTRVIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzEgKi8KKworICBEQUNfU2FtcGxlQW5kSG9sZENvbmZUeXBlRGVmICBEQUNfU2FtcGxlQW5kSG9sZENvbmZpZzsgIC8qITwgU2FtcGxlIGFuZCBIb2xkIHNldHRpbmdzICovCisKK30gREFDX0NoYW5uZWxDb25mVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIERBQyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RBQ19DSDFfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwMFUsICAvKiE8IERBQyBDSDEgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfREFDX0NIMV9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgPSAweDAxVSwgIC8qITwgREFDIENIMSBoYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9EQUNfQ0gxX0VSUk9SX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDJVLCAgLyohPCBEQUMgQ0gxIGVycm9yIENhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0RBQ19DSDFfVU5ERVJSVU5fQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwM1UsICAvKiE8IERBQyBDSDEgdW5kZXJydW4gQ2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfREFDX0NIMl9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA0VSwgIC8qITwgREFDIENIMiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9EQUNfQ0gyX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICA9IDB4MDVVLCAgLyohPCBEQUMgQ0gyIGhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX0RBQ19DSDJfRVJST1JfSUQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNlUsICAvKiE8IERBQyBDSDIgZXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfREFDX0NIMl9VTkRFUlJVTl9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA3VSwgIC8qITwgREFDIENIMiB1bmRlcnJ1biBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9EQUNfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgLyohPCBEQUMgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICAgID0gMHgwOVUsICAvKiE8IERBQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfREFDX0FMTF9DQl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBBVSAgIC8qITwgREFDIEFsbCBJRCAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIERBQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgdm9pZCAoKnBEQUNfQ2FsbGJhY2tUeXBlRGVmKShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0NvbnN0YW50cyBEQUMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXJyb3JfQ29kZSBEQUMgRXJyb3IgQ29kZQorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX05PTkUgICAgICAgICAgICAgIDB4MDBVICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gxICAgIDB4MDFVICAgIC8qITwgREFDIGNoYW5uZWwxIERNQSB1bmRlcnJ1biBlcnJvciAgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gyICAgIDB4MDJVICAgIC8qITwgREFDIGNoYW5uZWwyIERNQSB1bmRlcnJ1biBlcnJvciAgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX0RNQSAgICAgICAgICAgICAgIDB4MDRVICAgIC8qITwgRE1BIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfREFDX0VSUk9SX1RJTUVPVVQgICAgICAgICAgIDB4MDhVICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICAweDEwVSAgICAvKiE8IEludmFsaWQgY2FsbGJhY2sgZXJyb3IgICAgICAgICAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ190cmlnZ2VyX3NlbGVjdGlvbiBEQUMgdHJpZ2dlciBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9OT05FICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb252ZXJzaW9uIGlzIGF1dG9tYXRpYyBvbmNlIHRoZSBEQUNfREhSeHh4eCByZWdpc3RlciBoYXMgYmVlbiBsb2FkZWQsIGFuZCBub3QgYnkgZXh0ZXJuYWwgdHJpZ2dlciAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9TT0ZUV0FSRSAgICAgICAgICAgIChEQUNfQ1JfVEVOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb252ZXJzaW9uIHN0YXJ0ZWQgYnkgc29mdHdhcmUgdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDFfVFJHTyAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzAgfCBEQUNfQ1JfVEVOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMSBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDJfVFJHTyAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVEVOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDNfVFJHTyAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNMyBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDZfVFJHTyAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNNiBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDdfVFJHTyAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzIgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9URU4xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNNyBUUkdPIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfVDE1X1RSR08gICAgICAgICAgICAoREFDX0NSX1RTRUwxXzMgfCBEQUNfQ1JfVEVOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTUgVFJHTyBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisjZGVmaW5lIERBQ19UUklHR0VSX0xQVElNMV9PVVQgICAgICAgICAgKERBQ19DUl9UU0VMMV8zIHwgREFDX0NSX1RTRUwxXzEgfCBEQUNfQ1JfVFNFTDFfMCB8IERBQ19DUl9URU4xKSAvKiE8IExQVElNMV9PVVQgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgY29udmVyc2lvbiB0cmlnZ2VyIGZvciBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBEQUNfVFJJR0dFUl9MUFRJTTJfT1VUICAgICAgICAgIChEQUNfQ1JfVFNFTDFfMyB8IERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RFTjEpICAgICAgICAgICAgICAgICAgLyohPCBMUFRJTTJfT1VUIHNlbGVjdGVkIGFzIGV4dGVybmFsIGNvbnZlcnNpb24gdHJpZ2dlciBmb3IgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgREFDX1RSSUdHRVJfRVhUX0lUOSAgICAgICAgICAgICAoREFDX0NSX1RTRUwxXzMgfCBEQUNfQ1JfVFNFTDFfMiB8IERBQ19DUl9UU0VMMV8wIHwgREFDX0NSX1RFTjEpIC8qITwgRVhUSSBMaW5lOSBldmVudCBzZWxlY3RlZCBhcyBleHRlcm5hbCBjb252ZXJzaW9uIHRyaWdnZXIgZm9yIERBQyBjaGFubmVsICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX291dHB1dF9idWZmZXIgREFDIG91dHB1dCBidWZmZXIKKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfT1VUUFVUQlVGRkVSX0VOQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIERBQ19PVVRQVVRCVUZGRVJfRElTQUJMRSAgICAgICAgICAgKERBQ19NQ1JfTU9ERTFfMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfQ2hhbm5lbF9zZWxlY3Rpb24gREFDIENoYW5uZWwgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBEQUNfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19kYXRhX2FsaWdubWVudCBEQUMgZGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfQUxJR05fMTJCX1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIERBQ19BTElHTl8xMkJfTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgREFDX0FMSUdOXzhCX1IgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19mbGFnc19kZWZpbml0aW9uIERBQyBmbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREFDX0ZMQUdfRE1BVURSMSAgICAgICAgICAgICAgICAgICAoREFDX1NSX0RNQVVEUjEpCisjZGVmaW5lIERBQ19GTEFHX0RNQVVEUjIgICAgICAgICAgICAgICAgICAgKERBQ19TUl9ETUFVRFIyKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19JVF9kZWZpbml0aW9uICBEQUMgSVQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19JVF9ETUFVRFIxICAgICAgICAgICAgICAgICAgIChEQUNfU1JfRE1BVURSMSkKKyNkZWZpbmUgREFDX0lUX0RNQVVEUjIgICAgICAgICAgICAgICAgICAgKERBQ19TUl9ETUFVRFIyKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19Db25uZWN0T25DaGlwUGVyaXBoZXJhbCBEQUMgQ29ubmVjdE9uQ2hpcFBlcmlwaGVyYWwKKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRElTQUJMRSAgICAweDAwMDAwMDAwVQorI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRU5BQkxFICAgICAoREFDX01DUl9NT0RFMV8wKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19Vc2VyVHJpbW1pbmcgREFDIFVzZXIgVHJpbW1pbmcKKyAgKiBAeworICAqLworI2RlZmluZSBEQUNfVFJJTU1JTkdfRkFDVE9SWSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgRmFjdG9yeSB0cmltbWluZyAqLworI2RlZmluZSBEQUNfVFJJTU1JTkdfVVNFUiAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgIC8qITwgVXNlciB0cmltbWluZyAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBEQUNfU2FtcGxlQW5kSG9sZCBEQUMgcG93ZXIgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIERBQ19TQU1QTEVBTkRIT0xEX0RJU0FCTEUgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIERBQ19TQU1QTEVBTkRIT0xEX0VOQUJMRSAgICAgIChEQUNfTUNSX01PREUxXzIpCisKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERBQ19FeHBvcnRlZF9NYWNyb3MgREFDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgREFDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQUMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfREFDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX0RBQ19TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9EQUNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqIEBicmllZiBFbmFibGUgdGhlIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIERBQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0RBQ19DaGFubmVsX18gc3BlY2lmaWVzIHRoZSBEQUMgY2hhbm5lbAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfRU5BQkxFKF9fSEFORExFX18sIF9fREFDX0NoYW5uZWxfXykgXAorICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIChEQUNfQ1JfRU4xIDw8ICgoX19EQUNfQ2hhbm5lbF9fKSAmIDB4MTBVTCkpKQorCisvKiogQGJyaWVmIERpc2FibGUgdGhlIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIERBQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fREFDX0NoYW5uZWxfXyBzcGVjaWZpZXMgdGhlIERBQyBjaGFubmVsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfRElTQUJMRShfX0hBTkRMRV9fLCBfX0RBQ19DaGFubmVsX18pIFwKKyAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICB+KERBQ19DUl9FTjEgPDwgKChfX0RBQ19DaGFubmVsX18pICYgMHgxMFVMKSkpCisKKy8qKiBAYnJpZWYgU2V0IERIUjEyUjEgYWxpZ25tZW50LgorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbm1lbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgREFDX0RIUjEyUjFfQUxJR05NRU5UKF9fQUxJR05NRU5UX18pICgweDAwMDAwMDA4VSArIChfX0FMSUdOTUVOVF9fKSkKKworLyoqIEBicmllZiAgU2V0IERIUjEyUjIgYWxpZ25tZW50LgorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbm1lbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgREFDX0RIUjEyUjJfQUxJR05NRU5UKF9fQUxJR05NRU5UX18pICgweDAwMDAwMDE0VSArIChfX0FMSUdOTUVOVF9fKSkKKworLyoqIEBicmllZiAgU2V0IERIUjEyUkQgYWxpZ25tZW50LgorICAqIEBwYXJhbSAgX19BTElHTk1FTlRfXyBzcGVjaWZpZXMgdGhlIERBQyBhbGlnbm1lbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgREFDX0RIUjEyUkRfQUxJR05NRU5UKF9fQUxJR05NRU5UX18pICgweDAwMDAwMDIwVSArIChfX0FMSUdOTUVOVF9fKSkKKworLyoqIEBicmllZiBFbmFibGUgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0lUX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmIERpc2FibGUgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERBQyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0lUX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RBQ19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBEQUMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBEQUMgaGFuZGxlCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gREFDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2sKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfSVRfRE1BVURSMTogREFDIGNoYW5uZWwgMSBETUEgdW5kZXJydW4gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIERBQ19JVF9ETUFVRFIyOiBEQUMgY2hhbm5lbCAyIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGludGVycnVwdGlvbiAoU0VUIG9yIFJFU0VUKQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgREFDJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgREFDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgREFDIGZsYWcgdG8gZ2V0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19GTEFHX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0ZMQUdfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBEQUMncyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIERBQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIERBQyBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19GTEFHX0RNQVVEUjE6IERBQyBjaGFubmVsIDEgRE1BIHVuZGVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0ZMQUdfRE1BVURSMjogREFDIGNoYW5uZWwgMiBETUEgdW5kZXJydW4gZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9EQUNfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERBQ19Qcml2YXRlX01hY3JvcyBEQUMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShTVEFURSkgKCgoU1RBVEUpID09IERBQ19PVVRQVVRCVUZGRVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gREFDX09VVFBVVEJVRkZFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19EQUNfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA9PSBEQUNfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IERBQ19DSEFOTkVMXzIpKQorCisjZGVmaW5lIElTX0RBQ19BTElHTihBTElHTikgKCgoQUxJR04pID09IERBQ19BTElHTl8xMkJfUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMSUdOKSA9PSBEQUNfQUxJR05fMTJCX0wpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTElHTikgPT0gREFDX0FMSUdOXzhCX1IpKQorCisjZGVmaW5lIElTX0RBQ19EQVRBKERBVEEpICgoREFUQSkgPD0gMHhGRkYwVSkKKworI2RlZmluZSBJU19EQUNfUkVGUkVTSFRJTUUoVElNRSkgICAoKFRJTUUpIDw9IDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIERBQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kYWNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfSW5pdChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX0RlSW5pdChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7Cit2b2lkIEhBTF9EQUNfTXNwSW5pdChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7Cit2b2lkIEhBTF9EQUNfTXNwRGVJbml0KERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0KERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfU3RvcChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0X0RNQShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MzJfdCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbm1lbnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdG9wX0RNQShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7CisKK3ZvaWQgSEFMX0RBQ19JUlFIYW5kbGVyKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhKTsKKwordm9pZCBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOwordm9pZCBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKK3ZvaWQgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKK3ZvaWQgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIERBQyBjYWxsYmFjayByZWdpc3RlcmluZy91bnJlZ2lzdGVyaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0RBQ19SZWdpc3RlckNhbGxiYWNrKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCBIQUxfREFDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEQUNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0RBQ19VblJlZ2lzdGVyQ2FsbGJhY2soREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX0RBQ19HZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNfQ29uZmlnQ2hhbm5lbChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgREFDX0NoYW5uZWxDb25mVHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9EQUNfU3RhdGVUeXBlRGVmIEhBTF9EQUNfR2V0U3RhdGUoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOwordWludDMyX3QgSEFMX0RBQ19HZXRFcnJvcihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfRnVuY3Rpb25zIERBQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCit2b2lkIERBQ19ETUFDb252Q3BsdENoMShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIERBQ19ETUFFcnJvckNoMShETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERBQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLypTVE0zMkcweHhfSEFMX0RBQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2RhY19leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfZGFjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0M2JhNQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2RhY19leC5oCkBAIC0wLDAgKzEsMjMxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9kYWNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgREFDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9EQUNfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0RBQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisjaWYgZGVmaW5lZChEQUMxKQorCisvKiogQGFkZHRvZ3JvdXAgREFDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBEQUNFeF9FeHBvcnRlZF9Db25zdGFudHMgREFDRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNFeF9sZnNydW5tYXNrX3RyaWFuZ2xlYW1wbGl0dWRlIERBQ0V4IGxmc3J1bm1hc2sgdHJpYW5nbGUgYW1wbGl0dWRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUMCAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0MCBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFMxXzAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzJfMCAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzI6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTM18wICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMzowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFM0XzAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs0OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzVfMCAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzU6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTNl8wICAgICAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNjowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFM3XzAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs3OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgREFDX0xGU1JVTk1BU0tfQklUUzhfMCAgICAgICAgICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzg6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBEQUNfTEZTUlVOTUFTS19CSVRTOV8wICAgICAgICAgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbOTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFMxMF8wICAgICAgICAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMDowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19MRlNSVU5NQVNLX0JJVFMxMV8wICAgICAgICAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDEgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzMgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMyAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA3ICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xNSAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDE1ICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8zMSAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDMxICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV82MyAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDYzICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xMjcgICAgICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDEyNyAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjU1ICAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAyNTUgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzUxMSAgICAgICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNTExICovCisjZGVmaW5lIERBQ19UUklBTkdMRUFNUExJVFVERV8xMDIzICAgICAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDEwMjMgKi8KKyNkZWZpbmUgREFDX1RSSUFOR0xFQU1QTElUVURFXzIwNDcgICAgICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMjA0NyAqLworI2RlZmluZSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNDA5NSAgICAgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA0MDk1ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBEQUNFeF9Qcml2YXRlX01hY3JvcyBEQUNFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0RBQ19UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX05PTkUpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfU09GVFdBUkUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UMV9UUkdPKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1QyX1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDNfVFJHTykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9UNl9UUkdPKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX1Q3X1RSR08pICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfVDE1X1RSR08pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBEQUNfVFJJR0dFUl9MUFRJTTFfT1VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IERBQ19UUklHR0VSX0xQVElNMl9PVVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gREFDX1RSSUdHRVJfRVhUX0lUOSkpCisKKworI2RlZmluZSBJU19EQUNfU0FNUExFVElNRShUSU1FKSAoKFRJTUUpIDw9IDB4MDAwMDAzRkZVKQorCisjZGVmaW5lIElTX0RBQ19IT0xEVElNRShUSU1FKSAgICgoVElNRSkgPD0gMHgwMDAwMDNGRlUpCisKKyNkZWZpbmUgSVNfREFDX1NBTVBMRUFOREhPTEQoTU9ERSkgKCgoTU9ERSkgPT0gREFDX1NBTVBMRUFOREhPTERfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQUNfU0FNUExFQU5ESE9MRF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0RBQ19UUklNTUlOR1ZBTFVFKFRSSU1NSU5HVkFMVUUpICgoVFJJTU1JTkdWQUxVRSkgPD0gMHgxRlUpCisKKyNkZWZpbmUgSVNfREFDX05FV1RSSU1NSU5HVkFMVUUoVFJJTU1JTkdWQUxVRSkgKChUUklNTUlOR1ZBTFVFKSA8PSAweDFGVSkKKworI2RlZmluZSBJU19EQUNfQ0hJUF9DT05ORUNUSU9OKENPTk5FQ1QpICgoKENPTk5FQ1QpID09IERBQ19DSElQQ09OTkVDVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09OTkVDVCkgPT0gREFDX0NISVBDT05ORUNUX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfREFDX1RSSU1NSU5HKFRSSU1NSU5HKSAoKChUUklNTUlORykgPT0gREFDX1RSSU1NSU5HX0ZBQ1RPUlkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklNTUlORykgPT0gREFDX1RSSU1NSU5HX1VTRVIpKQorCisjZGVmaW5lIElTX0RBQ19MRlNSX1VOTUFTS19UUklBTkdMRV9BTVBMSVRVREUoVkFMVUUpICgoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVQwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMl8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTM18wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTNl8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTN18wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTOF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTOV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfTEZTUlVOTUFTS19CSVRTMTBfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX0xGU1JVTk1BU0tfQklUUzExXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzMxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xMjcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8yNTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV81MTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVkFMVUUpID09IERBQ19UUklBTkdMRUFNUExJVFVERV8xMDIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjA0NykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gREFDX1RSSUFOR0xFQU1QTElUVURFXzQwOTUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9UcmlhbmdsZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQW1wbGl0dWRlKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X0R1YWxTZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQWxpZ25tZW50LCB1aW50MzJfdCBEYXRhMSwgdWludDMyX3QgRGF0YTIpOwordWludDMyX3QgSEFMX0RBQ0V4X0R1YWxHZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7CisKK3ZvaWQgSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOwordm9pZCBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpOwordm9pZCBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyk7Cit2b2lkIEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKTsKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDRXhfU2VsZkNhbGlicmF0ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgREFDX0NoYW5uZWxDb25mVHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDRXhfU2V0VXNlclRyaW1taW5nKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOZXdUcmltbWluZ1ZhbHVlKTsKK3VpbnQzMl90IEhBTF9EQUNFeF9HZXRUcmltT2Zmc2V0KERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERBQ0V4X1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogREFDX0RNQUNvbnZDcGx0Q2gyIC8gREFDX0RNQUVycm9yQ2gyIC8gREFDX0RNQUhhbGZDb252Q3BsdENoMiAqLworLyogYXJlIGNhbGxlZCBieSBIQUxfREFDX1N0YXJ0X0RNQSAqLwordm9pZCBEQUNfRE1BQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBEQUNfRE1BRXJyb3JDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBEQUNfRE1BSGFsZkNvbnZDcGx0Q2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERBQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qU1RNMzJHMHh4X0hBTF9EQUNfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZGVmLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE0MzlmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfZGVmLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2RlZi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgSEFMIGNvbW1vbiBkZWZpbmVzLCBlbnVtZXJhdGlvbiwgbWFjcm9zIGFuZAorICAqICAgICAgICAgIHN0cnVjdHVyZXMgZGVmaW5pdGlvbnMuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0RFRgorI2RlZmluZSBTVE0zMkcweHhfSEFMX0RFRgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisjaW5jbHVkZSAiTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCIgICAvKiBBbGlhc2VzIGZpbGUgZm9yIG9sZCBuYW1lcyBjb21wYXRpYmlsaXR5ICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXR1cyBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfT0sgICAgICAgPSAweDAwVSwKKyAgSEFMX0VSUk9SICAgID0gMHgwMVUsCisgIEhBTF9CVVNZICAgICA9IDB4MDJVLAorICBIQUxfVElNRU9VVCAgPSAweDAzVQorfSBIQUxfU3RhdHVzVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgTG9jayBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVU5MT0NLRUQgPSAweDAwVSwKKyAgSEFMX0xPQ0tFRCAgID0gMHgwMVUKK30gSEFMX0xvY2tUeXBlRGVmOworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFVOVVNFRChYKSAodm9pZClYICAgICAgLyogVG8gYXZvaWQgZ2NjL2crKyB3YXJuaW5ncyAqLworCisjZGVmaW5lIEhBTF9NQVhfREVMQVkgICAgICAweEZGRkZGRkZGVQorCisjZGVmaW5lIEhBTF9JU19CSVRfU0VUKFJFRywgQklUKSAgICAgICAgICgoKFJFRykgJiAoQklUKSkgPT0gKEJJVCkpCisjZGVmaW5lIEhBTF9JU19CSVRfQ0xSKFJFRywgQklUKSAgICAgICAgICgoKFJFRykgJiAoQklUKSkgPT0gMFUpCisKKyNkZWZpbmUgX19IQUxfTElOS0RNQShfX0hBTkRMRV9fLCBfX1BQUF9ETUFfRklFTERfXywgX19ETUFfSEFORExFX18pICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5fX1BQUF9ETUFfRklFTERfXyA9ICYoX19ETUFfSEFORExFX18pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19ETUFfSEFORExFX18pLlBhcmVudCA9IChfX0hBTkRMRV9fKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmIFJlc2V0IHRoZSBIYW5kbGVzIFN0YXRlIGZpZWxkLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBIYW5kbGUuCisgICogQG5vdGUgIFRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgZm9yIHRoZSBmb2xsb3dpbmcgcHVycG9zZToKKyAgKiAgICAgICAgICAtIFdoZW4gdGhlIEhhbmRsZSBpcyBkZWNsYXJlZCBhcyBsb2NhbCB2YXJpYWJsZTsgYmVmb3JlIHBhc3NpbmcgaXQgYXMgcGFyYW1ldGVyCisgICogICAgICAgICAgICB0byBIQUxfUFBQX0luaXQoKSBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IGlzIG1hbmRhdG9yeSB0byB1c2UgdGhpcyBtYWNybworICAqICAgICAgICAgICAgdG8gc2V0IHRvIDAgdGhlIEhhbmRsZXMgIlN0YXRlIiBmaWVsZC4KKyAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgIlN0YXRlIiBmaWVsZCBtYXkgaGF2ZSBhbnkgcmFuZG9tIHZhbHVlIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEhBTF9QUFBfSW5pdCgpIGlzIGNhbGxlZCwgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIG1pc3NlZAorICAqICAgICAgICAgICAgKGkuZS4gSEFMX1BQUF9Nc3BJbml0KCkgd2lsbCBub3QgYmUgZXhlY3V0ZWQpLgorICAqICAgICAgICAgIC0gV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogaW5zdGVhZCBvZiBjYWxsaW5nCisgICogICAgICAgICAgICBIQUxfUFBQX0RlSW5pdCgpIHRoZW4gSEFMX1BQUF9Jbml0KCksIHVzZXIgY2FuIG1ha2UgYSBjYWxsIHRvIHRoaXMgbWFjcm8gdGhlbiBIQUxfUFBQX0luaXQoKS4KKyAgKiAgICAgICAgICAgIEluIHRoaXMgbGF0ZXIgZnVuY3Rpb24sIHdoZW4gdGhlIEhhbmRsZXMgIlN0YXRlIiBmaWVsZCBpcyBzZXQgdG8gMCwgaXQgd2lsbCBleGVjdXRlIHRoZSBmdW5jdGlvbgorICAqICAgICAgICAgICAgSEFMX1BQUF9Nc3BJbml0KCkgd2hpY2ggd2lsbCByZWNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSAwVSkKKworI2lmIChVU0VfUlRPUyA9PSAxVSkKKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisjZXJyb3IgIiBVU0VfUlRPUyBzaG91bGQgYmUgMCBpbiB0aGUgY3VycmVudCBIQUwgcmVsZWFzZSAiCisjZWxzZQorI2RlZmluZSBfX0hBTF9MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChfX0hBTkRMRV9fKS0+TG9jayA9PSBIQUxfTE9DS0VEKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIQUxfQlVTWTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TG9jayA9IEhBTF9MT0NLRUQ7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUgKDBVKQorCisjZGVmaW5lIF9fSEFMX1VOTE9DSyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlICgwVSkKKyNlbmRpZiAvKiBVU0VfUlRPUyAqLworCisjaWYgIGRlZmluZWQgKCBfX0dOVUNfXyApCisjaWZuZGVmIF9fd2VhaworI2RlZmluZSBfX3dlYWsgICBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKKyNlbmRpZiAvKiBfX3dlYWsgKi8KKyNpZm5kZWYgX19wYWNrZWQKKyNkZWZpbmUgX19wYWNrZWQgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpCisjZW5kaWYgLyogX19wYWNrZWQgKi8KKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisKKy8qIE1hY3JvIHRvIGdldCB2YXJpYWJsZSBhbGlnbmVkIG9uIDQtYnl0ZXMsIGZvciBfX0lDQ0FSTV9fIHRoZSBkaXJlY3RpdmUgIiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9NCIgbXVzdCBiZSB1c2VkIGluc3RlYWQgKi8KKy8qIEdOVSBDb21waWxlciAqLworI2lmIGRlZmluZWQgICAoX19HTlVDX18pCisjaWZuZGVmIF9fQUxJR05fRU5ECisjZGVmaW5lIF9fQUxJR05fRU5EICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0VSkpKQorI2VuZGlmIC8qIF9fQUxJR05fRU5EICovCisjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyNkZWZpbmUgX19BTElHTl9CRUdJTgorI2VuZGlmIC8qIF9fQUxJR05fQkVHSU4gKi8KKyNlbHNlCisjaWZuZGVmIF9fQUxJR05fRU5ECisjZGVmaW5lIF9fQUxJR05fRU5ECisjZW5kaWYgLyogX19BTElHTl9FTkQgKi8KKyNpZm5kZWYgX19BTElHTl9CRUdJTgorLyogQVJNIENvbXBpbGVyICovCisjaWYgZGVmaW5lZCAgIChfX0NDX0FSTSkKKyNkZWZpbmUgX19BTElHTl9CRUdJTiAgICBfX2FsaWduKDRVKQorLyogSUFSIENvbXBpbGVyICovCisjZWxpZiBkZWZpbmVkIChfX0lDQ0FSTV9fKQorI2RlZmluZSBfX0FMSUdOX0JFR0lOCisjZW5kaWYgLyogX19DQ19BUk0gKi8KKyNlbmRpZiAvKiBfX0FMSUdOX0JFR0lOICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworLyoqCisgICogQGJyaWVmICBfX1JBTV9GVU5DIGRlZmluaXRpb24KKyAgKi8KKyNpZiBkZWZpbmVkICggX19DQ19BUk0gICApCisvKiBBUk0gQ29tcGlsZXIKKyAgIC0tLS0tLS0tLS0tLQorICAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgdG9vbGNoYWluIG9wdGlvbnMuCisgICBGdW5jdGlvbnMgdGhhdCBhcmUgZXhlY3V0ZWQgaW4gUkFNIHNob3VsZCByZXNpZGUgaW4gYSBzZXBhcmF0ZSBzb3VyY2UgbW9kdWxlLgorICAgVXNpbmcgdGhlICdPcHRpb25zIGZvciBGaWxlJyBkaWFsb2cgeW91IGNhbiBzaW1wbHkgY2hhbmdlIHRoZSAnQ29kZSAvIENvbnN0JworICAgYXJlYSBvZiBhIG1vZHVsZSB0byBhIG1lbW9yeSBzcGFjZSBpbiBwaHlzaWNhbCBSQU0uCisgICBBdmFpbGFibGUgbWVtb3J5IGFyZWFzIGFyZSBkZWNsYXJlZCBpbiB0aGUgJ1RhcmdldCcgdGFiIG9mIHRoZSAnT3B0aW9ucyBmb3IgVGFyZ2V0JworICAgZGlhbG9nLgorKi8KKyNkZWZpbmUgX19SQU1fRlVOQworCisjZWxpZiBkZWZpbmVkICggX19JQ0NBUk1fXyApCisvKiBJQ0NBUk0gQ29tcGlsZXIKKyAgIC0tLS0tLS0tLS0tLS0tLQorICAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBrZXl3b3JkICJfX3JhbWZ1bmMiLgorKi8KKyNkZWZpbmUgX19SQU1fRlVOQyBfX3JhbWZ1bmMKKworI2VsaWYgZGVmaW5lZCAgICggIF9fR05VQ19fICApCisvKiBHTlUgQ29tcGlsZXIKKyAgIC0tLS0tLS0tLS0tLQorICBSQU0gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHVzaW5nIGEgc3BlY2lmaWMgdG9vbGNoYWluIGF0dHJpYnV0ZQorICAgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5SYW1GdW5jIikpKSIuCisqLworI2RlZmluZSBfX1JBTV9GVU5DIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5SYW1GdW5jIikpKQorCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBfX05PSU5MSU5FIGRlZmluaXRpb24KKyAgKi8KKyNpZiBkZWZpbmVkICggX19DQ19BUk0gICApIHx8IGRlZmluZWQgICAoICBfX0dOVUNfXyAgKQorLyogQVJNICYgR05VQ29tcGlsZXIKKyAgIC0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIF9fTk9JTkxJTkUgX19hdHRyaWJ1dGVfXyAoIChub2lubGluZSkgKQorCisjZWxpZiBkZWZpbmVkICggX19JQ0NBUk1fXyApCisvKiBJQ0NBUk0gQ29tcGlsZXIKKyAgIC0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgX19OT0lOTElORSBfUHJhZ21hKCJvcHRpbWl6ZSA9IG5vX2lubGluZSIpCisKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0RFRiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZG1hLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIyNDVmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfZG1hLmgKQEAgLTAsMCArMSw3MTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2RtYS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfRE1BX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9ETUFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9UeXBlcyBETUEgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERNQSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBSZXF1ZXN0OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSByZXF1ZXN0IHNlbGVjdGVkIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9yZXF1ZXN0ICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIHBlcmlwaGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1lbW9yeSB0byBtZW1vcnkgb3IgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uICovCisKKyAgdWludDMyX3QgUGVyaXBoSW5jOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQZXJpcGhlcmFsIGFkZHJlc3MgcmVnaXN0ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSAqLworCisgIHVpbnQzMl90IE1lbUluYzsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX01lbW9yeV9pbmNyZW1lbnRlZF9tb2RlICovCisKKyAgdWludDMyX3QgUGVyaXBoRGF0YUFsaWdubWVudDsgICAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUGVyaXBoZXJhbF9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNZW1EYXRhQWxpZ25tZW50OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBNZW1vcnkgZGF0YSB3aWR0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX01lbW9yeV9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpb24gbW9kZSBvZiB0aGUgRE1BeSBDaGFubmVseC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0cmFuc2ZlciBpcyBjb25maWd1cmVkIG9uIHRoZSBzZWxlY3RlZCBDaGFubmVsICovCisKKyAgdWludDMyX3QgUHJpb3JpdHk7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc29mdHdhcmUgcHJpb3JpdHkgZm9yIHRoZSBETUF5IENoYW5uZWx4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUHJpb3JpdHlfbGV2ZWwgKi8KK30gRE1BX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBETUEgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBETUEgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAqLworICBIQUxfRE1BX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IERNQSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICovCisgIEhBTF9ETUFfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgRE1BIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0RNQV9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBETUEgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfRE1BX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgRE1BIEVycm9yIENvZGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX0ZVTExfVFJBTlNGRVIgICAgICAgICAgID0gMHgwMFUsICAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfSEFMRl9UUkFOU0ZFUiAgICAgICAgICAgPSAweDAxVSAgIC8qITwgSGFsZiBUcmFuc2ZlciAgICAgKi8KK30gSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgRE1BIENhbGxiYWNrIElEIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9YRkVSX0NQTFRfQ0JfSUQgICAgICAgICAgPSAweDAwVSwgIC8qITwgRnVsbCB0cmFuc2ZlciAgICAqLworICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQgICAgICA9IDB4MDFVLCAgLyohPCBIYWxmIHRyYW5zZmVyICAgICovCisgIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRCAgICAgICAgID0gMHgwMlUsICAvKiE8IEVycm9yICAgICAgICAgICAgKi8KKyAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEICAgICAgICAgPSAweDAzVSwgIC8qITwgQWJvcnQgICAgICAgICAgICAqLworICBIQUxfRE1BX1hGRVJfQUxMX0NCX0lEICAgICAgICAgICA9IDB4MDRVICAgLyohPCBBbGwgICAgICAgICAgICAgICovCisKK30gSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBETUEgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmCit7CisgIERNQV9DaGFubmVsX1R5cGVEZWYgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0luaXRUeXBlRGVmICAgICAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0RNQV9TdGF0ZVR5cGVEZWYgICAgICAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgdHJhbnNmZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAgICpQYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcmVudCBvYmplY3Qgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIFhmZXJDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgICAgICAgIC8qITwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgKCogWGZlckhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgICAgLyohPCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAgICovCisKKyAgdm9pZCAoKiBYZmVyRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAgICAgICAgICAgKi8KKworICB2b2lkICgqIFhmZXJBYm9ydENhbGxiYWNrKShzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7ICAgICAgIC8qITwgRE1BIHRyYW5zZmVyIGFib3J0IGNhbGxiYWNrICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBDaGFubmVsIEluZGV4ICAgICAgICAgICAgICAgICAgICAgKi8KKworICBETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICAgICAgICAgICAqRE1BbXV4Q2hhbm5lbDsgICAgICAgICAgICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworCisgIERNQU1VWF9DaGFubmVsU3RhdHVzX1R5cGVEZWYgICAgICpETUFtdXhDaGFubmVsU3RhdHVzOyAgICAgICAgICAgICAgLyohPCBETUFNVVggQ2hhbm5lbHMgU3RhdHVzIEJhc2UgQWRkcmVzcyAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgRE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7ICAgICAgICAgICAvKiE8IERNQU1VWCBDaGFubmVsIFN0YXR1cyBNYXNrICAgICAgICAgICAgKi8KKworICBETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICAgICAgICAqRE1BbXV4UmVxdWVzdEdlbjsgICAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIEJhc2UgQWRkcmVzcyAqLworCisgIERNQU1VWF9SZXF1ZXN0R2VuU3RhdHVzX1R5cGVEZWYgICpETUFtdXhSZXF1ZXN0R2VuU3RhdHVzOyAgICAgICAgICAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgQWRkcmVzcyAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgRE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7ICAgICAgICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBTdGF0dXMgbWFzayAgKi8KK30gRE1BX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9Db25zdGFudHMgRE1BIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0Vycm9yX0NvZGUgRE1BIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfVEUgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgLyohPCBUcmFuc2ZlciBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT19YRkVSICAgICAgICAweDAwMDAwMDA0VSAgICAgICAvKiE8IEFib3J0IHJlcXVlc3RlZCB3aXRoIG5vIFhmZXIgb25nb2luZyAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQgICAgICAgIDB4MDAwMDAwMjBVICAgICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9UX1NVUFBPUlRFRCAgMHgwMDAwMDEwMFUgICAgICAgLyohPCBOb3Qgc3VwcG9ydGVkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9TWU5DICAgICAgICAgICAweDAwMDAwMjAwVSAgICAgICAvKiE8IERNQU1VWCBzeW5jIG92ZXJydW4gIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX1JFUUdFTiAgICAgICAgIDB4MDAwMDA0MDBVICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gIGVycm9yICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX3JlcXVlc3QgRE1BIHJlcXVlc3QKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9NRU0yTUVNICAgICAgICAgICAwVSAgICAgICAgICAgICAgIC8qITwgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciAgICAgKi8KKworCisjZGVmaW5lIERNQV9SRVFVRVNUX0dFTkVSQVRPUjAgICAgICAgIDFVICAgICAgICAgICAgICAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMCAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9HRU5FUkFUT1IxICAgICAgICAyVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDEgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMiAgICAgICAgM1UgICAgICAgICAgICAgICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciAyICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX0dFTkVSQVRPUjMgICAgICAgIDRVICAgICAgICAgICAgICAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMyAgICAqLworCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQURDMSAgICAgICAgICAgICAgNVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBBREMxIHJlcXVlc3QgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKEFFUykKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQUVTX0lOICAgICAgICAgICAgNlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBBRVMgSU4gcmVxdWVzdCAgICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX0FFU19PVVQgICAgICAgICAgIDdVICAgICAgICAgICAgICAgLyohPCBETUFNVVggQUVTIE9VVCByZXF1ZXN0ICAgICAgICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERBQzEpCisjZGVmaW5lIERNQV9SRVFVRVNUX0RBQzFfQ0hBTk5FTDEgICAgIDhVICAgICAgICAgICAgICAgLyohPCBETUFNVVggU1BJMiBSWCByZXF1ZXN0ICAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9EQUMxX0NIQU5ORUwyICAgICA5VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFNQSTIgVFggcmVxdWVzdCAgICAgICAgKi8KKyNlbmRpZgorCisjZGVmaW5lIERNQV9SRVFVRVNUX0kyQzFfUlggICAgICAgICAgMTBVICAgICAgICAgICAgICAgLyohPCBETUFNVVggSTJDMSBSWCByZXF1ZXN0ICAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9JMkMxX1RYICAgICAgICAgIDExVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIEkyQzEgVFggcmVxdWVzdCAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDMl9SWCAgICAgICAgICAxMlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBJMkMyIFJYIHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX0kyQzJfVFggICAgICAgICAgMTNVICAgICAgICAgICAgICAgLyohPCBETUFNVVggSTJDMiBUWCByZXF1ZXN0ICAgICAgICAqLworCisjaWYgZGVmaW5lZChMUFVBUlQxKQorI2RlZmluZSBETUFfUkVRVUVTVF9MUFVBUlQxX1JYICAgICAgIDE0VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIExQVUFSVDEgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfTFBVQVJUMV9UWCAgICAgICAxNVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBMUFVBUlQxIFRYIHJlcXVlc3QgICAgICovCisjZW5kaWYKKworI2RlZmluZSBETUFfUkVRVUVTVF9TUEkxX1JYICAgICAgICAgIDE2VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFNQSTEgUlggcmVxdWVzdCAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfU1BJMV9UWCAgICAgICAgICAxN1UgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBTUEkxIFRYIHJlcXVlc3QgICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1NQSTJfUlggICAgICAgICAgMThVICAgICAgICAgICAgICAgLyohPCBETUFNVVggU1BJMiBSWCByZXF1ZXN0ICAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9TUEkyX1RYICAgICAgICAgIDE5VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFNQSTIgVFggcmVxdWVzdCAgICAgICAgKi8KKworCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gxICAgICAgICAgMjBVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMSBDSDEgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xX0NIMiAgICAgICAgIDIxVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTEgQ0gyIHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9DSDMgICAgICAgICAyMlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENIMyByZXF1ZXN0ICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0g0ICAgICAgICAgMjNVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMSBDSDQgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xX1RSSUdfQ09NICAgIDI0VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTEgVFJJRyBDT00gcmVxdWVzdCAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMV9VUCAgICAgICAgICAyNVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIFVQIHJlcXVlc3QgICAgICAgICovCisKKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfQ0gxICAgICAgICAgMjZVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMiBDSDEgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0yX0NIMiAgICAgICAgIDI3VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgQ0gyIHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDMgICAgICAgICAyOFUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0yIENIMyByZXF1ZXN0ICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTJfQ0g0ICAgICAgICAgMjlVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMiBDSDQgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0yX1RSSUcgICAgICAgIDMwVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgVFJJRyByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9VUCAgICAgICAgICAzMVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0yIFVQIHJlcXVlc3QgICAgICAgICovCisjZW5kaWYKKworI2RlZmluZSBETUFfUkVRVUVTVF9USU0zX0NIMSAgICAgICAgIDMyVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTMgQ0gxIHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19DSDIgICAgICAgICAzM1UgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0zIENIMiByZXF1ZXN0ICAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfQ0gzICAgICAgICAgMzRVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMyBDSDMgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0zX0NINCAgICAgICAgIDM1VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTMgQ0g0IHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNM19UUklHICAgICAgICAzNlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0zIFRSSUcgcmVxdWVzdCAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTNfVVAgICAgICAgICAgMzdVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMyBVUCByZXF1ZXN0ICAgICAgICAqLworCisjaWYgZGVmaW5lZChUSU02KQorI2RlZmluZSBETUFfUkVRVUVTVF9USU02X1VQICAgICAgICAgIDM4VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTYgVVAgcmVxdWVzdCAgICAgICAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNykKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNN19VUCAgICAgICAgICAzOVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU03IFVQIHJlcXVlc3QgICAgICAgICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE1X0NIMSAgICAgICAgNDBVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMTUgQ0gxIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNV9DSDIgICAgICAgIDQxVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTE1IENIMiByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTVfVFJJR19DT00gICA0MlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xNSBUUklHIENPTSByZXF1ZXN0ICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE1X1VQICAgICAgICAgNDNVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMTUgVVAgcmVxdWVzdCAgICAgICAqLworI2VuZGlmCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTZfQ0gxICAgICAgICA0NFUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xNiBDSDEgcmVxdWVzdCAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE2X1RSSUdfQ09NICAgNDVVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMTYgVFJJRyBDT00gcmVxdWVzdCAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNl9VUCAgICAgICAgIDQ2VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTE2IFVQIHJlcXVlc3QgICAgICAgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xN19DSDEgICAgICAgIDQ3VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTE3IENIMiByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMTdfVFJJR19DT00gICA0OFUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xNyBUUklHIENPTSByZXF1ZXN0ICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X1VQICAgICAgICAgNDlVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVElNMTcgVVAgcmVxdWVzdCAgICAgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX1VTQVJUMV9SWCAgICAgICAgNTBVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVVNBUlQxIFJYIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDFfVFggICAgICAgIDUxVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFVTQVJUMSBUWCByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQyX1JYICAgICAgICA1MlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBVU0FSVDIgUlggcmVxdWVzdCAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1VTQVJUMl9UWCAgICAgICAgNTNVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVVNBUlQyIFRYIHJlcXVlc3QgICAgICAqLworI2lmIGRlZmluZWQoVVNBUlQzKQorI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDNfUlggICAgICAgIDU0VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFVTQVJUMyBSWCByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQzX1RYICAgICAgICA1NVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBVU0FSVDMgVFggcmVxdWVzdCAgICAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTQVJUNCkKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVVNBUlQ0X1JYICAgICAgICA1NlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBVU0FSVDQgUlggcmVxdWVzdCAgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1VTQVJUNF9UWCAgICAgICAgNTdVICAgICAgICAgICAgICAgLyohPCBETUFNVVggVVNBUlQ0IFRYIHJlcXVlc3QgICAgICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVDUEQxKQorI2RlZmluZSBETUFfUkVRVUVTVF9VQ1BEMV9SWCAgICAgICAgIDU4VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFVDUEQxIFJYIHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVUNQRDFfVFggICAgICAgICA1OVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBVQ1BEMSBUWCByZXF1ZXN0ICAgICAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBETUFfUkVRVUVTVF9VQ1BEMl9SWCAgICAgICAgIDYwVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIFVDUEQyIFJYIHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVUNQRDJfVFggICAgICAgICA2MVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBVQ1BEMiBUWCByZXF1ZXN0ICAgICAgICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0RhdGFfdHJhbnNmZXJfZGlyZWN0aW9uIERNQSBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIERNQV9QRVJJUEhfVE9fTUVNT1JZICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBQZXJpcGhlcmFsIHRvIG1lbW9yeSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgRE1BX01FTU9SWV9UT19QRVJJUEggICAgICAgICBETUFfQ0NSX0RJUiAgICAgICAvKiE8IE1lbW9yeSB0byBwZXJpcGhlcmFsIGRpcmVjdGlvbiAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX01FTU9SWSAgICAgICAgIERNQV9DQ1JfTUVNMk1FTSAgIC8qITwgTWVtb3J5IHRvIG1lbW9yeSBkaXJlY3Rpb24gICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSBETUEgUGVyaXBoZXJhbCBpbmNyZW1lbnRlZCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BJTkNfRU5BQkxFICAgICAgICAgICAgICBETUFfQ0NSX1BJTkMgICAgICAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLworI2RlZmluZSBETUFfUElOQ19ESVNBQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9NZW1vcnlfaW5jcmVtZW50ZWRfbW9kZSBETUEgTWVtb3J5IGluY3JlbWVudGVkIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfTUlOQ19FTkFCTEUgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIEVuYWJsZSAgKi8KKyNkZWZpbmUgRE1BX01JTkNfRElTQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9QZXJpcGhlcmFsX2RhdGFfc2l6ZSBETUEgUGVyaXBoZXJhbCBkYXRhIHNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfUERBVEFBTElHTl9CWVRFICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0hBTEZXT1JEICAgICAgRE1BX0NDUl9QU0laRV8wICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgRE1BX1BEQVRBQUxJR05fV09SRCAgICAgICAgICBETUFfQ0NSX1BTSVpFXzEgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTWVtb3J5X2RhdGFfc2l6ZSBETUEgTWVtb3J5IGRhdGEgc2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQV9NREFUQUFMSUdOX0JZVEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgIERNQV9DQ1JfTVNJWkVfMCAgIC8qITwgTWVtb3J5IGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgRE1BX01EQVRBQUxJR05fV09SRCAgICAgICAgICBETUFfQ0NSX01TSVpFXzEgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9tb2RlIERNQSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX05PUk1BTCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE5vcm1hbCBtb2RlICAgICovCisjZGVmaW5lIERNQV9DSVJDVUxBUiAgICAgICAgICAgICAgICAgRE1BX0NDUl9DSVJDICAgICAgLyohPCBDaXJjdWxhciBtb2RlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUHJpb3JpdHlfbGV2ZWwgRE1BIFByaW9yaXR5IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX0xPVyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTG93ICAgICAgICovCisjZGVmaW5lIERNQV9QUklPUklUWV9NRURJVU0gICAgICAgICAgRE1BX0NDUl9QTF8wICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IE1lZGl1bSAgICAqLworI2RlZmluZSBETUFfUFJJT1JJVFlfSElHSCAgICAgICAgICAgIERNQV9DQ1JfUExfMSAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBIaWdoICAgICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX1ZFUllfSElHSCAgICAgICBETUFfQ0NSX1BMICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogVmVyeV9IaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9pbnRlcnJ1cHRfZW5hYmxlX2RlZmluaXRpb25zIERNQSBpbnRlcnJ1cHQgZW5hYmxlIGRlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX0lUX1RDICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RDSUUKKyNkZWZpbmUgRE1BX0lUX0hUICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0hUSUUKKyNkZWZpbmUgRE1BX0lUX1RFICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX2ZsYWdfZGVmaW5pdGlvbnMgRE1BIGZsYWcgZGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworCisjZGVmaW5lIERNQV9GTEFHX0dJMSAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYxCisjZGVmaW5lIERNQV9GTEFHX1RDMSAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMQorI2RlZmluZSBETUFfRkxBR19IVDEgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjEKKyNkZWZpbmUgRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYxCisjZGVmaW5lIERNQV9GTEFHX0dJMiAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYyCisjZGVmaW5lIERNQV9GTEFHX1RDMiAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMgorI2RlZmluZSBETUFfRkxBR19IVDIgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjIKKyNkZWZpbmUgRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYyCisjZGVmaW5lIERNQV9GTEFHX0dJMyAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYzCisjZGVmaW5lIERNQV9GTEFHX1RDMyAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMworI2RlZmluZSBETUFfRkxBR19IVDMgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjMKKyNkZWZpbmUgRE1BX0ZMQUdfVEUzICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYzCisjZGVmaW5lIERNQV9GTEFHX0dJNCAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY0CisjZGVmaW5lIERNQV9GTEFHX1RDNCAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNAorI2RlZmluZSBETUFfRkxBR19IVDQgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjQKKyNkZWZpbmUgRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY0CisjZGVmaW5lIERNQV9GTEFHX0dJNSAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY1CisjZGVmaW5lIERNQV9GTEFHX1RDNSAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNQorI2RlZmluZSBETUFfRkxBR19IVDUgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjUKKyNkZWZpbmUgRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY1CisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNikKKyNkZWZpbmUgRE1BX0ZMQUdfR0k2ICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjYKKyNkZWZpbmUgRE1BX0ZMQUdfVEM2ICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY2CisjZGVmaW5lIERNQV9GTEFHX0hUNiAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNgorI2RlZmluZSBETUFfRkxBR19URTYgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjYKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw2ICovCisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgRE1BX0ZMQUdfR0k3ICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjcKKyNkZWZpbmUgRE1BX0ZMQUdfVEM3ICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY3CisjZGVmaW5lIERNQV9GTEFHX0hUNyAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNworI2RlZmluZSBETUFfRkxBR19URTcgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjcKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBETUEgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgfD0gIERNQV9DQ1JfRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmPSAgfkRNQV9DQ1JfRU4pCisKKy8qIEludGVycnVwdCAmIEZsYWcgbWFuYWdlbWVudCAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIFRoZSBzcGVjaWZpZWQgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBpbmRleC4KKyAgKi8KKworI2lmIGRlZmluZWQgKERNQTFfQ2hhbm5lbDcpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfVENfRkxBR19JTkRFWChfX0hBTkRMRV9fKSBcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RDMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19UQzIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEMzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RDNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19UQzUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEM2IDpcCisgICBETUFfRkxBR19UQzcpCisjZWxpZiBkZWZpbmVkIChETUExX0NoYW5uZWw1KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RDX0ZMQUdfSU5ERVgoX19IQU5ETEVfXykgXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19UQzEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEMyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RDMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19UQzQgOlwKKyAgIERNQV9GTEFHX1RDNSkKKyNlbmRpZiAvKiBETUExX0NoYW5uZWw3ICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyBpbmRleC4KKyAgKi8KKyNpZiBkZWZpbmVkIChETUExX0NoYW5uZWw3KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX0hUX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX0hUMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19IVDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfSFQzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX0hUNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19IVDUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfSFQ2IDpcCisgICBETUFfRkxBR19IVDcpCisjZWxpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDUpCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfSFRfRkxBR19JTkRFWChfX0hBTkRMRV9fKVwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfSFQxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSk/IERNQV9GTEFHX0hUMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19IVDMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfSFQ0IDpcCisgICBETUFfRkxBR19IVDUpCisjZW5kaWYgLyogRE1BMV9DaGFubmVsNyAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGVycm9yIGZsYWcgaW5kZXguCisgICovCisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9URV9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19URTEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEUyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX1RFMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19URTQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfVEU1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9GTEFHX1RFNiA6XAorICAgRE1BX0ZMQUdfVEU3KQorI2VsaWYgZGVmaW5lZChETUExX0NoYW5uZWw1KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RFMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19URTIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEUzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RFNCA6XAorICAgRE1BX0ZMQUdfVEU1KQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgR2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBUaGUgc3BlY2lmaWVkIHRyYW5zZmVyIGVycm9yIGZsYWcgaW5kZXguCisgICovCisjaWYgZGVmaW5lZCAoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9HSV9GTEFHX0lOREVYKF9fSEFORExFX18pXAorKCgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpPyBETUFfRkxBR19HSTEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfR0kyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX0dJMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpPyBETUFfRkxBR19HSTQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfR0k1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9GTEFHX0dJNiA6XAorICAgRE1BX0lTUl9HSUY3KQorI2VsaWYgZGVmaW5lZChETUExX0NoYW5uZWw1KQorI2RlZmluZSBfX0hBTF9ETUFfR0VUX0dJX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX0dJMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19HSTIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfR0kzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX0dJNCA6XAorICAgRE1BX0lTUl9HSUY1KQorI2VuZGlmIC8qIERNQTFfQ2hhbm5lbDcgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIEdldCB0aGUgc3BlY2lmaWVkIGZsYWcuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVENJRng6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUSUZ4OiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX1RFSUZ4OiAgVHJhbnNmZXIgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19HSUZ4OiBHbG9iYWwgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgIFdoZXJlIHggY2FuIGJlIDFfNyB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsIGZsYWcuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgKERNQTEtPklTUiAmIChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ0lGeDogIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfSFRJRng6ICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0ZMQUdfVEVJRng6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0dJRng6IEdsb2JhbCBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgMV83IHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIChETUExLT5JRkNSIHw9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9UQzogIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RFOiAgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0IG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBETUEgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEM6ICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfSFQ6ICBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBtYXNrCisgICogICAgICAgICAgICBAYXJnIERNQV9JVF9URTogIFRyYW5zZmVyIGVycm9yIGludGVycnVwdCBtYXNrCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRE1BX0lUIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IgJiAoX19JTlRFUlJVUFRfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2Zlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2Zlci4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9DT1VOVEVSKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTkRUUikKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBETUEgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RtYV9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZiBDb21wbGV0ZUxldmVsLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgSEFMX0RNQV9JUlFIYW5kbGVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCB2b2lkICgqIHBDYWxsYmFjaykoRE1BX0hhbmRsZVR5cGVEZWYgKl9oZG1hKSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1VuUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfRE1BX1N0YXRlVHlwZURlZiBIQUxfRE1BX0dldFN0YXRlKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9ETUFfR2V0RXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfTWFjcm9zIERNQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfRE1BX0RJUkVDVElPTihESVJFQ1RJT04pICgoKERJUkVDVElPTikgPT0gRE1BX1BFUklQSF9UT19NRU1PUlkgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElSRUNUSU9OKSA9PSBETUFfTUVNT1JZX1RPX01FTU9SWSkpCisKKyNkZWZpbmUgSVNfRE1BX0JVRkZFUl9TSVpFKFNJWkUpICgoKFNJWkUpID49IDB4MVUpICYmICgoU0laRSkgPCAweDEwMDAwVSkpCisKKyNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRE1BX1BJTkNfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IERNQV9QSU5DX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gRE1BX01JTkNfRU5BQkxFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IERNQV9NSU5DX0RJU0FCTEUpKQorCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCl8fGRlZmluZWQoU1RNMzJHMDcxeHgpfHxkZWZpbmVkKFNUTTMyRzA3MHh4KQorI2RlZmluZSBJU19ETUFfQUxMX1JFUVVFU1QoUkVRVUVTVCkgKChSRVFVRVNUKSA8PSBETUFfUkVRVUVTVF9VQ1BEMl9UWCkKKyNlbGlmIGRlZmluZWQoU1RNMzJHMDQxeHgpfHxkZWZpbmVkKFNUTTMyRzAzMXh4KXx8ZGVmaW5lZChTVE0zMkcwMzB4eCkKKyNkZWZpbmUgSVNfRE1BX0FMTF9SRVFVRVNUKFJFUVVFU1QpICgoUkVRVUVTVCkgPD0gRE1BX1JFUVVFU1RfVVNBUlQyX1RYKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKFNJWkUpICgoKFNJWkUpID09IERNQV9QREFUQUFMSUdOX0JZVEUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBETUFfUERBVEFBTElHTl9IQUxGV09SRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fQllURSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fV09SRCApKQorCisjZGVmaW5lIElTX0RNQV9NT0RFKE1PREUpICgoKE1PREUpID09IERNQV9OT1JNQUwgKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBETUFfQ0lSQ1VMQVIpKQorCisjZGVmaW5lIElTX0RNQV9QUklPUklUWShQUklPUklUWSkgKCgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9MT1cgKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX01FRElVTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSSU9SSVRZKSA9PSBETUFfUFJJT1JJVFlfSElHSCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9WRVJZX0hJR0gpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZG1hX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9kbWFfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQyNzJkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfZG1hX2V4LmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2RtYV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUEgSEFMIGV4dGVuc2lvbiBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0RNQV9FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfRE1BX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX1R5cGVzIERNQUV4IEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIQUwgRE1BIFN5bmNocm8gZGVmaW5pdGlvbgorICAqLworCisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQU1VWCBTeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU3luY1NpZ25hbElEOyAgLyohPCBTcGVjaWZpZXMgdGhlIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZ2F0aW5nIHRoZSBETUEgcmVxdWVzdCBpbiBwZXJpb2RpYyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFFeF9ETUFNVVhfU3luY1NpZ25hbElEX3NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFN5bmNQb2xhcml0eTsgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2xhcml0eSBvZiB0aGUgc2lnbmFsIG9uIHdoaWNoIHRoZSBETUEgcmVxdWVzdCBpcyBzeW5jaHJvbml6ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQUV4X0RNQU1VWF9TeW5jUG9sYXJpdHlfc2VsZWN0aW9uICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIFN5bmNFbmFibGU7ICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgc3luY2hyb25pemF0aW9uIHNoYWxsIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiB0YWtlIHRoZSB2YWx1ZSBFTkFCTEUgb3IgRElTQUJMRSovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEV2ZW50RW5hYmxlOyAgICAvKiE8IFNwZWNpZmllcyBpZiBhbiBldmVudCBzaGFsbCBiZSBnZW5lcmF0ZWQgb25jZSB0aGUgUmVxdWVzdE51bWJlciBpcyByZWFjaGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIHRha2UgdGhlIHZhbHVlIEVOQUJMRSBvciBESVNBQkxFICovCisKKyAgdWludDMyX3QgUmVxdWVzdE51bWJlcjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0aG9yaXplZCBhZnRlciBhIHN5bmMgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyICovCisKKworfSBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmOworCisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTaWduYWxJRDsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSUQgb2YgdGhlIHNpZ25hbCB1c2VkIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BRXhfRE1BTVVYX1NpZ25hbEdlbmVyYXRvcklEX3NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFBvbGFyaXR5OyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUgcmVxdWVzdCBpcyBnZW5lcmF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BRXhfRE1BTVVYX1JlcXVlc3RHZW5lbmVyYXRvclBvbGFyaXR5X3NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFJlcXVlc3ROdW1iZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgYWZ0ZXIgYSBzaWduYWwgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMiAqLworCit9IEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0NvbnN0YW50cyBETUFFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TeW5jU2lnbmFsSURfc2VsZWN0aW9uIERNQU1VWCBTeW5jU2lnbmFsSUQgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMCAgICAgICAgICAgICAgICAgICAgICAwVSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMCAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxICAgICAgICAgICAgICAgICAgICAgIDFVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTIgICAgICAgICAgICAgICAgICAgICAgMlUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTIgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMyAgICAgICAgICAgICAgICAgICAgICAzVSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMyAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk0ICAgICAgICAgICAgICAgICAgICAgIDRVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk0ICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTUgICAgICAgICAgICAgICAgICAgICAgNVUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTUgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJNiAgICAgICAgICAgICAgICAgICAgICA2VSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNiAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk3ICAgICAgICAgICAgICAgICAgICAgIDdVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk3ICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTggICAgICAgICAgICAgICAgICAgICAgOFUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTggIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJOSAgICAgICAgICAgICAgICAgICAgICA5VSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJOSAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMCAgICAgICAgICAgICAgICAgICAgMTBVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTExICAgICAgICAgICAgICAgICAgICAxMVUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTExIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTIgICAgICAgICAgICAgICAgICAgIDEyVSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTIgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMyAgICAgICAgICAgICAgICAgICAgMTNVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMyBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTE0ICAgICAgICAgICAgICAgICAgICAxNFUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTE0IElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTUgICAgICAgICAgICAgICAgICAgIDE1VSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTUgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gwX0VWVCAgICAgICAgICAgMTZVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDAgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRE1BTVVYMV9DSDFfRVZUICAgICAgICAgICAxN1UgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMSBFdmVudCAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19ETUFNVVgxX0NIMl9FVlQgICAgICAgICAgIDE4VSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwyIEV2ZW50ICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gzX0VWVCAgICAgICAgICAgMTlVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDMgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfTFBUSU0xX09VVCAgICAgICAgICAgICAgICAyMFUgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgTFBUSU0xIE9VVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0xQVElNMl9PVVQgICAgICAgICAgICAgICAgMjFVICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIExQVElNMiBPVVQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19USU0xNF9PQyAgICAgICAgICAgICAgICAgIDIyVSAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBUSU0xNCBPQyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TeW5jUG9sYXJpdHlfc2VsZWN0aW9uIERNQU1VWCBTeW5jUG9sYXJpdHkgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9TWU5DX05PX0VWRU5UICAgICAgICAgICAgICAgICAgIDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGJsb2NrIHN5bmNocm9uaXphdGlvbiBldmVudHMgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVhfU1lOQ19SSVNJTkcgICAgICAgICAgICAgICAgICAgICBETUFNVVhfQ3hDUl9TUE9MXzAgICAgICAgICAgLyohPCBzeW5jaHJvbml6ZSB3aXRoIHJpc2luZyBlZGdlIGV2ZW50cyAqLworI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfRkFMTElORyAgICAgICAgICAgICAgICAgICAgRE1BTVVYX0N4Q1JfU1BPTF8xICAgICAgICAgIC8qITwgc3luY2hyb25pemUgd2l0aCBmYWxsaW5nIGVkZ2UgZXZlbnRzICovCisjZGVmaW5lIEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORyAgICAgICAgICAgICBETUFNVVhfQ3hDUl9TUE9MICAgICAgICAgICAgLyohPCBzeW5jaHJvbml6ZSB3aXRoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIGV2ZW50cyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0RNQU1VWF9TaWduYWxHZW5lcmF0b3JJRF9zZWxlY3Rpb24gRE1BTVVYIFNpZ25hbEdlbmVyYXRvcklEIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTAgICAgICAgICAgICAgICAwVSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTAgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMSAgICAgICAgICAgICAgIDFVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMSBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkyICAgICAgICAgICAgICAgMlUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkyIElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTMgICAgICAgICAgICAgICAzVSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTMgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNCAgICAgICAgICAgICAgIDRVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNCBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk1ICAgICAgICAgICAgICAgNVUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEk1IElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTYgICAgICAgICAgICAgICA2VSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTYgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNyAgICAgICAgICAgICAgIDdVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNyBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk4ICAgICAgICAgICAgICAgOFUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEk4IElUICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTkgICAgICAgICAgICAgICA5VSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTkgSVQgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTAgICAgICAgICAgICAgMTBVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMSAgICAgICAgICAgICAxMVUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxMSBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEyICAgICAgICAgICAgIDEyVSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTEyIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTMgICAgICAgICAgICAgMTNVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTMgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNCAgICAgICAgICAgICAxNFUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIEVYVEkxNCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTE1ICAgICAgICAgICAgIDE1VSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRVhUSTE1IElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMF9FVlQgICAgMTZVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwwIEV2ZW50ICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUICAgIDE3VSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMSBFdmVudCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVCAgICAxOFUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDIgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUICAgIDE5VSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgRE1BTVVYMSBDaGFubmVsMyBFdmVudCAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUICAgICAgICAgMjBVICAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBMUFRJTTEgT1VUICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVCAgICAgICAgIDIxVSAgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgTFBUSU0yIE9VVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX1RJTTE0X09DICAgICAgICAgICAyMlUgICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIFRJTTE0IE9DICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXhfRE1BTVVYX1JlcXVlc3RHZW5lbmVyYXRvclBvbGFyaXR5X3NlbGVjdGlvbiBETUFNVVggUmVxdWVzdEdlbmVuZXJhdG9yUG9sYXJpdHkgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UICAgICAgICAgICAgMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgYmxvY2sgcmVxdWVzdCBnZW5lcmF0b3IgZXZlbnRzICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR1BPTF8wICAgICAgICAgLyohPCBnZW5lcmF0ZSByZXF1ZXN0IG9uIHJpc2luZyBlZGdlIGV2ZW50cyAqLworI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fRkFMTElORyAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfR1BPTF8xICAgICAgICAgLyohPCBnZW5lcmF0ZSByZXF1ZXN0IG9uIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HICAgICAgRE1BTVVYX1JHeENSX0dQT0wgICAgICAgICAgIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJFUVVFU1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0NvbmZpZ011eFJlcXVlc3RHZW5lcmF0b3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfRE1BX011eFJlcXVlc3RHZW5lcmF0b3JDb25maWdUeXBlRGVmICpwUmVxdWVzdEdlbmVyYXRvckNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRGlzYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTWU5DSFJPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9Db25maWdNdXhTeW5jKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmICpwU3luY0NvbmZpZyk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICAgICAgICAgICAgICBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQUV4X1ByaXZhdGVfTWFjcm9zIERNQUV4IFByaXZhdGUgTWFjcm9zCisgICogQGJyaWVmICAgIERNQUV4IHByaXZhdGUgbWFjcm9zCisgKiBAeworICovCisKKyNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfU0lHTkFMX0lEKFNJR05BTF9JRCkgKChTSUdOQUxfSUQpIDw9IEhBTF9ETUFNVVgxX1NZTkNfVElNMTRfT0MpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfUkVRVUVTVF9OVU1CRVIoUkVRVUVTVF9OVU1CRVIpICgoKFJFUVVFU1RfTlVNQkVSKSA+IDBVKSAmJiAoKFJFUVVFU1RfTlVNQkVSKSA8PSAzMlUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX05PX0VWRU5UKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX1JJU0lORykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX0ZBTExJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX1JJU0lOR19GQUxMSU5HKSkKKworI2RlZmluZSBJU19ETUFNVVhfU1lOQ19TVEFURShTWU5DKSAoKChTWU5DKSA9PSBESVNBQkxFKSAgIHx8ICgoU1lOQykgPT0gRU5BQkxFKSkKKworI2RlZmluZSBJU19ETUFNVVhfU1lOQ19FVkVOVChFVkVOVCkgKCgoRVZFTlQpID09IERJU0FCTEUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVZFTlQpID09IEVOQUJMRSkpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1NJR05BTF9JRChTSUdOQUxfSUQpICgoU0lHTkFMX0lEKSA8PSBIQUxfRE1BTVVYMV9SRVFfR0VOX1RJTTE0X09DKQorCisjZGVmaW5lIElTX0RNQU1VWF9SRVFVRVNUX0dFTl9SRVFVRVNUX05VTUJFUihSRVFVRVNUX05VTUJFUikgKCgoUkVRVUVTVF9OVU1CRVIpID4gMFUpICYmICgoUkVRVUVTVF9OVU1CRVIpIDw9IDMyVSkpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX0ZBTExJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZXh0aS5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfZXh0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMmE1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9leHRpLmgKQEAgLTAsMCArMSwzNDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2V4dGkuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRVhUSSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfRVhUSV9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfRVhUSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVEkgRVhUSQorICAqIEBicmllZiBFWFRJIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX1R5cGVzIEVYVEkgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9FWFRJX0NPTU1PTl9DQl9JRCAgICAgICAgICA9IDB4MDBVLAorICBIQUxfRVhUSV9SSVNJTkdfQ0JfSUQgICAgICAgICAgPSAweDAxVSwKKyAgSEFMX0VYVElfRkFMTElOR19DQl9JRCAgICAgICAgID0gMHgwMlUsCit9IEVYVElfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKworLyoqCisgICogQGJyaWVmICBFWFRJIEhhbmRsZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTGluZTsgICAgICAgICAgICAgICAgICAgIC8qITwgIEV4dGkgbGluZSBudW1iZXIgKi8KKyAgdm9pZCAoKiBSaXNpbmdDYWxsYmFjaykodm9pZCk7ICAgIC8qITwgIEV4dGkgcmlzaW5nIGNhbGxiYWNrICovCisgIHZvaWQgKCogRmFsbGluZ0NhbGxiYWNrKSh2b2lkKTsgICAvKiE8ICBFeHRpIGZhbGxpbmcgY2FsbGJhY2sgKi8KK30gRVhUSV9IYW5kbGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTGluZTsgICAgICAvKiE8IFRoZSBFeHRpIGxpbmUgdG8gYmUgY29uZmlndXJlZC4gVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MaW5lICovCisgIHVpbnQzMl90IE1vZGU7ICAgICAgLyohPCBUaGUgRXhpdCBNb2RlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9Nb2RlICovCisgIHVpbnQzMl90IFRyaWdnZXI7ICAgLyohPCBUaGUgRXh0aSBUcmlnZ2VyIHRvIGJlIGNvbmZpZ3VyZWQuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfVHJpZ2dlciAqLworICB1aW50MzJfdCBHUElPU2VsOyAgIC8qITwgVGhlIEV4dGkgR1BJTyBtdWx0aXBsZXhlciBzZWxlY3Rpb24gdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgcG9zc2libGUgZm9yIGxpbmUgMCB0byAxNS4gSXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9HUElPU2VsICovCit9IEVYVElfQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9Db25zdGFudHMgRVhUSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTGluZSAgRVhUSSBMaW5lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDAwdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDAxdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzIgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDAydSkKKyNkZWZpbmUgRVhUSV9MSU5FXzMgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDAzdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA0dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzUgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA1dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzYgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA2dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzcgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA3dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzggICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA4dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzkgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDA5dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEwICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBBdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzExICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBCdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEyICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBDdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzEzICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBEdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE0ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBFdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE1ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX1JFRzEgfCAweDBGdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE2ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgfCBFWFRJX1JFRzEgfCAweDEwdSkKKyNpZiBkZWZpbmVkKENPTVAxKQorI2RlZmluZSBFWFRJX0xJTkVfMTcgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICB8IEVYVElfUkVHMSB8IDB4MTF1KQorI2Vsc2UKKyNkZWZpbmUgRVhUSV9MSU5FXzE3ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCBFWFRJX1JFRzEgfCAweDExdSkKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIEVYVElfTElORV8xOCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgIHwgRVhUSV9SRUcxIHwgMHgxMnUpCisjZWxzZQorI2RlZmluZSBFWFRJX0xJTkVfMTggICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9SRVNFUlZFRCB8IEVYVElfUkVHMSB8IDB4MTJ1KQorI2VuZGlmCisjZGVmaW5lIEVYVElfTElORV8xOSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgRVhUSV9SRUcxIHwgMHgxM3UpCisjZGVmaW5lIEVYVElfTElORV8yMCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxNHUpCisjZGVmaW5lIEVYVElfTElORV8yMSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgRVhUSV9SRUcxIHwgMHgxNXUpCisjZGVmaW5lIEVYVElfTElORV8yMiAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxNnUpCisjZGVmaW5lIEVYVElfTElORV8yMyAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgRVhUSV9SRUcxIHwgMHgxN3UpCisjZGVmaW5lIEVYVElfTElORV8yNCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxOHUpCisjZGVmaW5lIEVYVElfTElORV8yNSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgRVhUSV9SRUcxIHwgMHgxOXUpCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorI2RlZmluZSBFWFRJX0xJTkVfMjYgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8IEVYVElfUkVHMSB8IDB4MUF1KQorI2Vsc2UKKyNkZWZpbmUgRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCBFWFRJX1JFRzEgfCAweDFBdSkKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBFWFRJX0xJTkVfMjcgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8IEVYVElfUkVHMSB8IDB4MUJ1KQorI2Vsc2UKKyNkZWZpbmUgRVhUSV9MSU5FXzI3ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCBFWFRJX1JFRzEgfCAweDFCdSkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI4ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCBFWFRJX1JFRzEgfCAweDFDdSkKKyNlbHNlCisjZGVmaW5lIEVYVElfTElORV8yOCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxQ3UpCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCBFWFRJX1JFRzEgfCAweDFEdSkKKyNlbHNlCisjZGVmaW5lIEVYVElfTElORV8yOSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxRHUpCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMikKKyNkZWZpbmUgRVhUSV9MSU5FXzMwICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCBFWFRJX1JFRzEgfCAweDFFdSkKKyNlbHNlCisjZGVmaW5lIEVYVElfTElORV8zMCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgRVhUSV9SRUcxIHwgMHgxRXUpCisjZW5kaWYKKyNkZWZpbmUgRVhUSV9MSU5FXzMxICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCBFWFRJX1JFRzEgfCAweDFGdSkKKyNpZiBkZWZpbmVkKFVDUEQxKQorI2RlZmluZSBFWFRJX0xJTkVfMzIgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8IEVYVElfUkVHMiB8IDB4MDB1KQorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMikKKyNkZWZpbmUgRVhUSV9MSU5FXzMzICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCBFWFRJX1JFRzIgfCAweDAxdSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX01vZGUgIEVYVEkgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEVYVElfTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1CisjZGVmaW5lIEVYVElfTU9ERV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDF1CisjZGVmaW5lIEVYVElfTU9ERV9FVkVOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJ1CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfVHJpZ2dlciAgRVhUSSBUcmlnZ2VyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRVhUSV9UUklHR0VSX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lORyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMXUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX0ZBTExJTkcgICAgICAgICAgICAgICAgMHgwMDAwMDAwMnUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HICAgICAgICAgKEVYVElfVFJJR0dFUl9SSVNJTkcgfCBFWFRJX1RSSUdHRVJfRkFMTElORykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9HUElPU2VsICBFWFRJIEdQSU9TZWwKKyAgKiBAYnJpZWYKKyAgKiBAeworICAqLworI2RlZmluZSBFWFRJX0dQSU9BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBFWFRJX0dQSU9CICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxdQorI2RlZmluZSBFWFRJX0dQSU9DICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAydQorI2RlZmluZSBFWFRJX0dQSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzdQorI2RlZmluZSBFWFRJX0dQSU9GICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1dQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9Db25zdGFudHMgRVhUSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTGluZSBwcm9wZXJ0eSBkZWZpbml0aW9uCisgICovCisjZGVmaW5lIEVYVElfUFJPUEVSVFlfU0hJRlQgICAgICAgICAgICAgICAgICAyNHUKKyNkZWZpbmUgRVhUSV9ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDF1TCA8PCBFWFRJX1BST1BFUlRZX1NISUZUKQorI2RlZmluZSBFWFRJX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMnVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpCisjZGVmaW5lIEVYVElfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwNHVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpIHwgRVhUSV9DT05GSUcpCisjZGVmaW5lIEVYVElfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICgweDA4dUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkKKyNkZWZpbmUgRVhUSV9QUk9QRVJUWV9NQVNLICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUIHwgRVhUSV9DT05GSUcgfCBFWFRJX0dQSU8pCisKKy8qKgorICAqIEBicmllZiAgRVhUSSBSZWdpc3RlciBhbmQgYml0IHVzYWdlCisgICovCisjZGVmaW5lIEVYVElfUkVHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2dQorI2RlZmluZSBFWFRJX1JFRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMHVMIDw8IEVYVElfUkVHX1NISUZUKQorI2RlZmluZSBFWFRJX1JFRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMXVMIDw8IEVYVElfUkVHX1NISUZUKQorI2RlZmluZSBFWFRJX1JFR19NQVNLICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9SRUcxIHwgRVhUSV9SRUcyKQorI2RlZmluZSBFWFRJX1BJTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFGdQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTWFzayBmb3IgaW50ZXJydXB0ICYgZXZlbnQgbW9kZQorICAqLworI2RlZmluZSBFWFRJX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9NT0RFX0VWRU5UIHwgRVhUSV9NT0RFX0lOVEVSUlVQVCkKKworLyoqCisgICogQGJyaWVmICBFWFRJIE1hc2sgZm9yIHRyaWdnZXIgcG9zc2liaWxpdGllcworICAqLworI2RlZmluZSBFWFRJX1RSSUdHRVJfTUFTSyAgICAgICAgICAgICAgICAgICAoRVhUSV9UUklHR0VSX1JJU0lORyB8IEVYVElfVFJJR0dFUl9GQUxMSU5HKQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTGluZSBudW1iZXIKKyAgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTMzKQorI2RlZmluZSBFWFRJX0xJTkVfTkIgICAgICAgICAgICAgICAgICAgICAgICAzNHVMCisjZWxzZQorI2RlZmluZSBFWFRJX0xJTkVfTkIgICAgICAgICAgICAgICAgICAgICAgICAzMnVMCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX01hY3JvcyBFWFRJIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfRVhUSV9MSU5FKF9fTElORV9fKSAgICAgICAgICAoKCgoX19MSU5FX18pICYgfihFWFRJX1BST1BFUlRZX01BU0sgfCBFWFRJX1JFR19NQVNLIHwgRVhUSV9QSU5fTUFTSykpID09IDB4MDB1KSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fTElORV9fKSAmIEVYVElfUFJPUEVSVFlfTUFTSykgPT0gRVhUSV9ESVJFQ1QpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0xJTkVfXykgJiBFWFRJX1BST1BFUlRZX01BU0spID09IEVYVElfQ09ORklHKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19MSU5FX18pICYgRVhUSV9QUk9QRVJUWV9NQVNLKSA9PSBFWFRJX0dQSU8pKSAgICAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fTElORV9fKSAmIChFWFRJX1JFR19NQVNLIHwgRVhUSV9QSU5fTUFTSykpICAgICAgPCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKEVYVElfTElORV9OQiAvIDMydSkgPDwgRVhUSV9SRUdfU0hJRlQpIHwgKEVYVElfTElORV9OQiAlIDMydSkpKSkKKworI2RlZmluZSBJU19FWFRJX01PREUoX19MSU5FX18pICAgICAgICAgICgoKChfX0xJTkVfXykgJiBFWFRJX01PREVfTUFTSykgIT0gMHgwMHUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19MSU5FX18pICYgfkVYVElfTU9ERV9NQVNLKSA9PSAweDAwdSkpCisKKyNkZWZpbmUgSVNfRVhUSV9UUklHR0VSKF9fTElORV9fKSAgICAgICAoKChfX0xJTkVfXykgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDB1KQorCisjZGVmaW5lIElTX0VYVElfUEVORElOR19FREdFKF9fTElORV9fKSAgKCgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9SSVNJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xJTkVfXykgPT0gRVhUSV9UUklHR0VSX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0VYVElfQ09ORklHX0xJTkUoX19MSU5FX18pICAgKCgoX19MSU5FX18pICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQorCisjZGVmaW5lIElTX0VYVElfR1BJT19QT1JUKF9fUE9SVF9fKSAgICAgKCgoX19QT1JUX18pID09IEVYVElfR1BJT0EpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9DKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRikpCisKKyNkZWZpbmUgSVNfRVhUSV9HUElPX1BJTihfX1BJTl9fKSAgICAgICAoKF9fUElOX18pIDwgMTZ1KQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQGJyaWVmICAgIEVYVEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9HZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfQ2xlYXJDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfUmVnaXN0ZXJDYWxsYmFjayhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCBFWFRJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHZvaWQgKCpwUGVuZGluZ0NiZm4pKHZvaWQpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFeHRpTGluZSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9FWFRJX0lSUUhhbmRsZXIoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfRVhUSV9HZXRQZW5kaW5nKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIHVpbnQzMl90IEVkZ2UpOwordm9pZCAgICAgICAgICAgICAgSEFMX0VYVElfQ2xlYXJQZW5kaW5nKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIHVpbnQzMl90IEVkZ2UpOwordm9pZCAgICAgICAgICAgICAgSEFMX0VYVElfR2VuZXJhdGVTV0koRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0VYVElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZmxhc2guaCBiL0luYy9zdG0zMmcweHhfaGFsX2ZsYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5YjJlMgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2ZsYXNoLmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2ZsYXNoLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEZMQVNIIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9GTEFTSF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfRkxBU0hfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNICisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfVHlwZXMgRkxBU0ggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEZMQVNIIEVyYXNlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUeXBlRXJhc2U7ICAgLyohPCBNYXNzIGVyYXNlIG9yIHBhZ2UgZXJhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVHlwZV9FcmFzZSAqLworICB1aW50MzJfdCBQYWdlOyAgICAgICAgLyohPCBJbml0aWFsIEZsYXNoIHBhZ2UgdG8gZXJhc2Ugd2hlbiBwYWdlIGVyYXNlIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgKEZMQVNIX1BBR0VfTkIgLSAxKSAqLworICB1aW50MzJfdCBOYlBhZ2VzOyAgICAgLyohPCBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgZXJhc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAoRkxBU0hfUEFHRV9OQiAtIHZhbHVlIG9mIGluaXRpYWwgcGFnZSkqLworfSBGTEFTSF9FcmFzZUluaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEZMQVNIIE9wdGlvbiBCeXRlcyBQcm9ncmFtIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPcHRpb25UeXBlOyAgICAgICAgLyohPCBPcHRpb24gYnl0ZSB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgdmFsdWVzIG9mIEByZWYgRkxBU0hfT0JfVHlwZSAqLworICB1aW50MzJfdCBXUlBBcmVhOyAgICAgICAgICAgLyohPCBXcml0ZSBwcm90ZWN0aW9uIGFyZWEgdG8gYmUgcHJvZ3JhbW1lZCAodXNlZCBmb3IgT1BUSU9OQllURV9XUlApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IG9uZSBXUlAgYXJlYSBjb3VsZCBiZSBwcm9ncmFtbWVkIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB2YWx1ZSBvZiBAcmVmIEZMQVNIX09CX1dSUF9BcmVhICovCisgIHVpbnQzMl90IFdSUFN0YXJ0T2Zmc2V0OyAgICAvKiE8IFdyaXRlIHByb3RlY3Rpb24gc3RhcnQgb2Zmc2V0ICh1c2VkIGZvciBPUFRJT05CWVRFX1dSUCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIFtGTEFTSF9QQUdFX05CIC0gMV0qLworICB1aW50MzJfdCBXUlBFbmRPZmZzZXQ7ICAgICAgLyohPCBXcml0ZSBwcm90ZWN0aW9uIGVuZCBvZmZzZXQgKHVzZWQgZm9yIE9QVElPTkJZVEVfV1JQKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gV1JQU3RhcnRPZmZzZXQgYW5kIFtGTEFTSF9QQUdFX05CIC0gMV0gKi8KKyAgdWludDMyX3QgUkRQTGV2ZWw7ICAgICAgICAgIC8qITwgU2V0IHRoZSByZWFkIHByb3RlY3Rpb24gbGV2ZWwgKHVzZWQgZm9yIE9QVElPTkJZVEVfUkRQKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9PQl9SZWFkX1Byb3RlY3Rpb24gKi8KKyAgdWludDMyX3QgVVNFUlR5cGU7ICAgICAgICAgIC8qITwgVXNlciBvcHRpb24gYnl0ZShzKSB0byBiZSBjb25maWd1cmVkICh1c2VkIGZvciBPUFRJT05CWVRFX1VTRVIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEZMQVNIX09CX1VTRVJfVHlwZSAqLworICB1aW50MzJfdCBVU0VSQ29uZmlnOyAgICAgICAgLyohPCBWYWx1ZSBvZiB0aGUgdXNlciBvcHRpb24gYnl0ZSAodXNlZCBmb3IgT1BUSU9OQllURV9VU0VSKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0JPUl9FTkFCTEUoKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9CT1JfTEVWRUwoKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9SRVNFVF9DT05GSUcoKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NUQU5EQlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOKCopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RBTkRCWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX1dXREdfU1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9TUkFNX1BBUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UX1NFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lOUFVUX1JFU0VUX0hPTERFUigqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcyAqLworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKyAgdWludDMyX3QgUENST1BDb25maWc7ICAgICAgIC8qITwgQ29uZmlndXJhdGlvbiBvZiB0aGUgUENST1AgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBGTEFTSF9PQl9QQ1JPUF9aT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBAcmVmIEZMQVNIX09CX1BDUk9QX1JEUC4gTm90ZSB0aGF0IG9uY2Ugc2V0LCBQY3JvcCBlcmFzZSBvbiBSRFAgbGV2ZWwgMSByZWdyZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQQ1JPUF9SRFAgYml0KSBjYW4gbm90IGJlIHJlc2V0LiBJdCB3aWxsIGJlIHJlc2V0IGJ5IG1hc3MgZXJhc2UgKi8KKyAgdWludDMyX3QgUENST1AxQVN0YXJ0QWRkcjsgIC8qITwgUENST1AgU3RhcnQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuIEl0IHJlcHJlc2VudHMgZmlyc3QgYWRkcmVzcyBvZiBzdGFydCBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm90ZWN0LiBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgbXVsdGlwbGUgb2YgUENST1AgZ3JhbnVsYXJpdHk6IDUxMiBCeXRlcy4qLworICB1aW50MzJfdCBQQ1JPUDFBRW5kQWRkcjsgICAgLyohPCBQQ1JPUCBFbmQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuIEl0IHJlcHJlc2VudHMgZmlyc3QgYWRkcmVzcyBvZiBlbmQgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdGVjdC4gTWFrZSBzdXJlIHRoaXMgcGFyYW1ldGVyIGlzIG11bHRpcGxlIG9mIFBDUk9QIGdyYW51bGFyaXR5OiA1MTIgQnl0ZXMuKi8KKyAgdWludDMyX3QgUENST1AxQlN0YXJ0QWRkcjsgIC8qITwgUENST1AgU3RhcnQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuIEl0IHJlcHJlc2VudHMgZmlyc3QgYWRkcmVzcyBvZiBzdGFydCBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm90ZWN0LiBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgbXVsdGlwbGUgb2YgUENST1AgZ3JhbnVsYXJpdHk6IDUxMiBCeXRlcy4qLworICB1aW50MzJfdCBQQ1JPUDFCRW5kQWRkcjsgICAgLyohPCBQQ1JPUCBFbmQgYWRkcmVzcyAodXNlZCBmb3IgT1BUSU9OQllURV9QQ1JPUCkuIEl0IHJlcHJlc2VudHMgZmlyc3QgYWRkcmVzcyBvZiBlbmQgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdGVjdC4gTWFrZSBzdXJlIHRoaXMgcGFyYW1ldGVyIGlzIG11bHRpcGxlIG9mIFBDUk9QIGdyYW51bGFyaXR5OiA1MTIgQnl0ZXMuKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorICB1aW50MzJfdCBCb290RW50cnlQb2ludDsgICAgLyohPCBBbGxvdyB0byBmb3JjZSBhIHVuaXF1ZSBib290IGVudHJ5IHBvaW50IHRvIEZsYXNoIG9yIHN5c3RlbSBGbGFzaCAqLworICB1aW50MzJfdCBTZWNTaXplOyAgICAgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBkZWZpbmVzIHNlY3VyYWJsZSBtZW1vcnkgYXJlYSB3aWR0aCBpbiBudW1iZXIgb2YgcGFnZXMgc3RhcnRpbmcgZnJvbSBGbGFzaCBiYXNlIGFkZHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIFswXSBhbmQgW0ZMQVNIX1BBR0VfTkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0gbWVhbmluZyBubyBzZWN1cmUgYXJlYSBkZWZpbmVkLCBbMV0gbWVhbmluZyBmaXJzdCBwYWdlIG9ubHkgcHJvdGVjdGVkLCBldGMuLi4gKi8KKyNlbmRpZgorfSBGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZjsKKworLyoqCisqIEBicmllZiAgRkxBU0ggaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSEFMX0xvY2tUeXBlRGVmICAgTG9jazsgICAgICAgICAgICAgIC8qIEZMQVNIIGxvY2tpbmcgb2JqZWN0ICovCisgIHVpbnQzMl90ICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAvKiBGTEFTSCBlcnJvciBjb2RlICovCisgIHVpbnQzMl90ICAgICAgICAgIFByb2NlZHVyZU9uR29pbmc7ICAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9jZWR1cmUgaXMgb25nb2luZyBvciBub3QgaW4gSVQgY29udGV4dCAqLworICB1aW50MzJfdCAgICAgICAgICBBZGRyZXNzOyAgICAgICAgICAgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSBhZGRyZXNzIHNlbGVjdGVkIGZvciBwcm9ncmFtIGluIElUIGNvbnRleHQgKi8KKyAgdWludDMyX3QgICAgICAgICAgUGFnZTsgICAgICAgICAgICAgIC8qIEludGVybmFsIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY3VycmVudCBwYWdlIHdoaWNoIGlzIGVyYXNpbmcgaW4gSVQgY29udGV4dCAqLworICB1aW50MzJfdCAgICAgICAgICBOYlBhZ2VzVG9FcmFzZTsgICAgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSB0aGUgcmVtYWluaW5nIHBhZ2VzIHRvIGVyYXNlIGluIElUIGNvbnRleHQgKi8KK30gRkxBU0hfUHJvY2Vzc1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0NvbnN0YW50cyBGTEFTSCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBGTEFTSF9LZXlzIEZMQVNIIEtleXMKKyAgKiBAeworICAqLworI2RlZmluZSBGTEFTSF9LRVkxICAgICAgICAgICAgICAgICAgICAgIDB4NDU2NzAxMjNVICAgLyohPCBGbGFzaCBrZXkxICovCisjZGVmaW5lIEZMQVNIX0tFWTIgICAgICAgICAgICAgICAgICAgICAgMHhDREVGODlBQlUgICAvKiE8IEZsYXNoIGtleTI6IHVzZWQgd2l0aCBGTEFTSF9LRVkxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHVubG9jayB0aGUgRkxBU0ggcmVnaXN0ZXJzIGFjY2VzcyAqLworI2RlZmluZSBGTEFTSF9PUFRLRVkxICAgICAgICAgICAgICAgICAgIDB4MDgxOTJBM0JVICAgLyohPCBGbGFzaCBvcHRpb24gYnl0ZSBrZXkxICovCisjZGVmaW5lIEZMQVNIX09QVEtFWTIgICAgICAgICAgICAgICAgICAgMHg0QzVENkU3RlUgICAvKiE8IEZsYXNoIG9wdGlvbiBieXRlIGtleTI6IHVzZWQgd2l0aCBGTEFTSF9PUFRLRVkxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbG93IG9wdGlvbiBieXRlcyBvcGVyYXRpb25zICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0xhdGVuY3kgRkxBU0ggTGF0ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0xBVEVOQ1lfMCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZMQVNIIFplcm8gd2FpdCBzdGF0ZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzEgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGTEFTSCBPbmUgd2FpdCBzdGF0ZSAqLworI2RlZmluZSBGTEFTSF9MQVRFTkNZXzIgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGTEFTSCBUd28gd2FpdCBzdGF0ZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRmxhZ3MgRkxBU0ggRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgICAgICAgICAgRkxBU0hfU1JfRU9QICAgICAgLyohPCBGTEFTSCBFbmQgb2Ygb3BlcmF0aW9uIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19PUEVSUiAgICAgICAgICAgICAgICBGTEFTSF9TUl9PUEVSUiAgICAvKiE8IEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUFJPR0VSUiAgICAgICAgICAgICAgRkxBU0hfU1JfUFJPR0VSUiAgLyohPCBGTEFTSCBQcm9ncmFtbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfV1JQRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfV1JQRVJSICAgLyohPCBGTEFTSCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19QR0FFUlIgICAgICAgICAgICAgICBGTEFTSF9TUl9QR0FFUlIgICAvKiE8IEZMQVNIIFByb2dyYW1taW5nIGFsaWdubWVudCBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfU0laRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfU0laRVJSICAgLyohPCBGTEFTSCBTaXplIGVycm9yIGZsYWcgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUEdTRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfUEdTRVJSICAgLyohPCBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfTUlTRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfTUlTRVJSICAgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRkFTVEVSUiAgICAgICAgICAgICAgRkxBU0hfU1JfRkFTVEVSUiAgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGVycm9yIGZsYWcgKi8KKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisjZGVmaW5lIEZMQVNIX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgRkxBU0hfU1JfUkRFUlIgICAgLyohPCBGTEFTSCBQQ1JPUCByZWFkIGVycm9yIGZsYWcgKi8KKyNlbmRpZiAvKiBGTEFTSF9QQ1JPUF9TVVBQT1JUICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfT1BUVkVSUiAgICAgICAgICAgICAgRkxBU0hfU1JfT1BUVkVSUiAgLyohPCBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX0JTWSAgICAgICAgICAgICAgICAgIEZMQVNIX1NSX0JTWTEgICAgIC8qITwgRkxBU0ggT3BlcmF0aW9uIEJ1c3kgZmxhZyAqLworI2RlZmluZSBGTEFTSF9GTEFHX0NGR0JTWSAgICAgICAgICAgICAgIEZMQVNIX1NSX0NGR0JTWSAgIC8qITwgRkxBU0ggQ29uZmlndXJhdGlvbiBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19FQ0NDICAgICAgICAgICAgICAgICBGTEFTSF9FQ0NSX0VDQ0MgICAvKiE8IEZMQVNIIEVDQyBjb3JyZWN0aW9uICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRUNDRCAgICAgICAgICAgICAgICAgRkxBU0hfRUNDUl9FQ0NEICAgLyohPCBGTEFTSCBFQ0MgZGV0ZWN0aW9uICovCisKKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisjZGVmaW5lIEZMQVNIX0ZMQUdfQUxMX0VSUk9SUyAgICAgICAgICAgKEZMQVNIX0ZMQUdfT1BFUlIgICB8IEZMQVNIX0ZMQUdfUFJPR0VSUiB8IEZMQVNIX0ZMQUdfV1JQRVJSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX1BHQUVSUiAgfCBGTEFTSF9GTEFHX1NJWkVSUiAgfCBGTEFTSF9GTEFHX1BHU0VSUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19NSVNFUlIgIHwgRkxBU0hfRkxBR19GQVNURVJSIHwgRkxBU0hfRkxBR19SREVSUiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfT1BUVkVSUiB8IEZMQVNIX0ZMQUdfRUNDQyAgICB8IEZMQVNIX0ZMQUdfRUNDRCkKKyNlbHNlCisjZGVmaW5lIEZMQVNIX0ZMQUdfQUxMX0VSUk9SUyAgICAgICAgICAgKEZMQVNIX0ZMQUdfT1BFUlIgICB8IEZMQVNIX0ZMQUdfUFJPR0VSUiB8IEZMQVNIX0ZMQUdfV1JQRVJSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX1BHQUVSUiAgfCBGTEFTSF9GTEFHX1NJWkVSUiAgfCBGTEFTSF9GTEFHX1BHU0VSUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19NSVNFUlIgIHwgRkxBU0hfRkxBR19GQVNURVJSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX09QVFZFUlIgfCBGTEFTSF9GTEFHX0VDQ0MgICAgfCBGTEFTSF9GTEFHX0VDQ0QpCisKKyNlbmRpZiAvKiBGTEFTSF9QQ1JPUF9TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0ludGVycnVwdF9kZWZpbml0aW9uIEZMQVNIIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEBicmllZiBGTEFTSCBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0lUX0VPUCAgICAgICAgICAgICAgICAgICAgRkxBU0hfQ1JfRU9QSUUgICAgICAgICAgICAgIC8qITwgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEZMQVNIX0lUX09QRVJSICAgICAgICAgICAgICAgICAgRkxBU0hfQ1JfRVJSSUUgICAgICAgICAgICAgIC8qITwgRXJyb3IgSW50ZXJydXB0IHNvdXJjZSAqLworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKyNkZWZpbmUgRkxBU0hfSVRfUkRFUlIgICAgICAgICAgICAgICAgICBGTEFTSF9DUl9SREVSUklFICAgICAgICAgICAgLyohPCBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdCBzb3VyY2UqLworI2VuZGlmCisjZGVmaW5lIEZMQVNIX0lUX0VDQ0MgICAgICAgICAgICAgICAgICAgKEZMQVNIX0VDQ1JfRUNDQ0lFID4+IEZMQVNIX0VDQ1JfRUNDQ0lFX1BvcykgICAvKiE8IEVDQyBDb3JyZWN0aW9uIEludGVycnVwdCBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXJyb3IgRkxBU0ggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfTk9ORSAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9PUCAgICAgICAgICAgICAgRkxBU0hfRkxBR19PUEVSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfUFJPRyAgICAgICAgICAgIEZMQVNIX0ZMQUdfUFJPR0VSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfV1JQICAgICAgICAgICAgIEZMQVNIX0ZMQUdfV1JQRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9QR0EgICAgICAgICAgICAgRkxBU0hfRkxBR19QR0FFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1NJWiAgICAgICAgICAgICBGTEFTSF9GTEFHX1NJWkVSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfUEdTICAgICAgICAgICAgIEZMQVNIX0ZMQUdfUEdTRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9NSVMgICAgICAgICAgICAgRkxBU0hfRkxBR19NSVNFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QgICAgICAgICAgICBGTEFTSF9GTEFHX0ZBU1RFUlIKKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9SRCAgICAgICAgICAgICAgRkxBU0hfRkxBR19SREVSUgorI2VuZGlmCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9PUFRWICAgICAgICAgICAgRkxBU0hfRkxBR19PUFRWRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NEICAgICAgICAgICAgRkxBU0hfRkxBR19FQ0NECisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX1R5cGVfRXJhc2UgRkxBU0ggRXJhc2UgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1RZUEVFUkFTRV9QQUdFUyAgICAgICAgICAgRkxBU0hfQ1JfUEVSICAgIC8qITwgUGFnZXMgZXJhc2Ugb25seSAqLworI2RlZmluZSBGTEFTSF9UWVBFRVJBU0VfTUFTUyAgICAgICAgICAgIEZMQVNIX0NSX01FUjEgICAvKiE8IEZsYXNoIG1hc3MgZXJhc2UgYWN0aXZhdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9UeXBlX1Byb2dyYW0gRkxBU0ggUHJvZ3JhbSBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCAgICBGTEFTSF9DUl9QRyAgICAgLyohPCBQcm9ncmFtIGEgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUICAgICAgICAgIEZMQVNIX0NSX0ZTVFBHICAvKiE8IEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1R5cGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBPUFRJT05CWVRFX1dSUCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IFdSUCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9QVElPTkJZVEVfUkRQICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgUkRQIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT1BUSU9OQllURV9VU0VSICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBVU0VSIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisjZGVmaW5lIE9QVElPTkJZVEVfUENST1AgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgIC8qITwgUENST1Agb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChGTEFTSF9TRUNVUkFCTEVfTUVNT1JZX1NVUFBPUlQpCisjZGVmaW5lIE9QVElPTkJZVEVfU0VDICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUgIC8qITwgU0VDIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNDF4eCkKKyNkZWZpbmUgT1BUSU9OQllURV9BTEwgICAgICAgICAgICAgICAgICAoT1BUSU9OQllURV9XUlAgIHwgT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9QQ1JPUCB8IE9QVElPTkJZVEVfU0VDKSAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovCisjZWxpZiBkZWZpbmVkIChTVE0zMkcwNzB4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDMweHgpCisjZGVmaW5lIE9QVElPTkJZVEVfQUxMICAgICAgICAgICAgICAgICAgKE9QVElPTkJZVEVfV1JQICB8IE9QVElPTkJZVEVfUkRQIHwgT1BUSU9OQllURV9VU0VSKSAvKiE8IEFsbCBvcHRpb24gYnl0ZSBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfV1JQX0FyZWEgRkxBU0ggV1JQIEFyZWEKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9XUlBBUkVBX1pPTkVfQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IEZsYXNoIFpvbmUgQSAqLworI2RlZmluZSBPQl9XUlBBUkVBX1pPTkVfQiAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAvKiE8IEZsYXNoIFpvbmUgQiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9SZWFkX1Byb3RlY3Rpb24gRkxBU0ggT3B0aW9uIEJ5dGVzIFJlYWQgUHJvdGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDBBQVUKKyNkZWZpbmUgT0JfUkRQX0xFVkVMXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMEJCVQorI2RlZmluZSBPQl9SRFBfTEVWRUxfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwQ0NVICAvKiE8IFdhcm5pbmc6IFdoZW4gZW5hYmxpbmcgcmVhZCBwcm90ZWN0aW9uIGxldmVsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBubyBtb3JlIHBvc3NpYmxlIHRvIGdvIGJhY2sgdG8gbGV2ZWwgMSBvciAwICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfVHlwZSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBUeXBlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFBXUl9CT1JfU1VQUE9SVCkKKyNkZWZpbmUgT0JfVVNFUl9CT1JfRU4gICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0JPUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQk9SIHJlc2V0IGVuYWJsZSAqLworI2RlZmluZSBPQl9VU0VSX0JPUl9MRVYgICAgICAgICAgICAgICAgIChGTEFTSF9PUFRSX0JPUkZfTEVWIHwgRkxBU0hfT1BUUl9CT1JSX0xFVikgLyohPCBCT1IgcmVzZXQgTGV2ZWwgKi8KKyNlbmRpZgorI2RlZmluZSBPQl9VU0VSX25SU1RfU1RPUCAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RvcCBtb2RlICovCisjZGVmaW5lIE9CX1VTRVJfblJTVF9TVERCWSAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uUlNUX1NUREJZICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdGFuZGJ5IG1vZGUgKi8KKyNpZiBkZWZpbmVkKFBXUl9TSERXX1NVUFBPUlQpCisjZGVmaW5lIE9CX1VTRVJfblJTVF9TSERXICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uUlNUX1NIRFcgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzaHV0ZG93biBtb2RlICovCisjZW5kaWYKKyNkZWZpbmUgT0JfVVNFUl9JV0RHX1NXICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0lXREdfU1cgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgc2VsZWN0aW9uICovCisjZGVmaW5lIE9CX1VTRVJfSVdER19TVE9QICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9JV0RHX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgZnJlZXplIGluIHN0b3AgbW9kZSAqLworI2RlZmluZSBPQl9VU0VSX0lXREdfU1REQlkgICAgICAgICAgICAgIEZMQVNIX09QVFJfSVdER19TVERCWSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGZyZWV6ZSBpbiBzdGFuZGJ5IG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9XV0RHX1NXICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX1dXREdfU1cgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93IHdhdGNoZG9nIHNlbGVjdGlvbiAqLworI2RlZmluZSBPQl9VU0VSX1JBTV9QQVJJVFlfQ0hFQ0sgICAgICAgIEZMQVNIX09QVFJfUkFNX1BBUklUWV9DSEVDSyAgICAgICAgICAgICAgICAgLyohPCBTcmFtIHBhcml0eSBjaGVjayBjb250cm9sICovCisjZGVmaW5lIE9CX1VTRVJfbkJPT1RfU0VMICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJvb3QgU2VsZWN0aW9uICovCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QxICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG5Cb290MSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QwICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG5Cb290MCBjb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChHUElPX05SU1RfQ09ORklHX1NVUFBPUlQpCisjZGVmaW5lIE9CX1VTRVJfTlJTVF9NT0RFICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9OUlNUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IHBpbiBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEZMQVNIX09QVFJfSVJIRU4pCisjZGVmaW5lIE9CX1VTRVJfSU5QVVRfUkVTRVRfSE9MREVSICAgICAgRkxBU0hfT1BUUl9JUkhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIHJlc2V0IGhvbGRlciBlbmFibGUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoU1RNMzJHMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDMxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDQxeHgpCisjZGVmaW5lIE9CX1VTRVJfQUxMICAgICAgICAgICAgICAgICAgICAgKE9CX1VTRVJfQk9SX0VOICAgICAgICAgICB8IE9CX1VTRVJfQk9SX0xFViAgICB8IE9CX1VTRVJfblJTVF9TVE9QIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX25SU1RfU1REQlkgICAgICAgfCBPQl9VU0VSX25SU1RfU0hEVyAgfCBPQl9VU0VSX0lXREdfU1cgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JfVVNFUl9JV0RHX1NUT1AgICAgICAgIHwgT0JfVVNFUl9JV0RHX1NUREJZIHwgT0JfVVNFUl9XV0RHX1NXICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CX1VTRVJfUkFNX1BBUklUWV9DSEVDSyB8IE9CX1VTRVJfbkJPT1RfU0VMICB8IE9CX1VTRVJfbkJPT1QxICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX25CT09UMCAgICAgICAgICAgfCBPQl9VU0VSX05SU1RfTU9ERSAgfCBPQl9VU0VSX0lOUFVUX1JFU0VUX0hPTERFUikgICAvKiE8IGFsbCBvcHRpb24gYml0cyAqLworI2VsaWYgZGVmaW5lZCAoU1RNMzJHMDcweHgpIHx8IGRlZmluZWQgKFNUTTMyRzAzMHh4KQorI2RlZmluZSBPQl9VU0VSX0FMTCAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX25SU1RfU1RPUCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JfVVNFUl9uUlNUX1NUREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT0JfVVNFUl9JV0RHX1NXICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CX1VTRVJfSVdER19TVE9QICAgICAgICB8IE9CX1VTRVJfSVdER19TVERCWSB8IE9CX1VTRVJfV1dER19TVyAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX1JBTV9QQVJJVFlfQ0hFQ0sgfCBPQl9VU0VSX25CT09UX1NFTCAgfCBPQl9VU0VSX25CT09UMSAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JfVVNFUl9uQk9PVDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBhbGwgb3B0aW9uIGJpdHMgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUFdSX0JPUl9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0JPUl9FTkFCTEUgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgQk9SIGVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX0JPUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgQk9SIFJlc2V0IHNldCB0byBkZWZhdWx0ICovCisjZGVmaW5lIE9CX0JPUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9CT1JfRU4gIC8qITwgVXNlIG9wdGlvbiBieXRlIHRvIGRlZmluZSBCT1IgdGhyZXNob2xkcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCT1IgTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfRkFMTElOR18wICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQk9SIGZhbGxpbmcgbGV2ZWwgMSB3aXRoIHRocmVzaG9sZCBhcm91bmQgMi4wViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfRkFMTElOR18xICAgICAgICAgIEZMQVNIX09QVFJfQk9SRl9MRVZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQk9SIGZhbGxpbmcgbGV2ZWwgMiB3aXRoIHRocmVzaG9sZCBhcm91bmQgMi4yViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfRkFMTElOR18yICAgICAgICAgIEZMQVNIX09QVFJfQk9SRl9MRVZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQk9SIGZhbGxpbmcgbGV2ZWwgMyB3aXRoIHRocmVzaG9sZCBhcm91bmQgMi41ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfRkFMTElOR18zICAgICAgICAgIChGTEFTSF9PUFRSX0JPUkZfTEVWXzAgfCBGTEFTSF9PUFRSX0JPUkZfTEVWXzEpIC8qITwgQk9SIGZhbGxpbmcgbGV2ZWwgNCB3aXRoIHRocmVzaG9sZCBhcm91bmQgMi44ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfUklTSU5HXzAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQk9SIHJpc2luZyBsZXZlbCAxIHdpdGggdGhyZXNob2xkIGFyb3VuZCAyLjFWICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTF9SSVNJTkdfMSAgICAgICAgICAgRkxBU0hfT1BUUl9CT1JSX0xFVl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCT1IgcmlzaW5nIGxldmVsIDIgd2l0aCB0aHJlc2hvbGQgYXJvdW5kIDIuM1YgKi8KKyNkZWZpbmUgT0JfQk9SX0xFVkVMX1JJU0lOR18yICAgICAgICAgICBGTEFTSF9PUFRSX0JPUlJfTEVWXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJPUiByaXNpbmcgbGV2ZWwgMyB3aXRoIHRocmVzaG9sZCBhcm91bmQgMi42ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfUklTSU5HXzMgICAgICAgICAgIChGTEFTSF9PUFRSX0JPUlJfTEVWXzAgfCBGTEFTSF9PUFRSX0JPUlJfTEVWXzEpIC8qITwgQk9SIHJpc2luZyBsZXZlbCA0IHdpdGggdGhyZXNob2xkIGFyb3VuZCAyLjlWICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NUT1AgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUmVzZXQgT24gU3RvcAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NUT1BfUlNUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHN0b3AgbW9kZSAqLworI2RlZmluZSBPQl9TVE9QX05PUlNUICAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVE9QICAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUmVzZXQgT24gU3RhbmRieQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NUQU5EQllfUlNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHN0YW5kYnkgbW9kZSAqLworI2RlZmluZSBPQl9TVEFOREJZX05PUlNUICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVERCWSAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdGFuZGJ5IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFBXUl9TSERXX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfblJTVF9TSFVURE9XTiBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBSZXNldCBPbiBTaHV0ZG93bgorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NIVVRET1dOX1JTVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHNodXRkb3duIG1vZGUgKi8KKyNkZWZpbmUgT0JfU0hVVERPV05fTk9SU1QgICAgICAgICAgICAgICBGTEFTSF9PUFRSX25SU1RfU0hEVyAgLyohPCBObyByZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc2h1dGRvd24gbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfSVdER19TVyBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBJV0RHIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9JV0RHX0hXICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEhhcmR3YXJlIGluZGVwZW5kZW50IHdhdGNoZG9nICovCisjZGVmaW5lIE9CX0lXREdfU1cgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9JV0RHX1NXICAgIC8qITwgU29mdHdhcmUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uIFN0b3AKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9JV0RHX1NUT1BfRlJFRVpFICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgZnJvemVuIGluIFN0b3AgbW9kZSAqLworI2RlZmluZSBPQl9JV0RHX1NUT1BfUlVOICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfSVdER19TVE9QICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdG9wIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uIFN0YW5kYnkKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9JV0RHX1NUREJZX0ZSRUVaRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgZnJvemVuIGluIFN0YW5kYnkgbW9kZSAqLworI2RlZmluZSBPQl9JV0RHX1NUREJZX1JVTiAgICAgICAgICAgICAgIEZMQVNIX09QVFJfSVdER19TVERCWSAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdGFuZGJ5IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9XV0RHX1NXIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFdXREcgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1dXREdfSFcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgSGFyZHdhcmUgd2luZG93IHdhdGNoZG9nICovCisjZGVmaW5lIE9CX1dXREdfU1cgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9XV0RHX1NXICAgIC8qITwgU29mdHdhcmUgd2luZG93IHdhdGNoZG9nICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfU1JBTV9QQVJJVFkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgU1JBTSBwYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9TUkFNX1BBUklUWV9FTkFCTEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPCBTcmFtIHBhcml0eSBlbmFibGUgKi8KKyNkZWZpbmUgT0JfU1JBTV9QQVJJVFlfRElTQUJMRSAgICAgICAgICBGTEFTSF9PUFRSX1JBTV9QQVJJVFlfQ0hFQ0sgIC8qITwgU3JhbSBwYXJpdHkgZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25CT09UX1NFTCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCb290MCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBPQl9CT09UMF9GUk9NX1BJTiAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQk9PVDAgc2lnbmFsIGlzIGRlZmluZWQgYnkgUEExNC9CT09UMCBwaW4gdmFsdWUgKi8KKyNkZWZpbmUgT0JfQk9PVDBfRlJPTV9PQiAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX25CT09UX1NFTCAgICAvKiE8IEJPT1QwIHNpZ25hbCBpcyBkZWZpbmVkIGJ5IG5CT09UMCBvcHRpb24gYml0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfbkJPT1QxIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIEJPT1QxIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9CT09UMV9TUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEVtYmVkZGVkIFNSQU0gaXMgc2VsZWN0ZWQgYXMgYm9vdCBzcGFjZSAoaWYgbkJPT1QwPTAgb3IgQk9PVDBfcGluPTEpICovCisjZGVmaW5lIE9CX0JPT1QxX1NZU1RFTSAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDEgICAgIC8qITwgU3lzdGVtIG1lbW9yeSBpcyBzZWxlY3RlZCBhcyBib290IHNwYWNlIChpZiBuQk9PVDA9MCBvciBCT09UMF9waW49MSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uQk9PVDAgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgbkJPT1QwIG9wdGlvbiBiaXQKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9uQk9PVDBfUkVTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IG5CT09UMCA9IDAgKi8KKyNkZWZpbmUgT0JfbkJPT1QwX1NFVCAgICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX25CT09UMCAgICAgLyohPCBuQk9PVDAgPSAxICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChHUElPX05SU1RfQ09ORklHX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfUkVTRVRfQ09ORklHIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIHJlc2V0IGNvbmZpZyBiaXQKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9SRVNFVF9NT0RFX0lOUFVUX09OTFkgICAgICAgIEZMQVNIX09QVFJfTlJTVF9NT0RFXzAgIC8qITwgUmVzZXQgcGluIGlzIGluIFJlc2V0IGlucHV0IG1vZGUgb25seSAqLworI2RlZmluZSBPQl9SRVNFVF9NT0RFX0dQSU8gICAgICAgICAgICAgIEZMQVNIX09QVFJfTlJTVF9NT0RFXzEgIC8qITwgUmVzZXQgcGluIGlzIGluIEdQSU8gbW9kZSBtb2RlIG9ubHkgKi8KKyNkZWZpbmUgT0JfUkVTRVRfTU9ERV9JTlBVVF9PVVRQVVQgICAgICBGTEFTSF9PUFRSX05SU1RfTU9ERSAgICAvKiE8IFJlc2V0IHBpbiBpcyBpbiByZXNldCBpbnB1dCBhbmQgb3V0cHV0IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfT1BUUl9JUkhFTikKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JTlBVVF9SRVNFVF9IT0xERVIgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgaW5wdXQgcmVzZXQgaG9sZGVyIGJpdAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX0lSSF9FTkFCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgSW50ZXJuYWwgUmVzZXQgaGFuZGxlciBlbmFibGUgKi8KKyNkZWZpbmUgT0JfSVJIX0RJU0FCTEUgICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0lSSEVOICAgICAgLyohPCBJbnRlcm5hbCBSZXNldCBoYW5kbGVyIGRpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfUENST1BfWk9ORSBGTEFTSCBPcHRpb24gQnl0ZXMgUENST1AgWk9ORQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1BDUk9QX1pPTkVfQSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBQQ1JPUCBab25lIEEgKi8KKyNkZWZpbmUgT0JfUENST1BfWk9ORV9CICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IFBDUk9QIFpvbmUgQiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9QQ1JPUF9SRFAgRkxBU0ggT3B0aW9uIEJ5dGVzIFBDUk9QIE9uIFJEUCBMZXZlbCBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUENST1BfUkRQX05PVF9FUkFTRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgUENST1AgYXJlYSBpcyBub3QgZXJhc2VkIHdoZW4gdGhlIFJEUCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkZWNyZWFzZWQgZnJvbSBMZXZlbCAxIHRvIExldmVsIDAgKi8KKyNkZWZpbmUgT0JfUENST1BfUkRQX0VSQVNFICAgICAgICAgICAgICBGTEFTSF9QQ1JPUDFBRVJfUENST1BfUkRQIC8qITwgUENST1AgYXJlYSBpcyBlcmFzZWQgd2hlbiB0aGUgUkRQIGxldmVsIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlZCBmcm9tIExldmVsIDEgdG8gTGV2ZWwgMCAoZnVsbCBtYXNzIGVyYXNlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25jZSB0aGlzIGJpdCBpcyBzZXQgb25seSwgaXQgd2lsbCBiZSByZXNldCBieSBtYXNzIGVyYXNlICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZMQVNIX1NFQ1VSQUJMRV9NRU1PUllfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfU0VDX0JPT1RfTE9DSyBGTEFTSCBPcHRpb24gQnl0ZXMgU2VjdXJlIGJvb3QgbG9jaworICAqIEB7CisgICovCisjZGVmaW5lIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBCb290IGVudHJ5IGlzIGZyZWUgKi8KKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0ggICAgICAgRkxBU0hfU0VDUl9CT09UX0xPQ0sgICAgICAvKiE8IEJvb3QgZW50cnkgaXMgZm9yY2VkIHRvIEZsYXNoIG9yIFN5c3RlbSBGbGFzaCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9NYWNyb3MgRkxBU0ggRXhwb3J0ZWQgTWFjcm9zCisgICogIEBicmllZiBtYWNyb3MgdG8gY29udHJvbCBGTEFTSCBmZWF0dXJlcworICAqICBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgRkxBU0ggTGF0ZW5jeS4KKyAgKiBAcGFyYW0gIF9fTEFURU5DWV9fIEZMQVNIIExhdGVuY3kKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8wIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8xIEZMQVNIIE9uZSB3YWl0IHN0YXRlCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzIgRkxBU0ggVHdvIHdhaXQgc3RhdGVzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKF9fTEFURU5DWV9fKSAgICBNT0RJRllfUkVHKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZLCAoX19MQVRFTkNZX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgRkxBU0ggTGF0ZW5jeS4KKyAgKiBAcmV0dmFsIEZMQVNIIExhdGVuY3kKKyAgKiAgICAgICAgIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8wIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8xIEZMQVNIIE9uZSB3YWl0IHN0YXRlCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzIgRkxBU0ggVHdvIHdhaXQgc3RhdGVzCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgICAgICAgICAgICAgICBSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIHByZWZldGNoIGJ1ZmZlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0VOQUJMRSgpICAgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBGTEFTSCBwcmVmZXRjaCBidWZmZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9ESVNBQkxFKCkgICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BSRlRFTikKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEZMQVNIIGluc3RydWN0aW9uIGNhY2hlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9FTkFCTEUoKSAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBGTEFTSCBpbnN0cnVjdGlvbiBjYWNoZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikKKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgRkxBU0ggaW5zdHJ1Y3Rpb24gQ2FjaGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIEluc3RydWN0aW9uIENhY2hlIGlzIGRpc2FibGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpICAgZG8geyBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDUlNUKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0ludGVycnVwdCBGTEFTSCBJbnRlcnJ1cHRzIE1hY3JvcworICogIEBicmllZiBtYWNyb3MgdG8gaGFuZGxlIEZMQVNIIGludGVycnVwdHMKKyAqIEB7CisgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZMQVNIIGludGVycnVwdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VPUCBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfT1BFUlIgRXJyb3IgSW50ZXJydXB0CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9SREVSUiBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdCgqKQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfRUNDQyBFQ0MgQ29ycmVjdGlvbiBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoX19JTlRFUlJVUFRfXykgICAgZG8geyBpZigoKF9fSU5URVJSVVBUX18pICYgRkxBU0hfSVRfRUNDQykgIT0gMFUpIHsgU0VUX0JJVChGTEFTSC0+RUNDUiwgRkxBU0hfRUNDUl9FQ0NDSUUpOyB9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKF9fSU5URVJSVVBUX18pICYgKH5GTEFTSF9JVF9FQ0NDKSkgIT0gMFUpIHsgU0VUX0JJVChGTEFTSC0+Q1IsICgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSk7IH1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTEFTSCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIEZMQVNIIGludGVycnVwdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VPUCBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfT1BFUlIgRXJyb3IgSW50ZXJydXB0CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9SREVSUiBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdCgqKQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfRUNDQyBFQ0MgQ29ycmVjdGlvbiBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9ESVNBQkxFX0lUKF9fSU5URVJSVVBUX18pICAgZG8geyBpZigoKF9fSU5URVJSVVBUX18pICYgRkxBU0hfSVRfRUNDQykgIT0gMFUpIHsgQ0xFQVJfQklUKEZMQVNILT5FQ0NSLCBGTEFTSF9FQ0NSX0VDQ0NJRSk7IH1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSAhPSAwVSkgeyBDTEVBUl9CSVQoRkxBU0gtPkNSLCAoKF9fSU5URVJSVVBUX18pICYgKH5GTEFTSF9JVF9FQ0NDKSkpOyB9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBGTEFTSCBmbGFnIHRvIGNoZWNrLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfRU9QIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19PUEVSUiBGTEFTSCBPcGVyYXRpb24gZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QUk9HRVJSIEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfV1JQRVJSIEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QR0FFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgYWxpZ25tZW50IGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfU0laRVJSIEZMQVNIIFNpemUgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QR1NFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgc2VxdWVuY2UgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19NSVNFUlIgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBkYXRhIG1pc3MgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19GQVNURVJSIEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19SREVSUiBGTEFTSCBQQ1JPUCByZWFkICBlcnJvciBmbGFnKCopCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QVFZFUlIgRkxBU0ggT3B0aW9uIHZhbGlkaXR5IGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfQlNZIEZMQVNIIHdyaXRlL2VyYXNlIG9wZXJhdGlvbnMgaW4gcHJvZ3Jlc3MgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19DRkdCU1kgRkxBU0ggY29uZmlndXJhdGlvbiBpcyBidXN5IDogcHJvZ3JhbSBvciBlcmFzZSBzZXR0aW5nIGFyZSB1c2VkLgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FQ0NDIEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGNvcnJlY3RlZAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FQ0NEIEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZAorICAqIEBub3RlICgqKSBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEZMQVNIX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAoKCgoX19GTEFHX18pICYgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpICE9IDBVKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVBRF9CSVQoRkxBU0gtPkVDQ1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpICA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVBRF9CSVQoRkxBU0gtPlNSLCAgIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBGTEFTSHMgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgRkxBU0ggZmxhZ3MgdG8gY2xlYXIuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FT1AgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QRVJSIEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BST0dFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19XUlBFUlIgRkxBU0ggV3JpdGUgcHJvdGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHQUVSUiBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19TSVpFUlIgRkxBU0ggU2l6ZSBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHU0VSUiBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX01JU0VSUiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0ZBU1RFUlIgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1JERVJSIEZMQVNIIFBDUk9QIHJlYWQgIGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfT1BUVkVSUiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FQ0NDIEZMQVNIIG9uZSBFQ0MgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGNvcnJlY3RlZAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FQ0NEIEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19BTExfRVJST1JTIEZMQVNIIEFsbCBlcnJvcnMgZmxhZ3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgIGRvIHsgaWYoKChfX0ZMQUdfXykgJiAoRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEKSkgIT0gMFUpIHsgU0VUX0JJVChGTEFTSC0+RUNDUiwgKChfX0ZMQUdfXykgJiAoRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEKSkpOyB9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKF9fRkxBR19fKSAmIH4oRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEKSkgIT0gMFUpIHsgV1JJVEVfUkVHKEZMQVNILT5TUiwgKChfX0ZMQUdfXykgJiB+KEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpKTsgfVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEZMQVNIIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2ZsYXNoX2V4LmgiCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9WYXJpYWJsZXMgRkxBU0ggRXhwb3J0ZWQgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK2V4dGVybiBGTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2g7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFByb2dyYW0gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50NjRfdCBEYXRhKTsKKy8qIEZMQVNIIElSUSBoYW5kbGVyIG1ldGhvZCAqLwordm9pZCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpOworLyogQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlcyAqLwordm9pZCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKTsKK3ZvaWQgICAgICAgICAgICAgICBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9VbmxvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX0xvY2sodm9pZCk7CisvKiBPcHRpb24gYnl0ZXMgY29udHJvbCAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9PQl9VbmxvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCit1aW50MzJfdCBIQUxfRkxBU0hfR2V0RXJyb3Iodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV90eXBlcyBGTEFTSCBQcml2YXRlIFR5cGVzCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9Db25zdGFudHMgRkxBU0ggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBGTEFTSF9TSVpFX0RBVEFfUkVHSVNURVIgICAgICAgIEZMQVNIU0laRV9CQVNFCisKKyNkZWZpbmUgRkxBU0hfU0laRSAgICAgICAgICAgICAgICAgICAgICAoKCgqKCh1aW50MzJfdCAqKUZMQVNIX1NJWkVfREFUQV9SRUdJU1RFUikpICYgKDB4MDBGRlUpKSA8PCAxMFUpCisKKyNkZWZpbmUgRkxBU0hfQkFOS19TSVpFICAgICAgICAgICAgICAgICAoRkxBU0hfU0laRSkgICAvKiE8IEZMQVNIIEJhbmsgU2l6ZSAqLworCisjZGVmaW5lIEZMQVNIX1BBR0VfU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMFUgICAgLyohPCBGTEFTSCBQYWdlIFNpemUsIDIgS0J5dGVzICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KXx8ZGVmaW5lZChTVE0zMkcwNzF4eCl8fGRlZmluZWQoU1RNMzJHMDcweHgpCisjZGVmaW5lIEZMQVNIX1BBR0VfTkIgICAgICAgICAgICAgICAgICAgNjRVCisjZWxzZQorI2RlZmluZSBGTEFTSF9QQUdFX05CICAgICAgICAgICAgICAgICAgIDMyVQorI2VuZGlmCisKKyNkZWZpbmUgRkxBU0hfVElNRU9VVF9WQUxVRSAgICAgICAgICAgICAxMDAwVSAgICAgICAgICAvKiE8IEZMQVNIIEV4ZWN1dGlvbiBUaW1lb3V0LCAxIHMgKi8KKworI2RlZmluZSBGTEFTSF9UWVBFTk9ORSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgTm8gUHJvZ3JhbW1hdGlvbiBQcm9jZWR1cmUgT24gR29pbmcgKi8KKworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKyNkZWZpbmUgRkxBU0hfRkxBR19TUl9FUlJPUiAgICAgICAgICAgICAoRkxBU0hfRkxBR19PUEVSUiAgfCBGTEFTSF9GTEFHX1BST0dFUlIgfCBGTEFTSF9GTEFHX1dSUEVSUiB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfUEdBRVJSIHwgRkxBU0hfRkxBR19TSVpFUlIgIHwgRkxBU0hfRkxBR19QR1NFUlIgfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19NSVNFUlIgfCBGTEFTSF9GTEFHX0ZBU1RFUlIgfCBGTEFTSF9GTEFHX1JERVJSIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfT1BUVkVSUikgICAgIC8qITwgQWxsIFNSIGVycm9yIGZsYWdzICovCisjZWxzZQorI2RlZmluZSBGTEFTSF9GTEFHX1NSX0VSUk9SICAgICAgICAgICAgIChGTEFTSF9GTEFHX09QRVJSICB8IEZMQVNIX0ZMQUdfUFJPR0VSUiB8IEZMQVNIX0ZMQUdfV1JQRVJSIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19QR0FFUlIgfCBGTEFTSF9GTEFHX1NJWkVSUiAgfCBGTEFTSF9GTEFHX1BHU0VSUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX01JU0VSUiB8IEZMQVNIX0ZMQUdfRkFTVEVSUiB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX09QVFZFUlIpICAgICAvKiE8IEFsbCBTUiBlcnJvciBmbGFncyAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX01hY3JvcyBGTEFTSCBQcml2YXRlIE1hY3JvcworICogIEB7CisgKi8KKyNkZWZpbmUgSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhfX0FERFJFU1NfXykgICAgICAgICAoKChfX0FERFJFU1NfXykgPj0gKEZMQVNIX0JBU0UpKSAmJiAoKF9fQUREUkVTU19fKSA8PSAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUgLSAxVUwpKSkKKworI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX01BSU5fTUVNX0FERFJFU1MoX19BRERSRVNTX18pICgoKF9fQUREUkVTU19fKSA+PSAoRkxBU0hfQkFTRSkpICYmICgoX19BRERSRVNTX18pIDw9IChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSAtIDhVTCkpKQorCisjZGVmaW5lIElTX0ZMQVNIX1BST0dSQU1fT1RQX0FERFJFU1MoX19BRERSRVNTX18pICAgICAgKCgoX19BRERSRVNTX18pID49IDB4MUZGRjcwMDBVKSAmJiAoKF9fQUREUkVTU19fKSA8PSAoMHgxRkZGNzQwMFUgLSA4VUwpKSkKKworI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoX19BRERSRVNTX18pICAgICAgICAgICgoSVNfRkxBU0hfUFJPR1JBTV9NQUlOX01FTV9BRERSRVNTKF9fQUREUkVTU19fKSkgfHwgKElTX0ZMQVNIX1BST0dSQU1fT1RQX0FERFJFU1MoX19BRERSRVNTX18pKSkKKworI2RlZmluZSBJU19GTEFTSF9GQVNUX1BST0dSQU1fQUREUkVTUyhfX0FERFJFU1NfXykgICAgICgoKF9fQUREUkVTU19fKSA+PSAoRkxBU0hfQkFTRSkpICYmICgoX19BRERSRVNTX18pIDw9IChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSAtIDI1NlVMKSkpCisKKyNkZWZpbmUgSVNfRkxBU0hfUEFHRShfX1BBR0VfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFHRV9fKSA8IEZMQVNIX1BBR0VfTkIpCisKKyNkZWZpbmUgSVNfRkxBU0hfQkFOSyhfX0JBTktfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFOS19fKSA9PSAweDAwVUwpCisKKyNkZWZpbmUgSVNfRkxBU0hfVFlQRUVSQVNFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVFUkFTRV9QQUdFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1MpKQorCisjZGVmaW5lIElTX0ZMQVNIX1RZUEVQUk9HUkFNKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9ET1VCTEVXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUKSkKKworI2RlZmluZSBJU19PUFRJT05CWVRFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgICAgICgoKChfX1ZBTFVFX18pICYgT1BUSU9OQllURV9BTEwpICE9IDB4MDBVKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH5PUFRJT05CWVRFX0FMTCkgPT0gMHgwMFUpKQorCisjZGVmaW5lIElTX09CX1dSUEFSRUEoX19WQUxVRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBPQl9XUlBBUkVBX1pPTkVfQSkgfHwgKChfX1ZBTFVFX18pID09IE9CX1dSUEFSRUFfWk9ORV9CKSkKKworI2RlZmluZSBJU19PQl9SRFBfTEVWRUwoX19MRVZFTF9fKSAgICAgICAgICAgICAgICAgICAgICgoKF9fTEVWRUxfXykgPT0gT0JfUkRQX0xFVkVMXzApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRVZFTF9fKSA9PSBPQl9SRFBfTEVWRUxfMSkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IE9CX1JEUF9MRVZFTF8yKSkKKworI2RlZmluZSBJU19PQl9VU0VSX1RZUEUoX19UWVBFX18pICAgICAgICAgICAgICAgICAgICAgICgoKChfX1RZUEVfXykgJiBPQl9VU0VSX0FMTCkgIT0gMHgwMFUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19UWVBFX18pICYgfk9CX1VTRVJfQUxMKSA9PSAweDAwVSkpCisKKyNkZWZpbmUgSVNfT0JfVVNFUl9DT05GSUcoX19UWVBFX18sX19DT05GSUdfXykgICAgICAgICAoKH4oX19UWVBFX18pICYgKF9fQ09ORklHX18pKSA9PSAweDAwVSkKKworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKyNkZWZpbmUgSVNfT0JfUENST1BfQ09ORklHKF9fQ09ORklHX18pICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIH4oT0JfUENST1BfWk9ORV9BIHwgT0JfUENST1BfWk9ORV9CIHwgT0JfUENST1BfUkRQX0VSQVNFKSkgPT0gMHgwMFUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorI2RlZmluZSBJU19PQl9TRUNfQk9PVF9MT0NLKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORSkgfHwgKChfX1ZBTFVFX18pID09IE9CX0JPT1RfRU5UUllfRk9SQ0VEX0ZMQVNIKSkKKworI2RlZmluZSBJU19PQl9TRUNfU0laRShfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA8IChGTEFTSF9QQUdFX05CICsgMVUpKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfRkxBU0hfTEFURU5DWShfX0xBVEVOQ1lfXykgICAgICAgICAgICAgICAgICAoKChfX0xBVEVOQ1lfXykgPT0gRkxBU0hfTEFURU5DWV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MQVRFTkNZX18pID09IEZMQVNIX0xBVEVOQ1lfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFURU5DWV9fKSA9PSBGTEFTSF9MQVRFTkNZXzIpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfRkxBU0hfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZmxhc2hfZXguaCBiL0luYy9zdG0zMmcweHhfaGFsX2ZsYXNoX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhOGZjNgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2ZsYXNoX2V4LmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2ZsYXNoX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEZMQVNIIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9GTEFTSF9FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfRkxBU0hfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9Db25zdGFudHMgRkxBU0ggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FbXB0eV9DaGVjayBGTEFTSEV4IEVtcHR5IENoZWNrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfUFJPR19OT1RfRU1QVFkgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgLyohPCAxc3QgbG9jYXRpb24gaW4gRmxhc2ggaXMgcHJvZ3JhbW1lZCAqLworI2RlZmluZSBGTEFTSF9QUk9HX0VNUFRZICAgICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfUFJPR0VNUFRZICAvKiE8IDFzdCBsb2NhdGlvbiBpbiBGbGFzaCBpcyBlbXB0eSAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogRXh0ZW5kZWQgUHJvZ3JhbSBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LCB1aW50MzJfdCAqUGFnZUVycm9yKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlX0lUKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfRkxBU0hFeF9EaXNhYmxlRGVidWdnZXIodm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfRkxBU0hFeF9GbGFzaEVtcHR5Q2hlY2sodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfRkxBU0hFeF9Gb3JjZUZsYXNoRW1wdHkodWludDMyX3QgRmxhc2hFbXB0eSk7CisjaWYgZGVmaW5lZChGTEFTSF9TRUNVUkFCTEVfTUVNT1JZX1NVUFBPUlQpCit2b2lkICAgICAgICAgICAgICBIQUxfRkxBU0hFeF9FbmFibGVTZWNNZW1Qcm90ZWN0aW9uKHVpbnQzMl90IEJhbmspOworI2VuZGlmCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9PQlByb2dyYW0oRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX0NvbnN0YW50cyBGTEFTSEV4IFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUICAgICAgICAgICAgIDl1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRkxBU0ggQ29kZSBSZWFkb3V0IFByb3RlY3Rpb24gZ3JhbnVsYXJpdHkgb2Zmc2V0ICovCisjZGVmaW5lIEZMQVNIX1BDUk9QX0dSQU5VTEFSSVRZICAgICAgICAgICAgICAgICAgICAoMVVMIDw8IEZMQVNIX1BDUk9QX0dSQU5VTEFSSVRZX09GRlNFVCkgICAvKiE8IEZMQVNIIENvZGUgUmVhZG91dCBQcm90ZWN0aW9uIGdyYW51bGFyaXR5LCA1MTIgQnl0ZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBGTEFTSEV4X1ByaXZhdGVfTWFjcm9zIEZMQVNIRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiAgQHsKKyAgKi8KKyNkZWZpbmUgSVNfRkxBU0hfRU1QVFlfQ0hFQ0soX19WQUxVRV9fKSAgICAgKCgoX19WQUxVRV9fKSA9PSBGTEFTSF9QUk9HX0VNUFRZKSB8fCAoKF9fVkFMVUVfXykgPT0gRkxBU0hfUFJPR19OT1RfRU1QVFkpKQordm9pZCAgICAgICAgICAgICAgRkxBU0hfUGFnZUVyYXNlKHVpbnQzMl90IFBhZ2UpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfRkxBU0hfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfZ3Bpby5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODllYjMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9ncGlvLmgKQEAgLTAsMCArMSwzNDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2dwaW8uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9HUElPX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9HUElPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPCisgICogQGJyaWVmIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfVHlwZXMgR1BJTyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgICBHUElPIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBpbjsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBHUElPX3BpbnMgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX21vZGUgKi8KKworICB1aW50MzJfdCBQdWxsOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHVsbC11cCBvciBQdWxsLURvd24gYWN0aXZhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fcHVsbCAqLworCisgIHVpbnQzMl90IFNwZWVkOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzcGVlZCBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fc3BlZWQgKi8KKworICB1aW50MzJfdCBBbHRlcm5hdGU7ICAvKiE8IFBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzZWxlY3RlZCBwaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiAqLworfSBHUElPX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEdQSU8gQml0IFNFVCBhbmQgQml0IFJFU0VUIGVudW1lcmF0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1BJT19QSU5fUkVTRVQgPSAwVSwKKyAgR1BJT19QSU5fU0VUCit9IEdQSU9fUGluU3RhdGU7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0V4cG9ydGVkX0NvbnN0YW50cyBHUElPIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIEdQSU9fcGlucyBHUElPIHBpbnMKKyAgKiBAeworICAqLworI2RlZmluZSBHUElPX1BJTl8wICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkgIC8qIFBpbiAwIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzEgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAyKSAgLyogUGluIDEgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMiAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpICAvKiBQaW4gMiBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8zICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwOCkgIC8qIFBpbiAzIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzQgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDEwKSAgLyogUGluIDQgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fNSAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApICAvKiBQaW4gNSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl82ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MCkgIC8qIFBpbiA2IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzcgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDgwKSAgLyogUGluIDcgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fOCAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApICAvKiBQaW4gOCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl85ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDIwMCkgIC8qIFBpbiA5IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzEwICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwKSAgLyogUGluIDEwIHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTEgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA4MDApICAvKiBQaW4gMTEgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMiAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MTAwMCkgIC8qIFBpbiAxMiBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzEzICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgyMDAwKSAgLyogUGluIDEzIHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTQgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDQwMDApICAvKiBQaW4gMTQgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xNSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4ODAwMCkgIC8qIFBpbiAxNSBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOX0FsbCAgICAgICAgICAgICAgICgodWludDE2X3QpMHhGRkZGKSAgLyogQWxsIHBpbnMgc2VsZWN0ZWQgKi8KKworI2RlZmluZSBHUElPX1BJTl9NQVNLICAgICAgICAgICAgICAoMHgwMDAwRkZGRnUpIC8qIFBJTiBtYXNrIGZvciBhc3NlcnQgdGVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX21vZGUgR1BJTyBtb2RlCisgICogQGJyaWVmIEdQSU8gQ29uZmlndXJhdGlvbiBNb2RlCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFgweXowMFlaCisgICogICAgICAgICAgIC0gWCAgOiBHUElPIG1vZGUgb3IgRVhUSSBNb2RlCisgICogICAgICAgICAgIC0geSAgOiBFeHRlcm5hbCBJVCBvciBFdmVudCB0cmlnZ2VyIGRldGVjdGlvbgorICAqICAgICAgICAgICAtIHogIDogSU8gY29uZmlndXJhdGlvbiBvbiBFeHRlcm5hbCBJVCBvciBFdmVudAorICAqICAgICAgICAgICAtIFkgIDogT3V0cHV0IHR5cGUgKFB1c2ggUHVsbCBvciBPcGVuIERyYWluKQorICAqICAgICAgICAgICAtIFogIDogSU8gRGlyZWN0aW9uIG1vZGUgKElucHV0LCBPdXRwdXQsIEFsdGVybmF0ZSBvciBBbmFsb2cpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwdSkgICAvKiE8IElucHV0IEZsb2F0aW5nIE1vZGUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9PVVRQVVRfUFAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxdSkgICAvKiE8IE91dHB1dCBQdXNoIFB1bGwgTW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9PVVRQVVRfT0QgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDExdSkgICAvKiE8IE91dHB1dCBPcGVuIERyYWluIE1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9BRl9QUCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAydSkgICAvKiE8IEFsdGVybmF0ZSBGdW5jdGlvbiBQdXNoIFB1bGwgTW9kZSAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9BRl9PRCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEydSkgICAvKiE8IEFsdGVybmF0ZSBGdW5jdGlvbiBPcGVuIERyYWluIE1vZGUgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9BTkFMT0cgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzdSkgICAvKiE8IEFuYWxvZyBNb2RlICAqLworI2RlZmluZSAgR1BJT19NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgICAgICAgKDB4MTAxMTAwMDB1KSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgKDB4MTAyMTAwMDB1KSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAgKDB4MTAzMTAwMDB1KSAgIC8qITwgRXh0ZXJuYWwgSW50ZXJydXB0IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAqLworI2RlZmluZSAgR1BJT19NT0RFX0VWVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgKDB4MTAxMjAwMDB1KSAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9FVlRfRkFMTElORyAgICAgICAgICAgICAgICAgICgweDEwMjIwMDAwdSkgICAvKiE8IEV4dGVybmFsIEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICAgICAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfRVZUX1JJU0lOR19GQUxMSU5HICAgICAgICAgICAoMHgxMDMyMDAwMHUpICAgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX3NwZWVkIEdQSU8gc3BlZWQKKyAgKiBAYnJpZWYgR1BJTyBPdXRwdXQgTWF4aW11bSBmcmVxdWVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX0xPVyAgICAgICAgKDB4MDAwMDAwMDB1KSAgLyohPCBMb3cgc3BlZWQgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fU1BFRURfRlJFUV9NRURJVU0gICAgICgweDAwMDAwMDAxdSkgIC8qITwgTWVkaXVtIHNwZWVkICAgICovCisjZGVmaW5lICBHUElPX1NQRUVEX0ZSRVFfSElHSCAgICAgICAoMHgwMDAwMDAwMnUpICAvKiE8IEhpZ2ggc3BlZWQgICAgICAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCAgKDB4MDAwMDAwMDN1KSAgLyohPCBWZXJ5IGhpZ2ggc3BlZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19wdWxsIEdQSU8gcHVsbAorICAqIEBicmllZiBHUElPIFB1bGwtVXAgb3IgUHVsbC1Eb3duIEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSAgR1BJT19OT1BVTEwgICAgICAgICgweDAwMDAwMDAwdSkgICAvKiE8IE5vIFB1bGwtdXAgb3IgUHVsbC1kb3duIGFjdGl2YXRpb24gICovCisjZGVmaW5lICBHUElPX1BVTExVUCAgICAgICAgKDB4MDAwMDAwMDF1KSAgIC8qITwgUHVsbC11cCBhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fUFVMTERPV04gICAgICAoMHgwMDAwMDAwMnUpICAgLyohPCBQdWxsLWRvd24gYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9NYWNyb3MgR1BJTyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgaXMgcmlzaW5nIGVkZ2UgYXNzZXJ0ZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19FWFRJX0xJTkVfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9SSVNJTkdfSVQoX19FWFRJX0xJTkVfXykgICAgICAgICAoRVhUSS0+UlBSMSAmIChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRVhUSSBsaW5lIHJpc2luZyBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfQ0xFQVJfUklTSU5HX0lUKF9fRVhUSV9MSU5FX18pICAgICAgIChFWFRJLT5SUFIxID0gKF9fRVhUSV9MSU5FX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgaXMgZmFsbGluZyBlZGdlIGFzc2VydGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRVhUSV9MSU5FX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfRkFMTElOR19JVChfX0VYVElfTElORV9fKSAgICAgICAgKEVYVEktPkZQUjEgJiAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEVYVEkgbGluZSBmYWxsaW5nIHBlbmRpbmcgYml0cy4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9GQUxMSU5HX0lUKF9fRVhUSV9MSU5FX18pICAgICAgKEVYVEktPkZQUjEgPSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBpcyBhc3NlcnRlZCBvciBub3QuCisgICogQHBhcmFtIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRVhUSV9MSU5FX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoX19FWFRJX0xJTkVfXykgICAgICAgICAoX19IQUxfR1BJT19FWFRJX0dFVF9SSVNJTkdfSVQoX19FWFRJX0xJTkVfXykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0dQSU9fRVhUSV9HRVRfRkFMTElOR19JVChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRVhUSSdzIGxpbmUgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKF9fRVhUSV9MSU5FX18pICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19IQUxfR1BJT19FWFRJX0NMRUFSX1JJU0lOR19JVChfX0VYVElfTElORV9fKTsgICAgIFwKKyAgICBfX0hBTF9HUElPX0VYVElfQ0xFQVJfRkFMTElOR19JVChfX0VYVElfTElORV9fKTsgICAgXAorICB9IHdoaWxlKDApCisKKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIFNvZnR3YXJlIGludGVycnVwdCBvbiBzZWxlY3RlZCBFWFRJIGxpbmUuCisgICogQHBhcmFtIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUoMC4uMTUpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0dQSU9fRVhUSV9HRU5FUkFURV9TV0lUKF9fRVhUSV9MSU5FX18pICAoRVhUSS0+U1dJRVIxIHw9IChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0VYVElfTElORV9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VUX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgX19IQUxfR1BJT19FWFRJX0dFVF9JVChfX0VYVElfTElORV9fKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBFWFRJIGxpbmUgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIGZsYWdzIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0NMRUFSX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9JVChfX0VYVElfTElORV9fKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX1ByaXZhdGVfTWFjcm9zIEdQSU8gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19HUElPX1BJTl9BQ1RJT04oQUNUSU9OKSAgKCgoQUNUSU9OKSA9PSBHUElPX1BJTl9SRVNFVCkgfHwgKChBQ1RJT04pID09IEdQSU9fUElOX1NFVCkpCisKKyNkZWZpbmUgSVNfR1BJT19QSU4oX19QSU5fXykgICAgICAgICgoKCh1aW50MzJfdCkoX19QSU5fXykgJiBHUElPX1BJTl9NQVNLKSAhPSAweDAwdSkgJiZcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpKF9fUElOX18pICYgfkdQSU9fUElOX01BU0spID09IDB4MDB1KSkKKworI2RlZmluZSBJU19HUElPX01PREUoX19NT0RFX18pICAgICAgKCgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JTlBVVCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9PVVRQVVRfUFApICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9PVVRQVVRfT0QpICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BRl9QUCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BRl9PRCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JVF9SSVNJTkcpICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JVF9GQUxMSU5HKSAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9JVF9SSVNJTkdfRkFMTElORykgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9FVlRfUklTSU5HKSAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9FVlRfRkFMTElORykgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9FVlRfUklTSU5HX0ZBTExJTkcpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEdQSU9fTU9ERV9BTkFMT0cpKQorCisjZGVmaW5lIElTX0dQSU9fU1BFRUQoX19TUEVFRF9fKSAgICAoKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9MT1cpICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfTUVESVVNKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0hJR0gpICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gpKQorCisjZGVmaW5lIElTX0dQSU9fUFVMTChfX1BVTExfXykgICAgICAoKChfX1BVTExfXykgPT0gR1BJT19OT1BVTEwpICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BVTExfXykgPT0gR1BJT19QVUxMVVApICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QVUxMX18pID09IEdQSU9fUFVMTERPV04pKQorLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBHUElPIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2dwaW9fZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCB1aW50MzJfdCBHUElPX1Bpbik7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1BJT19QaW5TdGF0ZSAgICAgSEFMX0dQSU9fUmVhZFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7Cit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19Xcml0ZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1BpbiwgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSk7Cit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19Ub2dnbGVQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0dQSU9fTG9ja1BpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1Bpbik7Cit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19FWFRJX0lSUUhhbmRsZXIodWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fRVhUSV9SaXNpbmdfQ2FsbGJhY2sodWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fRVhUSV9GYWxsaW5nX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfR1BJT19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9ncGlvX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9ncGlvX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2N2U2NQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2dwaW9fZXguaApAQCAtMCwwICsxLDQyMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfZ3Bpb19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0dQSU9fRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0dQSU9fRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXggR1BJT0V4CisgICogQGJyaWVmIEdQSU8gRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0V4cG9ydGVkX0NvbnN0YW50cyBHUElPRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPRXhfQWx0ZXJuYXRlX2Z1bmN0aW9uX3NlbGVjdGlvbiBHUElPRXggQWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZCAoU1RNMzJHMDcxeHgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1RNMzJHMDgxeHggLyBTVE0zMkcwNzF4eCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgICogQGJyaWVmICAgQUYgMCBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjBfQ0VDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgQ0VDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9PU0MzMiAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBPU0MzMiAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTV0ogKFNXRCkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQzICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VDUEQxICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVDUEQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VDUEQyICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVDUEQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDEgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYxX0NFQyAgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IENFQyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9JUiAgICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9MUFVBUlQxICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBMUFVBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9TUEkxICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0zICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVVNBUlQ0ICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVVNBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VDUEQxICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVDUEQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VDUEQyICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVDUEQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNMSAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IExQVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9MUFRJTTIgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBMUFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0yICAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE1ICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE2ICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTE2IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTE3ICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTE3IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYzX1VDUEQxICAgICAgICAgKCh1aW50OF90KTB4MDMpICAvKiE8IFVDUEQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYzX1VDUEQyICAgICAgICAgKCh1aW50OF90KTB4MDMpICAvKiE8IFVDUEQyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDQgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUY0X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTQgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVElNMTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMyAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IFVTQVJUMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDQgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBVU0FSVDQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVUNQRDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVUNQRDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVUNQRDIgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVUNQRDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjVfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0xQVElNMiAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IExQVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNiAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNyAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VU0FSVDMgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBVU0FSVDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNiBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JMkMyICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0xQVUFSVDEgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IExQVUFSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfVUNQRDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgVUNQRDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfVUNQRDIgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgVUNQRDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgQ09NUDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjdfQ09NUDIgICAgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgQ09NUDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjdfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKyNlbmRpZiAvKiBTVE0zMkcwODF4eCB8fCBTVE0zMkcwNzF4eCAqLworCisjaWYgZGVmaW5lZCAoU1RNMzJHMDcweHgpCisvKioKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9JUiAgICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9PU0MzMiAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBPU0MzMiAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTV0ogKFNXRCkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfVVNBUlQzICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDEgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYxX0lSICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IElSIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9TUEkxICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0zICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVVNBUlQ0ICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVVNBUlQ0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTQgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTUgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTUgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTYgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24KKyAgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNCAgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBUSU0xNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNSAgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDEgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjRfVVNBUlQzICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgVVNBUlQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUNCAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IFVTQVJUNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNSAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNiAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNyAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9VU0FSVDMgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBVU0FSVDMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNiBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfSTJDMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgSTJDMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNl9JMkMyICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBJMkMyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDcgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUY3X0VWRU5UT1VUICAgICAgKCh1aW50OF90KTB4MDcpICAvKiE8IEVWRU5UT1VUIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisKKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAoKEFGKSA8PSAodWludDhfdCkweDA3KQorCisjZW5kaWYgLyogU1RNMzJHMDcweHggKi8KKworI2lmIGRlZmluZWQgKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkIChTVE0zMkcwNDF4eCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkcwNDF4eCAvIFNUTTMyRzAzMXh4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9JUiAgICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9PU0MzMiAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBPU0MzMiAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTV0ogKFNXRCkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9PU0MgICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBPU0MgKEJ5IHBhc3MgYW5kIEVuYWJsZSkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0xICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1RJTTMgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFRJTTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVVNBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VTQVJUMiAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVTQVJUMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiAyIHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGMl9USU0xICAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTIgICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTQgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTYgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMyBzZWxlY3Rpb24KKyAgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfU1BJMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgU1BJMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9USU0xNCAgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBUSU0xNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNF9VU0FSVDEgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBVU0FSVDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNSBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjVfTFBUSU0xICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X0xQVElNMiAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IExQVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNiAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNyAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNl9JMkMxICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjZfTFBVQVJUMSAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGN19FVkVOVE9VVCAgICAgICgodWludDhfdCkweDA3KSAgLyohPCBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisjZGVmaW5lIElTX0dQSU9fQUYoQUYpICAgICAgICAgKChBRikgPD0gKHVpbnQ4X3QpMHgwNykKKworI2VuZGlmIC8qIFNUTTMyRzAzMXh4IHx8IFNUTTMyRzA0MXh4ICovCisKKyNpZiBkZWZpbmVkIChTVE0zMkcwMzB4eCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTVE0zMkcwMzB4eCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAgKiBAYnJpZWYgICBBRiAwIHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGMF9FVkVOVE9VVCAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9JUiAgICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBNQ08gKE1DTzEgYW5kIE1DTzIpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX09TQyAgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IE9TQyAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9PU0MzMiAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBPU0MzMiAoQnkgcGFzcyBhbmQgRW5hYmxlKSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TV0ogICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTV0ogKFNXRCkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjBfU1BJMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9TUEkyICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYwX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMF9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMSBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjFfSVIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgSVIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfT1NDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgT1NDIChCeSBwYXNzIGFuZCBFbmFibGUpIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9USU0zICAgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBUSU0zIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUYxX1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMV9VU0FSVDIgICAgICAgICgodWludDhfdCkweDAxKSAgLyohPCBVU0FSVDIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMiBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjJfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNCAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0xNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNiAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGMl9USU0xNyAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiAzIHNlbGVjdGlvbgorICAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA0IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNF9TUEkyICAgICAgICAgICgodWludDhfdCkweDA0KSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1RJTTE0ICAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IFRJTTE0IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY0X1VTQVJUMSAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IFVTQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBTUEkyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY1X1NQSTIgICAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgR1BJT19BRjVfVElNMSAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNiAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworI2RlZmluZSBHUElPX0FGNV9USU0xNyAgICAgICAgICgodWludDhfdCkweDA1KSAgLyohPCBUSU0xNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNl9JMkMxICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBJMkMxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICovCisjZGVmaW5lIEdQSU9fQUY2X0kyQzIgICAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IEkyQzIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNyBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjdfRVZFTlRPVVQgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgRVZFTlRPVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgKi8KKworI2RlZmluZSBJU19HUElPX0FGKEFGKSAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MDcpCisKKyNlbmRpZiAvKiBTVE0zMkcwMzB4eCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPRXhfRXhwb3J0ZWRfTWFjcm9zIEdQSU9FeCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9HZXRfUG9ydF9JbmRleCBHUElPRXggR2V0IFBvcnQgSW5kZXgKKyogQHsKKyAgKi8KKyNkZWZpbmUgR1BJT19HRVRfSU5ERVgoX19HUElPeF9fKSAgICAoKChfX0dQSU94X18pID09IChHUElPQSkpPyAwdUwgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQikpPyAxdUwgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPQykpPyAydUwgOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU94X18pID09IChHUElPRCkpPyAzdUwgOiA1dUwpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9HUElPX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2kyYy5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1ZDVmYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2kyYy5oCkBAIC0wLDAgKzEsNzgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9pMmMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSTJDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9JMkNfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0kyQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX1R5cGVzIEkyQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0NvbmZpZ3VyYXRpb25fU3RydWN0dXJlX2RlZmluaXRpb24gSTJDIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEkyQyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWluZzsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMkNfVElNSU5HUl9yZWdpc3RlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYWxjdWxhdGVkIGJ5IHJlZmVycmluZyB0byBJMkMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBSZWZlcmVuY2UgbWFudWFsICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczE7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpcnN0IGRldmljZSBvd24gYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBvciAxMC1iaXQgYWRkcmVzcy4gKi8KKworICB1aW50MzJfdCBBZGRyZXNzaW5nTW9kZTsgICAgICAvKiE8IFNwZWNpZmllcyBpZiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0FERFJFU1NJTkdfTU9ERSAqLworCisgIHVpbnQzMl90IER1YWxBZGRyZXNzTW9kZTsgICAgIC8qITwgU3BlY2lmaWVzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0RVQUxfQUREUkVTU0lOR19NT0RFICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczI7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MyTWFza3M7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY2tub3dsZWRnZSBtYXNrIGFkZHJlc3Mgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX09XTl9BRERSRVNTMl9NQVNLUyAqLworCisgIHVpbnQzMl90IEdlbmVyYWxDYWxsTW9kZTsgICAgIC8qITwgU3BlY2lmaWVzIGlmIGdlbmVyYWwgY2FsbCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0dFTkVSQUxfQ0FMTF9BRERSRVNTSU5HX01PREUgKi8KKworICB1aW50MzJfdCBOb1N0cmV0Y2hNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBub3N0cmV0Y2ggbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19OT1NUUkVUQ0hfTU9ERSAqLworCit9IEkyQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfc3RhdGVfc3RydWN0dXJlX2RlZmluaXRpb24gSEFMIHN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIEkyQyBTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOlxuCisgICogICAgICAgICAgYjctYjYgIEVycm9yIGluZm9ybWF0aW9uXG4KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yXG4KKyAgKiAgICAgICAgICAgICAwMSA6IEFib3J0IChBYm9ydCB1c2VyIHJlcXVlc3Qgb24gZ29pbmcpXG4KKyAgKiAgICAgICAgICAgICAxMCA6IFRpbWVvdXRcbgorICAqICAgICAgICAgICAgIDExIDogRXJyb3JcbgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1c1xuCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAocGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpXG4KKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAocGVyaXBoZXJhbCBpbml0aWFsaXplZCBhbmQgcmVhZHkgdG8gdXNlLiBIQUwgSTJDIEluaXQgZnVuY3Rpb24gY2FsbGVkKVxuCisgICogICAgICAgICAgYjQgICAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwXG4KKyAgKiAgICAgICAgICBiM1xuCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSBvciBCdXN5IChObyBMaXN0ZW4gbW9kZSBvbmdvaW5nKVxuCisgICogICAgICAgICAgICAgMSAgOiBMaXN0ZW4gKHBlcmlwaGVyYWwgaW4gQWRkcmVzcyBMaXN0ZW4gTW9kZSlcbgorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZVxuCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeVxuCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChwZXJpcGhlcmFsIGJ1c3kgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24gb3IgaW50ZXJuYWwgb3BlcmF0aW9ucylcbgorICAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZVxuCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpXG4KKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKVxuCisgICogICAgICAgICAgYjAgICAgIFR4IHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZylcbgorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCB5ZXQgSW5pdGlhbGl6ZWQgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgyNFUsICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgyMVUsICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0xJU1RFTiAgICAgICAgICAgID0gMHgyOFUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOICAgID0gMHgyOVUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGFuZCBEYXRhIFRyYW5zbWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOICAgID0gMHgyQVUsICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGFuZCBEYXRhIFJlY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0FCT1JUICAgICAgICAgICAgID0gMHg2MFUsICAgLyohPCBBYm9ydCB1c2VyIHJlcXVlc3Qgb25nb2luZyAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHhBMFUsICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHhFMFUgICAgLyohPCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9JMkNfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9tb2RlX3N0cnVjdHVyZV9kZWZpbml0aW9uIEhBTCBtb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgTW9kZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgSTJDIE1vZGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDpcbgorICAqICAgICAgICAgIGI3ICAgICAobm90IHVzZWQpXG4KKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMFxuCisgICogICAgICAgICAgYjZcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBNZW1vcnkgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNZW1vcnkgTW9kZSlcbgorICAqICAgICAgICAgIGI1XG4KKyAgKiAgICAgICAgICAgICAwICA6IE5vbmVcbgorICAqICAgICAgICAgICAgIDEgIDogU2xhdmUgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBTbGF2ZSBNb2RlKVxuCisgICogICAgICAgICAgYjRcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBNYXN0ZXIgKEhBTCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNYXN0ZXIgTW9kZSlcbgorICAqICAgICAgICAgIGIzLWIyLWIxLWIwICAobm90IHVzZWQpXG4KKyAgKiAgICAgICAgICAgICB4eHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAwCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX01PREVfTk9ORSAgICAgICAgICAgICAgID0gMHgwMFUsICAgLyohPCBObyBJMkMgY29tbXVuaWNhdGlvbiBvbiBnb2luZyAgICAgICAgICAgICAqLworICBIQUxfSTJDX01PREVfTUFTVEVSICAgICAgICAgICAgID0gMHgxMFUsICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNYXN0ZXIgTW9kZSAgICAgICAqLworICBIQUxfSTJDX01PREVfU0xBVkUgICAgICAgICAgICAgID0gMHgyMFUsICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBTbGF2ZSBNb2RlICAgICAgICAqLworICBIQUxfSTJDX01PREVfTUVNICAgICAgICAgICAgICAgID0gMHg0MFUgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBpcyBpbiBNZW1vcnkgTW9kZSAgICAgICAqLworCit9IEhBTF9JMkNfTW9kZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBJMkMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBJMkMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9OT05FICAgICAgKDB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX0JFUlIgICAgICAoMHgwMDAwMDAwMVUpICAgIC8qITwgQkVSUiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfQVJMTyAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBBUkxPIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9BRiAgICAgICAgKDB4MDAwMDAwMDRVKSAgICAvKiE8IEFDS0YgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX09WUiAgICAgICAoMHgwMDAwMDAwOFUpICAgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfRE1BICAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9USU1FT1VUICAgKDB4MDAwMDAwMjBVKSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX1NJWkUgICAgICAoMHgwMDAwMDA0MFUpICAgIC8qITwgU2l6ZSBNYW5hZ2VtZW50IGVycm9yICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNICgweDAwMDAwMDgwVSkgICAgLyohPCBETUEgUGFyYW1ldGVyIEVycm9yICAgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgKDB4MDAwMDAxMDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNICAgICAoMHgwMDAwMDIwMFUpICAgIC8qITwgSW52YWxpZCBQYXJhbWV0ZXJzIGVycm9yICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfaGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIEkyQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEkyQyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZgoreworICBJMkNfVHlwZURlZiAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBJMkMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAqLworCisgIEkyQ19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJMkMgdHJhbnNmZXIgYnVmZmVyICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBYZmVyU2l6ZTsgICAgICAgLyohPCBJMkMgdHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFhmZXJDb3VudDsgICAgICAvKiE8IEkyQyB0cmFuc2ZlciBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgWGZlck9wdGlvbnM7ICAgIC8qITwgSTJDIHNlcXVhbnRpYWwgdHJhbnNmZXIgb3B0aW9ucywgdGhpcyBwYXJhbWV0ZXIgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBQcmV2aW91c1N0YXRlOyAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBQcmV2aW91cyBzdGF0ZSAgICAgICAgICAqLworCisgIEhBTF9TdGF0dXNUeXBlRGVmKCpYZmVySVNSKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsgIC8qITwgSTJDIHRyYW5zZmVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXR4OyAgICAgICAgLyohPCBJMkMgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hcng7ICAgICAgICAvKiE8IEkyQyBSeCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgTG9jazsgICAgICAgICAgIC8qITwgSTJDIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9JMkNfU3RhdGVUeXBlRGVmICBTdGF0ZTsgICAgICAgICAgLyohPCBJMkMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0kyQ19Nb2RlVHlwZURlZiAgIE1vZGU7ICAgICAgICAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIG1vZGUgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgIC8qITwgSTJDIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBBZGRyRXZlbnRDb3VudDsgLyohPCBJMkMgQWRkcmVzcyBFdmVudCBjb3VudGVyICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIE1hc3RlclR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAvKiE8IEkyQyBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogTWFzdGVyUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgIC8qITwgSTJDIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBTbGF2ZVR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgLyohPCBJMkMgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqIFNsYXZlUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAvKiE8IEkyQyBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogTGlzdGVuQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgIC8qITwgSTJDIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNZW1UeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgLyohPCBJMkMgTWVtb3J5IFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIE1lbVJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBNZW1vcnkgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgICAgIC8qITwgSTJDIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgLyohPCBJMkMgQWJvcnQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWRkckNhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7ICAvKiE8IEkyQyBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAgICAgLyohPCBJMkMgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IEkyQ19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgSTJDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJDX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCAgICAgID0gMHgwMFUsICAgIC8qITwgSTJDIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9JMkNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAxVSwgICAgLyohPCBJMkMgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX0kyQ19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCAgICAgICA9IDB4MDJVLCAgICAvKiE8IEkyQyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfSTJDX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgID0gMHgwM1UsICAgIC8qITwgSTJDIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9JMkNfTElTVEVOX0NPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDA0VSwgICAgLyohPCBJMkMgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19NRU1fVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IEkyQyBNZW1vcnkgVHggVHJhbnNmZXIgY2FsbGJhY2sgSUQgICAgICAgICAgICAqLworICBIQUxfSTJDX01FTV9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwNlUsICAgIC8qITwgSTJDIE1lbW9yeSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9JMkNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA3VSwgICAgLyohPCBJMkMgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19BQk9SVF9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IEkyQyBBYm9ydCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9JMkNfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA5VSwgICAgLyohPCBJMkMgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEFVICAgICAvKiE8IEkyQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIEkyQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwSTJDX0NhbGxiYWNrVHlwZURlZikoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAvKiE8IHBvaW50ZXIgdG8gYW4gSTJDIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmICB2b2lkICgqcEkyQ19BZGRyQ2FsbGJhY2tUeXBlRGVmKShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7IC8qITwgcG9pbnRlciB0byBhbiBJMkMgQWRkcmVzcyBNYXRjaCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19YRkVST1BUSU9OUyAgSTJDIFNlcXVlbnRpYWwgVHJhbnNmZXIgT3B0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19GSVJTVF9GUkFNRSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfTkVYVF9GUkFNRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKEkyQ19SRUxPQURfTU9ERSB8IEkyQ19TT0ZURU5EX01PREUpKQorI2RlZmluZSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUgICAgICAgICgodWludDMyX3QpSTJDX0FVVE9FTkRfTU9ERSkKKyNkZWZpbmUgSTJDX0xBU1RfRlJBTUUgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUkyQ19BVVRPRU5EX01PREUpCisjZGVmaW5lIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1AgICAgICAgICAgKCh1aW50MzJfdClJMkNfU09GVEVORF9NT0RFKQorCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIGluIGFsbCB1c2UgY2FzZXMgKGRpcmVjdGlvbiBjaGFuZ2Ugb3Igbm90KQorICovCisjZGVmaW5lICBJMkNfT1RIRVJfRlJBTUUgICAgICAgICAgICAgICAgKDB4MDAwMDAwQUFVKQorI2RlZmluZSAgSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FICAgICAgICgweDAwMDBBQTAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0FERFJFU1NJTkdfTU9ERSBJMkMgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0FERFJFU1NJTkdNT0RFXzdCSVQgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRFVBTF9BRERSRVNTSU5HX01PREUgSTJDIER1YWwgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEUgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19EVUFMQUREUkVTU19FTkFCTEUgICAgICAgICAgSTJDX09BUjJfT0EyRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX09XTl9BRERSRVNTMl9NQVNLUyBJMkMgT3duIEFkZHJlc3MyIE1hc2tzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX09BMl9OT01BU0sgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzAxICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBJMkNfT0EyX01BU0swMiAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDMgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA0ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBJMkNfT0EyX01BU0swNSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDYgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA3ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfR0VORVJBTF9DQUxMX0FERFJFU1NJTkdfTU9ERSBJMkMgR2VuZXJhbCBDYWxsIEFkZHJlc3NpbmcgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMkNfR0VORVJBTENBTExfRU5BQkxFICAgICAgICAgIEkyQ19DUjFfR0NFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTk9TVFJFVENIX01PREUgSTJDIE5vLVN0cmV0Y2ggTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRElTQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMkNfTk9TVFJFVENIX0VOQUJMRSAgICAgICAgICAgIEkyQ19DUjFfTk9TVFJFVENICisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19NRU1PUllfQUREUkVTU19TSVpFIEkyQyBNZW1vcnkgQWRkcmVzcyBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX01FTUFERF9TSVpFXzhCSVQgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIEkyQ19NRU1BRERfU0laRV8xNkJJVCAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfWEZFUkRJUkVDVElPTiBJMkMgVHJhbnNmZXIgRGlyZWN0aW9uIE1hc3RlciBQb2ludCBvZiBWaWV3CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RJUkVDVElPTl9UUkFOU01JVCAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19ESVJFQ1RJT05fUkVDRUlWRSAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfUkVMT0FEX0VORF9NT0RFIEkyQyBSZWxvYWQgRW5kIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSAgSTJDX1JFTE9BRF9NT0RFICAgICAgICAgICAgICAgIEkyQ19DUjJfUkVMT0FECisjZGVmaW5lICBJMkNfQVVUT0VORF9NT0RFICAgICAgICAgICAgICAgSTJDX0NSMl9BVVRPRU5ECisjZGVmaW5lICBJMkNfU09GVEVORF9NT0RFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfU1RBUlRfU1RPUF9NT0RFIEkyQyBTdGFydCBvciBTdG9wIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSAgSTJDX05PX1NUQVJUU1RPUCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgIEkyQ19HRU5FUkFURV9TVE9QICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVE9QKQorI2RlZmluZSAgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pCisjZGVmaW5lICBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uIEkyQyBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmIEkyQyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWFhYWAorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEludGVycnVwdCBjb250cm9sIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfSVRfRVJSSSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfRVJSSUUKKyNkZWZpbmUgSTJDX0lUX1RDSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RDSUUKKyNkZWZpbmUgSTJDX0lUX1NUT1BJICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRQorI2RlZmluZSBJMkNfSVRfTkFDS0kgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTkFDS0lFCisjZGVmaW5lIEkyQ19JVF9BRERSSSAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9BRERSSUUKKyNkZWZpbmUgSTJDX0lUX1JYSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUKKyNkZWZpbmUgSTJDX0lUX1RYSSAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RYSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0ZsYWdfZGVmaW5pdGlvbiBJMkMgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYRQorI2RlZmluZSBJMkNfRkxBR19UWElTICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhJUworI2RlZmluZSBJMkNfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUlhORQorI2RlZmluZSBJMkNfRkxBR19BRERSICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUREUgorI2RlZmluZSBJMkNfRkxBR19BRiAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfTkFDS0YKKyNkZWZpbmUgSTJDX0ZMQUdfU1RPUEYgICAgICAgICAgICAgICAgICBJMkNfSVNSX1NUT1BGCisjZGVmaW5lIEkyQ19GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQworI2RlZmluZSBJMkNfRkxBR19UQ1IgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVENSCisjZGVmaW5lIEkyQ19GTEFHX0JFUlIgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CRVJSCisjZGVmaW5lIEkyQ19GTEFHX0FSTE8gICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPCisjZGVmaW5lIEkyQ19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9PVlIKKyNkZWZpbmUgSTJDX0ZMQUdfUEVDRVJSICAgICAgICAgICAgICAgICBJMkNfSVNSX1BFQ0VSUgorI2RlZmluZSBJMkNfRkxBR19USU1FT1VUICAgICAgICAgICAgICAgIEkyQ19JU1JfVElNRU9VVAorI2RlZmluZSBJMkNfRkxBR19BTEVSVCAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUxFUlQKKyNkZWZpbmUgSTJDX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JVU1kKKyNkZWZpbmUgSTJDX0ZMQUdfRElSICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0RJUgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfTWFjcm9zIEkyQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IEkyQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0kyQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSTJDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSTJDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19UWElTICAgIFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19SWE5FICAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BRiAgICAgIEFja25vd2xlZGdlIGZhaWx1cmUgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RDUiAgICAgVHJhbnNmZXIgY29tcGxldGUgcmVsb2FkCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19CVVNZICAgIEJ1cyBidXN5CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIEkyQ19GTEFHX01BU0sgICgweDAwMDFGRkZGVSkKKyNkZWZpbmUgX19IQUxfSTJDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJMkMgcGVuZGluZyBmbGFncyB3aGljaCBhcmUgY2xlYXJlZCBieSB3cml0aW5nIDEgaW4gYSBzcGVjaWZpYyBiaXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RYRSAgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FERFIgICAgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FGICAgICAgQWNrbm93bGVkZ2UgZmFpbHVyZSByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19GTEFHX18pID09IEkyQ19GTEFHX1RYRSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSIHw9IChfX0ZMQUdfXykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIEkyQyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIEkyQ19DUjJfTkFDSykpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEkyQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9pMmNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0RlSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTXNwSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTXNwRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEkyQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBIQUxfSTJDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBwSTJDX0FkZHJDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfVW5SZWdpc3RlckFkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRGlzYWJsZUxpc3Rlbl9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcyk7CisKKy8qKioqKioqIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1JlYWRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisvKioqKioqKiBJMkMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKi8KK3ZvaWQgSEFMX0kyQ19FVl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19FUl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0FkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7Cit2b2lkIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSwgTW9kZSBhbmQgRXJyb3IgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSTJDX1N0YXRlVHlwZURlZiBIQUxfSTJDX0dldFN0YXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9JMkNfTW9kZVR5cGVEZWYgIEhBTF9JMkNfR2V0TW9kZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfSTJDX0dldEVycm9yKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfQ29uc3RhbnRzIEkyQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX01hY3JvIEkyQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfSTJDX0FERFJFU1NJTkdfTU9ERShNT0RFKSAgICAoKChNT0RFKSA9PSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkpCisKKyNkZWZpbmUgSVNfSTJDX0RVQUxfQUREUkVTUyhBRERSRVNTKSAgICAoKChBRERSRVNTKSA9PSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpID09IEkyQ19EVUFMQUREUkVTU19FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19PV05fQUREUkVTUzJfTUFTSyhNQVNLKSAgKCgoTUFTSykgPT0gSTJDX09BMl9OT01BU0spICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzAzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzA2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDcpKQorCisjZGVmaW5lIElTX0kyQ19HRU5FUkFMX0NBTEwoQ0FMTCkgICAgICAgKCgoQ0FMTCkgPT0gSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDQUxMKSA9PSBJMkNfR0VORVJBTENBTExfRU5BQkxFKSkKKworI2RlZmluZSBJU19JMkNfTk9fU1RSRVRDSChTVFJFVENIKSAgICAgICgoKFNUUkVUQ0gpID09IEkyQ19OT1NUUkVUQ0hfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUUkVUQ0gpID09IEkyQ19OT1NUUkVUQ0hfRU5BQkxFKSkKKworI2RlZmluZSBJU19JMkNfTUVNQUREX1NJWkUoU0laRSkgICAgICAgICgoKFNJWkUpID09IEkyQ19NRU1BRERfU0laRV84QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gSTJDX01FTUFERF9TSVpFXzE2QklUKSkKKworI2RlZmluZSBJU19UUkFOU0ZFUl9NT0RFKE1PREUpICAgICAgICAgICgoKE1PREUpID09IEkyQ19SRUxPQURfTU9ERSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX0FVVE9FTkRfTU9ERSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEkyQ19TT0ZURU5EX01PREUpKQorCisjZGVmaW5lIElTX1RSQU5TRkVSX1JFUVVFU1QoUkVRVUVTVCkgICAgKCgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUT1ApICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX05PX1NUQVJUU1RPUCkpCisKKyNkZWZpbmUgSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAgKCgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0ZSQU1FKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTkVYVF9GUkFNRSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0FORF9MQVNUX0ZSQU1FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19MQVNUX0ZSQU1FKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTEFTVF9GUkFNRV9OT19TVE9QKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkpCisKKyNkZWZpbmUgSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAoKChSRVFVRVNUKSA9PSBJMkNfT1RIRVJfRlJBTUUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FKSkKKworI2RlZmluZSBJMkNfUkVTRVRfQ1IyKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdCkoSTJDX0NSMl9TQUREIHwgSTJDX0NSMl9IRUFEMTBSIHwgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX1JFTE9BRCB8IEkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgSTJDX0dFVF9BRERSX01BVENIKF9fSEFORExFX18pICAgICAgICAgICAgKCh1aW50MTZfdCkoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfQUREQ09ERSkgPj4gMTZVKSkKKyNkZWZpbmUgSTJDX0dFVF9ESVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KSgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9ESVIpID4+IDE2VSkpCisjZGVmaW5lIEkyQ19HRVRfU1RPUF9NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX0FVVE9FTkQpCisjZGVmaW5lIEkyQ19HRVRfT1dOX0FERFJFU1MxKF9fSEFORExFX18pICAgICAgICAgICgodWludDE2X3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk9BUjEgJiBJMkNfT0FSMV9PQTEpKQorI2RlZmluZSBJMkNfR0VUX09XTl9BRERSRVNTMihfX0hBTkRMRV9fKSAgICAgICAgICAoKHVpbnQxNl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5PQVIyICYgSTJDX09BUjJfT0EyKSkKKworI2RlZmluZSBJU19JMkNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAgICAgICAgICAgICAoKEFERFJFU1MxKSA8PSAweDAwMDAwM0ZGVSkKKyNkZWZpbmUgSVNfSTJDX09XTl9BRERSRVNTMihBRERSRVNTMikgICAgICAgICAgICAgKChBRERSRVNTMikgPD0gKHVpbnQxNl90KTB4MDBGRlUpCisKKyNkZWZpbmUgSTJDX01FTV9BRERfTVNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKCgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4RkYwMFUpKSkgPj4gOFUpKSkKKyNkZWZpbmUgSTJDX01FTV9BRERfTFNCKF9fQUREUkVTU19fKSAgICAgICAgICAgICAgKCh1aW50OF90KSgodWludDE2X3QpKChfX0FERFJFU1NfXykgJiAodWludDE2X3QpKDB4MDBGRlUpKSkpCisKKyNkZWZpbmUgSTJDX0dFTkVSQVRFX1NUQVJUKF9fQURETU9ERV9fLF9fQUREUkVTU19fKSAoKChfX0FERE1PREVfXykgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzdCSVQpID8gKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfU1RBUlQpIHwgKEkyQ19DUjJfQVVUT0VORCkpICYgKH5JMkNfQ1IyX1JEX1dSTikpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX0FERDEwKSB8IChJMkNfQ1IyX1NUQVJUKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgSTJDX0NIRUNLX0ZMQUcoX19JU1JfXywgX19GTEFHX18pICAgICAgICAgKCgoKF9fSVNSX18pICYgKChfX0ZMQUdfXykgJiBJMkNfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBJMkNfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKyNkZWZpbmUgSTJDX0NIRUNLX0lUX1NPVVJDRShfX0NSMV9fLCBfX0lUX18pICAgICAgKCgoKF9fQ1IxX18pICYgKF9fSVRfXykpID09IChfX0lUX18pKSA/IFNFVCA6IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmcweHhfaGFsX2kyYy5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfSTJDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2kyY19leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfaTJjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1NmI3YwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2kyY19leC5oCkBAIC0wLDAgKzEsMTU4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9pMmNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSTJDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9JMkNfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0kyQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9FeHBvcnRlZF9Db25zdGFudHMgSTJDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfQW5hbG9nX0ZpbHRlciBJMkMgRXh0ZW5kZWQgQW5hbG9nIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFICAgICAgICBJMkNfQ1IxX0FORk9GRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9GYXN0TW9kZVBsdXMgSTJDIEV4dGVuZGVkIEZhc3QgTW9kZSBQbHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQTkgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BBOV9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQTkgICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQTEwICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BBMTBfRk1QICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQTEwICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjYgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCNl9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjYgICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjcgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCN19GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjcgICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjggICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjggICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19QQjkgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQjkgICAgICAgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19JMkMxICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDMV9GTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMxIHBpbnMgKi8KKyNkZWZpbmUgSTJDX0ZBU1RNT0RFUExVU19JMkMyICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDMl9GTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBJMkMyIHBpbnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0NvbmZpZ0FuYWxvZ0ZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgQW5hbG9nRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9Db25maWdEaWdpdGFsRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9FbmFibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0Rpc2FibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cyk7Cit2b2lkIEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cyk7CisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfQ29uc3RhbnRzIEkyQyBFeHRlbmRlZCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfTWFjcm8gSTJDIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfSTJDX0FOQUxPR19GSUxURVIoRklMVEVSKSAgICAoKChGSUxURVIpID09IEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPT0gSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19JMkNfRElHSVRBTF9GSUxURVIoRklMVEVSKSAgICgoRklMVEVSKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19JMkNfRkFTVE1PREVQTFVTKF9fQ09ORklHX18pICgoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BBOSkpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BBOSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQTEwKSkgPT0gSTJDX0ZBU1RNT0RFUExVU19QQTEwKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI2KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI2KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BCNykpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BCNykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQjgpKSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjgpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI5KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI5KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX0kyQzEpKSA9PSBJMkNfRkFTVE1PREVQTFVTX0kyQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19JMkMyKSkgPT0gSTJDX0ZBU1RNT0RFUExVU19JMkMyKSkKKworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmcweHhfaGFsX2kyY19leC5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0kyQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9pMnMuaCBiL0luYy9zdG0zMmcweHhfaGFsX2kycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWE3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9pMnMuaApAQCAtMCwwICsxLDU0OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfaTJzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyUyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfSTJTX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9JMlNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfU1VQUE9SVCkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyUworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19FeHBvcnRlZF9UeXBlcyBJMlMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSTJTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMlMgb3BlcmF0aW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTW9kZSAqLworCisgIHVpbnQzMl90IFN0YW5kYXJkOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCB1c2VkIGZvciB0aGUgSTJTIGNvbW11bmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfU3RhbmRhcmQgKi8KKworICB1aW50MzJfdCBEYXRhRm9ybWF0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGF0YSBmb3JtYXQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19EYXRhX0Zvcm1hdCAqLworCisgIHVpbnQzMl90IE1DTEtPdXRwdXQ7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEkyUyBNQ0xLIG91dHB1dCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19NQ0xLX091dHB1dCAqLworCisgIHVpbnQzMl90IEF1ZGlvRnJlcTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgc2VsZWN0ZWQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19BdWRpb19GcmVxdWVuY3kgKi8KKworICB1aW50MzJfdCBDUE9MOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaWRsZSBzdGF0ZSBvZiB0aGUgSTJTIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0Nsb2NrX1BvbGFyaXR5ICovCit9IEkyU19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0kyU19TVEFURV9SRVNFVCAgICAgID0gMHgwMFUsICAvKiE8IEkyUyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAgICAgICAgICAgICAgICovCisgIEhBTF9JMlNfU1RBVEVfUkVBRFkgICAgICA9IDB4MDFVLCAgLyohPCBJMlMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJTX1NUQVRFX0JVU1kgICAgICAgPSAweDAyVSwgIC8qITwgSTJTIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19TVEFURV9CVVNZX1RYICAgID0gMHgwM1UsICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICovCisgIEhBTF9JMlNfU1RBVEVfQlVTWV9SWCAgICA9IDB4MDRVLCAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJTX1NUQVRFX1RJTUVPVVQgICAgPSAweDA2VSwgIC8qITwgSTJTIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19TVEFURV9FUlJPUiAgICAgID0gMHgwN1UgICAvKiE8IEkyUyBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9JMlNfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgSTJTIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIFNQSV9UeXBlRGVmICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgLyohPCBJMlMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLworCisgIEkyU19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgLyohPCBJMlMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAvKiE8IFBvaW50ZXIgdG8gSTJTIFR4IHRyYW5zZmVyIGJ1ZmZlciAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgLyohPCBJMlMgVHggdHJhbnNmZXIgc2l6ZSAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgLyohPCBJMlMgVHggdHJhbnNmZXIgQ291bnRlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIEkyUyBSeCB0cmFuc2ZlciBidWZmZXIgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgIC8qITwgSTJTIFJ4IHRyYW5zZmVyIHNpemUgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgIC8qITwgSTJTIFJ4IHRyYW5zZmVyIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSB2YWx1ZSBhcyB0cmFuc2ZlciBzaXplIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zZmVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZW1lbnRlZCB3aGVuIGEgc2FtcGxlIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5iU2FtcGxlc1JlY2VpdmVkID0gUnhCdWZmZXJTaXplLVJ4QnVmZmVyQ291bnQpICovCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hdHg7ICAgICAgLyohPCBJMlMgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWFyeDsgICAgICAvKiE8IEkyUyBSeCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBfX0lPIEhBTF9Mb2NrVHlwZURlZiAgICAgICBMb2NrOyAgICAgICAgIC8qITwgSTJTIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyBIQUxfSTJTX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAvKiE8IEkyUyBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAvKiE8IEkyUyBFcnJvciBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19FcnJvciAqLworCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgdm9pZCAoKiBUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAgICAvKiE8IEkyUyBUeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAgICAvKiE8IEkyUyBSeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAvKiE8IEkyUyBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICAgKi8KKyAgdm9pZCAoKiBSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAvKiE8IEkyUyBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19JMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7ICAgICAgICAgICAgICAvKiE8IEkyUyBFcnJvciBjYWxsYmFjayAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0kyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsgICAgICAgICAgICAvKiE8IEkyUyBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOyAgICAgICAgICAvKiE8IEkyUyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gSTJTX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBIQUwgSTJTIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfSTJTX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgSTJTIFR4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9JMlNfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBJMlMgUnggQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0kyU19UWF9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICA9IDB4MDNVLCAgICAvKiE8IEkyUyBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfSTJTX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgID0gMHgwNFUsICAgIC8qITwgSTJTIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovCisgIEhBTF9JMlNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBJMlMgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0kyU19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IEkyUyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfSTJTX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwOFUgICAgIC8qITwgSTJTIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICovCisKK30gSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgSTJTIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBJMlNfQ2FsbGJhY2tUeXBlRGVmKShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7IC8qITwgcG9pbnRlciB0byBhbiBJMlMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX0NvbnN0YW50cyBJMlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0Vycm9yIEkyUyBFcnJvcgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfTk9ORSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfVElNRU9VVCAgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfT1ZSICAgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfVURSICAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgIC8qITwgVURSIGVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfRE1BICAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMlNfRVJST1JfUFJFU0NBTEVSICAgICAgICAgICgweDAwMDAwMDEwVSkgIC8qITwgUHJlc2NhbGVyIENhbGN1bGF0aW9uIGVycm9yICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgSEFMX0kyU19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgKDB4MDAwMDAwMjBVKSAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX01vZGUgSTJTIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfTU9ERV9TTEFWRV9UWCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19NT0RFX1NMQVZFX1JYICAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCkKKyNkZWZpbmUgSTJTX01PREVfTUFTVEVSX1RYICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU0NGR18xKQorI2RlZmluZSBJMlNfTU9ERV9NQVNURVJfUlggICAgICAgICAgICAgICAoKFNQSV9JMlNDRkdSX0kyU0NGR18wIHwgU1BJX0kyU0NGR1JfSTJTQ0ZHXzEpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfU3RhbmRhcmQgSTJTIFN0YW5kYXJkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BISUxJUFMgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMlNfU1RBTkRBUkRfTVNCICAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTU1REXzApCisjZGVmaW5lIEkyU19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNTVERfMSkKKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8IFNQSV9JMlNDRkdSX0kyU1NURF8xKSkKKyNkZWZpbmUgSTJTX1NUQU5EQVJEX1BDTV9MT05HICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9JMlNTVERfMCB8IFNQSV9JMlNDRkdSX0kyU1NURF8xIHwgU1BJX0kyU0NGR1JfUENNU1lOQykpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19EYXRhX0Zvcm1hdCBJMlMgRGF0YSBGb3JtYXQKKyAgKiBAeworICAqLworI2RlZmluZSBJMlNfREFUQUZPUk1BVF8xNkIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyU19EQVRBRk9STUFUXzE2Ql9FWFRFTkRFRCAgICAgIChTUElfSTJTQ0ZHUl9DSExFTikKKyNkZWZpbmUgSTJTX0RBVEFGT1JNQVRfMjRCICAgICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8wKSkKKyNkZWZpbmUgSTJTX0RBVEFGT1JNQVRfMzJCICAgICAgICAgICAgICAgKChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8xKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX01DTEtfT3V0cHV0IEkyUyBNQ0xLIE91dHB1dAorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19NQ0xLT1VUUFVUX0VOQUJMRSAgICAgICAgICAgIChTUElfSTJTUFJfTUNLT0UpCisjZGVmaW5lIEkyU19NQ0xLT1VUUFVUX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0F1ZGlvX0ZyZXF1ZW5jeSBJMlMgQXVkaW8gRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX0FVRElPRlJFUV8xOTJLICAgICAgICAgICAgICAgKDE5MjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOTZLICAgICAgICAgICAgICAgICg5NjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDhLICAgICAgICAgICAgICAgICg0ODAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfNDRLICAgICAgICAgICAgICAgICg0NDEwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMzJLICAgICAgICAgICAgICAgICgzMjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMjJLICAgICAgICAgICAgICAgICgyMjA1MFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTZLICAgICAgICAgICAgICAgICgxNjAwMFUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfMTFLICAgICAgICAgICAgICAgICgxMTAyNVUpCisjZGVmaW5lIEkyU19BVURJT0ZSRVFfOEsgICAgICAgICAgICAgICAgICg4MDAwVSkKKyNkZWZpbmUgSTJTX0FVRElPRlJFUV9ERUZBVUxUICAgICAgICAgICAgKDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfQ2xvY2tfUG9sYXJpdHkgSTJTIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJTX0NQT0xfTE9XICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBJMlNfQ1BPTF9ISUdIICAgICAgICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0tQT0wpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19JbnRlcnJ1cHRzX0RlZmluaXRpb24gSTJTIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfVFhFSUUKKyNkZWZpbmUgSTJTX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9SWE5FSUUKKyNkZWZpbmUgSTJTX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRmxhZ3NfRGVmaW5pdGlvbiBJMlMgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUKKyNkZWZpbmUgSTJTX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUKKworI2RlZmluZSBJMlNfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgICBTUElfU1JfVURSCisjZGVmaW5lIEkyU19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIKKyNkZWZpbmUgSTJTX0ZMQUdfRlJFICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRQorCisjZGVmaW5lIEkyU19GTEFHX0NIU0lERSAgICAgICAgICAgICAgICAgIFNQSV9TUl9DSFNJREUKKyNkZWZpbmUgSTJTX0ZMQUdfQlNZICAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0JTWQorCisjZGVmaW5lIEkyU19GTEFHX01BU0sgICAgICAgICAgICAgICAgICAgKFNQSV9TUl9SWE5FIHwgU1BJX1NSX1RYRSB8IFNQSV9TUl9VRFIgfCBTUElfU1JfT1ZSIHwgU1BJX1NSX0ZSRSB8IFNQSV9TUl9DSFNJREUgfCBTUElfU1JfQlNZKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX21hY3JvcyBJMlMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgSTJTIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgX19IQUxfSTJTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVTRVQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0kyU19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0RJU0FCTEUoX19IQU5ETEVfXykgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyU19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLChfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBJMlMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsKF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEkyUyB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgSTJTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSTJTIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0kyU19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyUyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfVURSOiBVbmRlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0ZSRTogRnJhbWUgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBJMlNfRkxBR19DSFNJREU6IENoYW5uZWwgU2lkZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0JTWTogQnVzeSBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIE9WUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoX19IQU5ETEVfXykgZG97IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWdfb3ZyID0gMHgwMFU7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRSOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnX292cik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKiogQGJyaWVmIENsZWFycyB0aGUgSTJTIFVEUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0NMRUFSX1VEUkZMQUcoX19IQU5ETEVfXykgZG97XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ191ZHIgPSAweDAwVTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZ191ZHIgPSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZ191ZHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0luaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19EZUluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcEluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX01zcERlSW5pdChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfUmVnaXN0ZXJDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgSEFMX0kyU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSTJTX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIEhBTF9JMlNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXRfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7Cit2b2lkIEhBTF9JMlNfSVJRSGFuZGxlcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfVHJhbnNtaXRfRE1BKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19SZWNlaXZlX0RNQShJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19ETUFQYXVzZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVN0b3AoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworCisvKiBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCBhbmQgRE1BKSAqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjayhJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7Cit2b2lkIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOwordm9pZCBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSTJTX1N0YXRlVHlwZURlZiBIQUxfSTJTX0dldFN0YXRlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3VpbnQzMl90IEhBTF9JMlNfR2V0RXJyb3IoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfUHJpdmF0ZV9Db25zdGFudHMgSTJTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX1ByaXZhdGVfTWFjcm9zIEkyUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19TUl9fICBjb3B5IG9mIEkyUyBTUiByZWdzaXRlci4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfVURSOiBVbmRlcnJ1biBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX09WUjogT3ZlcnJ1biBmbGFnCisgICogICAgICAgICAgICBAYXJnIEkyU19GTEFHX0NIU0lERTogQ2hhbm5lbCBzaWRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgSTJTX0ZMQUdfQlNZOiBCdXN5IGZsYWcKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgSTJTX0NIRUNLX0ZMQUcoX19TUl9fLCBfX0ZMQUdfXykgICAgICAgICAoKCgoX19TUl9fKSAmICgoX19GTEFHX18pICYgSTJTX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgSTJTX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgSW50ZXJydXB0IGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0NSMl9fICBjb3B5IG9mIEkyUyBDUjIgcmVnc2l0ZXIuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBJMlNfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEkyU19JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgSTJTX0NIRUNLX0lUX1NPVVJDRShfX0NSMl9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoKChfX0NSMl9fKSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgSTJTIE1vZGUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIEkyUyBNb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JMlNfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IEkyU19NT0RFX1NMQVZFX1RYKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEkyU19NT0RFX1NMQVZFX1JYKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEkyU19NT0RFX01BU1RFUl9UWCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEkyU19NT0RFX01BU1RFUl9SWCkpCisKKyNkZWZpbmUgSVNfSTJTX1NUQU5EQVJEKF9fU1RBTkRBUkRfXykgKCgoX19TVEFOREFSRF9fKSA9PSBJMlNfU1RBTkRBUkRfUEhJTElQUykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBTkRBUkRfXykgPT0gSTJTX1NUQU5EQVJEX01TQikgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQU5EQVJEX18pID09IEkyU19TVEFOREFSRF9MU0IpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFOREFSRF9fKSA9PSBJMlNfU1RBTkRBUkRfUENNX1NIT1JUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBTkRBUkRfXykgPT0gSTJTX1NUQU5EQVJEX1BDTV9MT05HKSkKKworI2RlZmluZSBJU19JMlNfREFUQV9GT1JNQVQoX19GT1JNQVRfXykgKCgoX19GT1JNQVRfXykgPT0gSTJTX0RBVEFGT1JNQVRfMTZCKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZPUk1BVF9fKSA9PSBJMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRk9STUFUX18pID09IEkyU19EQVRBRk9STUFUXzI0QikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GT1JNQVRfXykgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKworI2RlZmluZSBJU19JMlNfTUNMS19PVVRQVVQoX19PVVRQVVRfXykgKCgoX19PVVRQVVRfXykgPT0gSTJTX01DTEtPVVRQVVRfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9fKSA9PSBJMlNfTUNMS09VVFBVVF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19JMlNfQVVESU9fRlJFUShfX0ZSRVFfXykgKCgoKF9fRlJFUV9fKSA+PSBJMlNfQVVESU9GUkVRXzhLKSAgICAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRX18pIDw9IEkyU19BVURJT0ZSRVFfMTkySykpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gSTJTX0FVRElPRlJFUV9ERUZBVUxUKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIEkyUyBTZXJpYWwgY2xvY2sgc3RlYWR5IHN0YXRlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19DUE9MX18gc3BlY2lmaWVzIHRoZSBJMlMgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0Nsb2NrX1BvbGFyaXR5CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0kyU19DUE9MKENQT0wpICgoKENQT0wpID09IEkyU19DUE9MX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUE9MKSA9PSBJMlNfQ1BPTF9ISUdIKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfSTJTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2lyZGEuaCBiL0luYy9zdG0zMmcweHhfaGFsX2lyZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfaXJkYS5oCkBAIC0wLDAgKzEsODc3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9pcmRhLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIElSREEgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0lSREFfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0lSREFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREEKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX1R5cGVzIElSREEgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSVJEQSBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIElSREEgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1c2FydF9rZXJfY2twcmVzKSAvICgoaGlyZGEtPkluaXQuQmF1ZFJhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB1c2FydF9rZXJfY2twcmVzIGlzIHRoZSBJUkRBIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQUV4X1dvcmRfTGVuZ3RoICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQV9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX1RyYW5zZmVyX01vZGUgKi8KKworICB1aW50OF90ICBQcmVzY2FsZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHZhbHVlIGZvciBkaXZpZGluZyB0aGUgVUFSVC9VU0FSVCBzb3VyY2UgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2hpZXZlIGxvdy1wb3dlciBmcmVxdWVuY3kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgUHJlc2NhbGVyIHZhbHVlIDAgaXMgZm9yYmlkZGVuICovCisKKyAgdWludDE2X3QgUG93ZXJNb2RlOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElSREEgcG93ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFfTG93X1Bvd2VyICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgSVJEQSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IElSREFfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgSVJEQSBTdGF0ZSBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBJUkRBIFN0YXRlIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgMiBkaWZmZXJlbnQgc3Vic3RhdGVzOiBnU3RhdGUgYW5kIFJ4U3RhdGUgKHNlZSBAcmVmIElSREFfU3RhdGVfRGVmaW5pdGlvbikuCisgICogICAgICAgIC0gZ1N0YXRlIGNvbnRhaW5zIElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnbG9iYWwgSGFuZGxlIG1hbmFnZW1lbnQKKyAgKiAgICAgICAgICBhbmQgYWxzbyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgZ1N0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIEVycm9yIGluZm9ybWF0aW9uCisgICogICAgICAgICAgICAgMDAgOiBObyBFcnJvcgorICAqICAgICAgICAgICAgIDAxIDogKE5vdCBVc2VkKQorICAqICAgICAgICAgICAgIDEwIDogVGltZW91dAorICAqICAgICAgICAgICAgIDExIDogRXJyb3IKKyAgKiAgICAgICAgICBiNSAgICAgUGVyaXBoZXJhbCBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQuIEhBTCBJUkRBIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChQZXJpcGhlcmFsIGJ1c3kgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24gb3IgaW50ZXJuYWwgb3BlcmF0aW9ucykKKyAgKiAgICAgICAgICBiMSAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwCisgICogICAgICAgICAgYjAgICAgIFR4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgLSBSeFN0YXRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBSeFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiNSAgICAgUGVyaXBoZXJhbCBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgYjQtYjIgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgIHh4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAwCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwLgorICAqLwordHlwZWRlZiB1aW50MzJfdCBIQUxfSVJEQV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBJUkRBIGNsb2NrIHNvdXJjZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIElSREFfQ0xPQ0tTT1VSQ0VfUENMSzEgICAgICA9IDB4MDBVLCAgICAvKiE8IFBDTEsxIGNsb2NrIHNvdXJjZSAgICAgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgICAgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLICAgICA9IDB4MDRVLCAgICAvKiE8IFNZU0NMSyBjbG9jayBzb3VyY2UgICAgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfTFNFICAgICAgICA9IDB4MTBVLCAgICAvKiE8IExTRSBjbG9jayBzb3VyY2UgICAgICAgICAgICovCisgIElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MjBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgICAgICovCit9IElSREFfQ2xvY2tTb3VyY2VUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIElSREEgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZiAgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBVU0FSVF9UeXBlRGVmICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgLyohPCBVU0FSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICovCisKKyAgSVJEQV9Jbml0VHlwZURlZiAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgSVJEQSBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gSVJEQSBUeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgLyohPCBJUkRBIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgIC8qITwgSVJEQSBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gSVJEQSBSeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgLyohPCBJUkRBIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgIC8qITwgSVJEQSBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBNYXNrOyAgICAgICAgICAgICAvKiE8IFVTQVJUIFJYIFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgKmhkbWF0eDsgICAgICAgICAgLyohPCBJUkRBIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hcng7ICAgICAgICAgIC8qITwgSVJEQSBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAgICBnU3RhdGU7ICAgICAgLyohPCBJUkRBIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgKi8KKworICBfX0lPIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAgICBSeFN0YXRlOyAgICAgLyohPCBJUkRBIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBJUkRBIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIFR4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAvKiE8IElSREEgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKworICB2b2lkICgqIFR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgICAgICAvKiE8IElSREEgVHggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAvKiE8IElSREEgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKworICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgICAgICAvKiE8IElSREEgUnggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgICAvKiE8IElSREEgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgICAvKiE8IElSREEgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgKi8KKworICB2b2lkICgqIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAvKiE8IElSREEgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKworICB2b2lkICgqIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAvKiE8IElSREEgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAgKi8KKworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgICAgIC8qITwgSVJEQSBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgIC8qITwgSVJEQSBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gSVJEQV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIElSREEgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwMFUsICAgIC8qITwgSVJEQSBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IElSREEgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX0lSREFfUlhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAyVSwgICAgLyohPCBJUkRBIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9JUkRBX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwM1UsICAgIC8qITwgSVJEQSBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDRVLCAgICAvKiE8IElSREEgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDA1VSwgICAgLyohPCBJUkRBIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEID0gMHgwNlUsICAgIC8qITwgSVJEQSBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLworICBIQUxfSVJEQV9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEICA9IDB4MDdVLCAgICAvKiE8IElSREEgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayBJRCAgKi8KKworICBIQUxfSVJEQV9NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IElSREEgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDA5VSAgICAgLyohPCBJUkRBIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisKK30gSEFMX0lSREFfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIElSREEgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcElSREFfQ2FsbGJhY2tUeXBlRGVmKShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgIC8qITwgcG9pbnRlciB0byBhbiBJUkRBIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfQ29uc3RhbnRzIElSREEgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1N0YXRlX0RlZmluaXRpb24gSVJEQSBTdGF0ZSBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9SRVNFVCAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAweDAwMDAwMDIwVSAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjRVICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX0JVU1lfVFggICAgICAgICAgICAgIDB4MDAwMDAwMjFVICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX0JVU1lfUlggICAgICAgICAgICAgIDB4MDAwMDAwMjJVICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYX1JYICAgICAgICAgICAweDAwMDAwMDIzVSAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB0byBiZSB1c2VkIGZvciBuZWl0aGVyIGdTdGF0ZSBub3IgUnhTdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9USU1FT1VUICAgICAgICAgICAgICAweDAwMDAwMEEwVSAgIC8qITwgVGltZW91dCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfRVJST1IgICAgICAgICAgICAgICAgMHgwMDAwMDBFMFUgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0Vycm9yX0RlZmluaXRpb24gSVJEQSBFcnJvciBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9OT05FICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX1BFICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfTkUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgICAgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9GRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAgICAgICAgICAvKiE8IGZyYW1lIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX09SRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfRE1BICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgICAgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAgICAgICAgICAvKiE8IEJ1c3kgRXJyb3IgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgICAgICAgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9QYXJpdHkgSVJEQSBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX1BBUklUWV9OT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIElSREFfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgICAgIC8qITwgRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgSVJEQV9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMpICAgLyohPCBPZGQgcGFyaXR5ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1RyYW5zZmVyX01vZGUgSVJEQSBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9NT0RFX1JYICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgIC8qITwgUlggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9NT0RFX1RYICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgIC8qITwgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9NT0RFX1RYX1JYICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgIC8qITwgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Mb3dfUG93ZXIgSVJEQSBMb3cgUG93ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX1BPV0VSTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IElSREEgbm9ybWFsIHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgSVJEQV9QT1dFUk1PREVfTE9XUE9XRVIgICAgICAgICAgICAgVVNBUlRfQ1IzX0lSTFAgICAgLyohPCBJUkRBIGxvdyBwb3dlciBtb2RlICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfQ2xvY2tQcmVzY2FsZXIgQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWMSAgICAweDAwMDAwMDAwVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrICAgICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYyICAgIDB4MDAwMDAwMDFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMiAgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjQgICAgMHgwMDAwMDAwMlUgIC8qITwgZmNsa19wcmVzID0gZmNsay80ICAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWNiAgICAweDAwMDAwMDAzVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzYgICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVY4ICAgIDB4MDAwMDAwMDRVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvOCAgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjEwICAgMHgwMDAwMDAwNVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMCAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWMTIgICAweDAwMDAwMDA2VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYxNiAgIDB4MDAwMDAwMDdVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTYgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjMyICAgMHgwMDAwMDAwOFUgIC8qITwgZmNsa19wcmVzID0gZmNsay8zMiAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWNjQgICAweDAwMDAwMDA5VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzY0ICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYxMjggIDB4MDAwMDAwMEFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTI4ICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjI1NiAgMHgwMDAwMDAwQlUgIC8qITwgZmNsa19wcmVzID0gZmNsay8yNTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9TdGF0ZSBJUkRBIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgSVJEQSBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1VFICAgIC8qITwgSVJEQSBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Nb2RlIElSREEgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBBc3NvY2lhdGVkIFVBUlQgZGlzYWJsZWQgaW4gSVJEQSBtb2RlICovCisjZGVmaW5lIElSREFfTU9ERV9FTkFCTEUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19JUkVOICAgLyohPCBBc3NvY2lhdGVkIFVBUlQgZW5hYmxlZCBpbiBJUkRBIG1vZGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfT25lX0JpdCBJUkRBIE9uZSBCaXQgU2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUgICAgICAgICAgVVNBUlRfQ1IzX09ORUJJVCAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1R4IElSREEgRE1BIFR4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfVFhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBJUkRBIERNQSBUWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BVCAgICAvKiE8IElSREEgRE1BIFRYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRE1BX1J4IElSREEgRE1BIFJ4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfUlhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBJUkRBIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BUiAgICAvKiE8IElSREEgRE1BIFJYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfUmVxdWVzdF9QYXJhbWV0ZXJzIElSREEgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9BVVRPQkFVRF9SRVFVRVNUICAgICAgICAgICAgVVNBUlRfUlFSX0FCUlJRICAgICAgICAvKiE8IEF1dG8tQmF1ZCBSYXRlIFJlcXVlc3QgICAgICAqLworI2RlZmluZSBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgIFVTQVJUX1JRUl9UWEZSUSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9GbGFncyBJUkRBIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0ZMQUdfUkVBQ0sgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAvKiE8IElSREEgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgSVJEQSB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBJUkRBIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfQUJSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAvKiE8IElSREEgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgIC8qITwgSVJEQSBhdXRvIEJhdWQgcmF0ZSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBJUkRBIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IElSREEgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgSVJEQSByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBJUkRBIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAvKiE8IElSREEgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgSVJEQSBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBJUkRBIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0ludGVycnVwdF9kZWZpbml0aW9uIElSREEgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0lUX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAvKiE8IElSREEgUGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgLyohPCBJUkRBIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIElSREFfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNlUgICAgIC8qITwgSVJEQSBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBJUkRBX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAvKiE8IElSREEgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgSVJEQV9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgLyohPCBJUkRBIElkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwMDAwMDBYWFlZWVlZYgorICAgICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAgICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyICovCisjZGVmaW5lIElSREFfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgICAgLyohPCBJUkRBIEVycm9yIGludGVycnVwdGlvbiAgICAgICAgKi8KKworLyogICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMDAwMDAwMDBiCisgICAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykgKi8KKyNkZWZpbmUgSVJEQV9JVF9PUkUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwVSAgICAgIC8qITwgSVJEQSBPdmVycnVuIGVycm9yIGludGVycnVwdGlvbiAqLworI2RlZmluZSBJUkRBX0lUX05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDBVICAgICAgLyohPCBJUkRBIE5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICovCisjZGVmaW5lIElSREFfSVRfRkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgICAvKiE8IElSREEgRnJhbWUgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9JVF9DTEVBUl9GbGFncyBJUkRBIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9GRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgLyohPCBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX05FRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX05FQ0YgICAgICAgICAgICAvKiE8IE5vaXNlIEVycm9yIGRldGVjdGVkIENsZWFyIEZsYWcgICovCisjZGVmaW5lIElSREFfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlclJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX1RDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfSW50ZXJydXB0aW9uX01hc2sgSVJEQSBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0lUX01BU0sgIDB4MDAxRlUgIC8qITwgSVJEQSBJbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgICovCisjZGVmaW5lIElSREFfQ1JfTUFTSyAgMHgwMEUwVSAgLyohPCBJUkRBIGNvbnRyb2wgcmVnaXN0ZXIgbWFzayAgICAgKi8KKyNkZWZpbmUgSVJEQV9DUl9QT1MgICA1VSAgICAgICAvKiE8IElSREEgY29udHJvbCByZWdpc3RlciBwb3NpdGlvbiAqLworI2RlZmluZSBJUkRBX0lTUl9NQVNLIDB4MUYwMFUgIC8qITwgSVJEQSBJU1IgcmVnaXN0ZXIgbWFzayAgICAgICAgICovCisjZGVmaW5lIElSREFfSVNSX1BPUyAgOFUgICAgICAgLyohPCBJUkRBIElTUiByZWdpc3RlciBwb3NpdGlvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX01hY3JvcyBJUkRBIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IElSREEgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBJUkRBIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyNkZWZpbmUgX19IQUxfSVJEQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0lSREFfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYgLypVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICAqLworCisvKiogQGJyaWVmICBGbHVzaCB0aGUgSVJEQSBEUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9QRUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0ZFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfTkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9PUkVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9UQ0YKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX0lETEVGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9QRUYpCisKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0ZFRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfT1JFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIElSREEgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfSURMRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0FCUkUgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1RYRSAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfT1JFICAgT3ZlclJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9FUlIgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIElSREFfQ1JfTUFTSykgPj4gSVJEQV9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIElSREFfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIElSREEgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UWEUgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UQyAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1BFICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRVJSICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSVJEQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UWEUgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9PUkUgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX05FIE5vaXNlIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRkUgRnJhbWluZyBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1BFIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lTUl9NQVNLKT4+IElSREFfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJUkRBIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVEMgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0VSUiBGcmFtaW5nLCBvdmVycnVuIG9yIG5vaXNlIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMVUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMlUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgodWludDMyX3QpMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIElSREFfSVRfTUFTSykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBJUkRBIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfUEVGIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9GRUYgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9ORUYgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfT1JFRiBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX1RDRiBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9ICh1aW50MzJfdCkoX19JVF9DTEVBUl9fKSkKKworCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBJUkRBIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0FVVE9CQVVEX1JFUVVFU1QgQXV0by1CYXVkIFJhdGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBJUkRBIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIElSREEgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSAodWludDMyX3QpfigodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBVQVJUL1VTQVJUIGFzc29jaWF0ZWQgdG8gSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gIFVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSBVQVJUL1VTQVJUIGFzc29jaWF0ZWQgdG8gSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gIH5VU0FSVF9DUjFfVUUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJUkRBX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgRW5zdXJlIHRoYXQgSVJEQSBCYXVkIHJhdGUgaXMgbGVzcyBvciBlcXVhbCB0byBtYXhpbXVtIHZhbHVlLgorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIHNwZWNpZmllcyB0aGUgSVJEQSBCYXVkcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBUcnVlIG9yIEZhbHNlCisgICovCisjZGVmaW5lIElTX0lSREFfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCAxMTUyMDFVKQorCisvKiogQGJyaWVmICBFbnN1cmUgdGhhdCBJUkRBIHByZXNjYWxlciB2YWx1ZSBpcyBzdHJpY3RseSBsYXJnZXIgdGhhbiAwLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBzcGVjaWZpZXMgdGhlIElSREEgcHJlc2NhbGVyIHZhbHVlIHNldCBieSB0aGUgdXNlci4KKyAgKiBAcmV0dmFsIFRydWUgb3IgRmFsc2UKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKChfX1BSRVNDQUxFUl9fKSA+IDBVKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIElSREEgZnJhbWUgcGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBJUkRBX1BBUklUWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IElSREFfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gSVJEQV9QQVJJVFlfT0REKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gSVJEQSBjb21tdW5pY2F0aW9uIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9UWF9SWF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgKH4oKHVpbnQzMl90KShJUkRBX01PREVfVFhfUlgpKSkpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBwb3dlciBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIHBvd2VyIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9QT1dFUk1PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBJUkRBX1BPV0VSTU9ERV9MT1dQT1dFUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IElSREFfUE9XRVJNT0RFX05PUk1BTCkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBjbG9jayBQcmVzY2FsZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBJUkRBIGNsb2NrIFByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfQ0xPQ0tQUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjIpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWNCkgICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVY2KSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjgpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWMTApICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVYxMikgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjE2KSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWMzIpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVY2NCkgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjEyOCkgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWMjU2KSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUQVRFX18gSVJEQSBzdGF0ZSBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gSVJEQV9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IElSREFfU1RBVEVfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGFzc29jaWF0ZWQgVUFSVC9VU0FSVCBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIGFzc29jaWF0ZWQgVUFSVC9VU0FSVCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfTU9ERShfX01PREVfXykgICgoKF9fTU9ERV9fKSA9PSBJUkRBX01PREVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gSVJEQV9NT0RFX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBzYW1wbGluZyByYXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIElSREEgc2FtcGxpbmcgcmF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19PTkVCSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT05FQklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9PTkVfQklUX1NBTVBMRShfX09ORUJJVF9fKSAgICAgICgoKF9fT05FQklUX18pID09IElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PTkVCSVRfXykgPT0gSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgRE1BIFRYIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BVFhfXyBJUkRBIERNQSBUWCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBJUkRBX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gSVJEQV9ETUFfVFhfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIERNQSBSWCBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVJYX18gSVJEQSBETUEgUlggbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFSWF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19ETUFSWF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfRE1BX1JYKF9fRE1BUlhfXykgKCgoX19ETUFSWF9fKSA9PSBJUkRBX0RNQV9SWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFSWF9fKSA9PSBJUkRBX0RNQV9SWF9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgcmVxdWVzdCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIElSREEgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IElSREFfQVVUT0JBVURfUkVRVUVTVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorLyoqCisgKiBAfQorICovCisKKy8qIEluY2x1ZGUgSVJEQSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9pcmRhX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnMgSVJEQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfTXNwSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfTXNwRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBJUkRBX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUGF1c2UoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFSZXN1bWUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFTdG9wKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKK3ZvaWQgSEFMX0lSREFfSVJRSGFuZGxlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgSEFMX0lSREFfR2V0U3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit1aW50MzJfdCAgICAgICAgICAgICAgSEFMX0lSREFfR2V0RXJyb3IoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0lSREFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfaXJkYV9leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfaXJkYV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmFhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9pcmRhX2V4LmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2lyZGFfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVJEQSBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfSVJEQV9FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfSVJEQV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElSREFFeCBJUkRBRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQUV4X0V4dGVuZGVkX0V4cG9ydGVkX0NvbnN0YW50cyBJUkRBRXggRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXhfV29yZF9MZW5ndGggSVJEQUV4IFdvcmQgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9XT1JETEVOR1RIXzdCICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgLyohPCA3LWJpdCBsb25nIGZyYW1lICovCisjZGVmaW5lIElSREFfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgOC1iaXQgbG9uZyBmcmFtZSAqLworI2RlZmluZSBJUkRBX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAvKiE8IDktYml0IGxvbmcgZnJhbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQUV4X1ByaXZhdGVfTWFjcm9zIElSREFFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgSVJEQSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgSVJEQSBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcweHgpCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQorI2RlZmluZSBJUkRBX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworLyoqIEBicmllZiAgQ29tcHV0ZSB0aGUgbWFzayB0byBhcHBseSB0byByZXRyaWV2ZSB0aGUgcmVjZWl2ZWQgZGF0YQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB3b3JkIGxlbmd0aCBhbmQgdG8gdGhlIHBhcml0eSBiaXRzIGFjdGl2YXRpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byB0aGUgYXNzb2NpYXRlZCBVQVJUIFJEUiByZWdpc3RlciBpcyBzdG9yZWQgaW4gKF9fSEFORExFX18pLT5NYXNrIGZpZWxkLgorICAqLworI2RlZmluZSBJUkRBX01BU0tfQ09NUFVUQVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzhCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfN0IpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAzRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBJUkRBIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfSVJEQV9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9pd2RnLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZWEwYgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX2l3ZGcuaApAQCAtMCwwICsxLDI0MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfaXdkZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJV0RHIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX0lXREdfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0lXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHIElXREcKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX1R5cGVzIElXREcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIElXREcgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgLyohPCBTZWxlY3QgdGhlIHByZXNjYWxlciBvZiB0aGUgSVdERy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElXREdfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgUmVsb2FkOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElXREcgZG93bi1jb3VudGVyIHJlbG9hZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MEZGRiAqLworCisgIHVpbnQzMl90IFdpbmRvdzsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB3aW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd24tY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MEZGRiAqLworCit9IElXREdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSVdERyBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIElXREdfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKworICBJV0RHX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgIC8qITwgSVdERyByZXF1aXJlZCBwYXJhbWV0ZXJzICovCit9IElXREdfSGFuZGxlVHlwZURlZjsKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0NvbnN0YW50cyBJV0RHIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19QcmVzY2FsZXIgSVdERyBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl80ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDQgICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl84ICAgICAgICAgICAgICAgIElXREdfUFJfUFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDggICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8xNiAgICAgICAgICAgICAgIElXREdfUFJfUFJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDE2ICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8zMiAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzEgfCBJV0RHX1BSX1BSXzApICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDMyICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl82NCAgICAgICAgICAgICAgIElXREdfUFJfUFJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDY0ICAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8xMjggICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzApICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDEyOCAqLworI2RlZmluZSBJV0RHX1BSRVNDQUxFUl8yNTYgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzEpICAgICAgICAgICAgICAgICAgIC8qITwgSVdERyBwcmVzY2FsZXIgc2V0IHRvIDI1NiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfV2luZG93X29wdGlvbiBJV0RHIFdpbmRvdyBvcHRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJV0RHX1dJTkRPV19ESVNBQkxFICAgICAgICAgICAgIElXREdfV0lOUl9XSU4KKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9NYWNyb3MgSVdERyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSVdERyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgSVdERyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVdER19TVEFSVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICBXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+S1IsIElXREdfS0VZX0VOQUJMRSkKKworLyoqCisgICogQGJyaWVmICBSZWxvYWQgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyCisgICogICAgICAgICAod3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSICYgSVdER19XSU5SIHJlZ2lzdGVycyBkaXNhYmxlZCkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSKF9fSEFORExFX18pICAgICAgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfUkVMT0FEKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucyAgSVdERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgU3RhcnQgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL1N0YXJ0IGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19Jbml0KElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfUmVmcmVzaChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfUHJpdmF0ZV9Db25zdGFudHMgSVdERyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSVdERyBLZXkgUmVnaXN0ZXIgQml0TWFzaworICAqLworI2RlZmluZSBJV0RHX0tFWV9SRUxPQUQgICAgICAgICAgICAgICAgIDB4MDAwMEFBQUF1ICAvKiE8IElXREcgUmVsb2FkIENvdW50ZXIgRW5hYmxlICAgKi8KKyNkZWZpbmUgSVdER19LRVlfRU5BQkxFICAgICAgICAgICAgICAgICAweDAwMDBDQ0NDdSAgLyohPCBJV0RHIFBlcmlwaGVyYWwgRW5hYmxlICAgICAgICovCisjZGVmaW5lIElXREdfS0VZX1dSSVRFX0FDQ0VTU19FTkFCTEUgICAgMHgwMDAwNTU1NXUgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRW5hYmxlICAqLworI2RlZmluZSBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRSAgIDB4MDAwMDAwMDB1ICAvKiE8IElXREcgS1IgV3JpdGUgQWNjZXNzIERpc2FibGUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19Qcml2YXRlX01hY3JvcyBJV0RHIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgSVdERyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pICBXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+S1IsIElXREdfS0VZX1dSSVRFX0FDQ0VTU19FTkFCTEUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJV0RHX0RJU0FCTEVfV1JJVEVfQUNDRVNTKF9fSEFORExFX18pIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfV1JJVEVfQUNDRVNTX0RJU0FCTEUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyBwcmVzY2FsZXIgdmFsdWUuCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fICBJV0RHIHByZXNjYWxlciB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAgICgoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl8xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzMyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl8xMjgpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzI1NikpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyByZWxvYWQgdmFsdWUuCisgICogQHBhcmFtICBfX1JFTE9BRF9fICBJV0RHIHJlbG9hZCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1JFTE9BRChfX1JFTE9BRF9fKSAgICAgICAgICAgICgoX19SRUxPQURfXykgPD0gSVdER19STFJfUkwpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgSVdERyB3aW5kb3cgdmFsdWUuCisgICogQHBhcmFtICBfX1dJTkRPV19fICBJV0RHIHdpbmRvdyB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19JV0RHX1dJTkRPVyhfX1dJTkRPV19fKSAgICAgICAgICAgICgoX19XSU5ET1dfXykgPD0gSVdER19XSU5SX1dJTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9JV0RHX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX2xwdGltLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9scHRpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjAyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9scHRpbS5oCkBAIC0wLDAgKzEsNzU4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9scHRpbS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBMUFRJTSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfTFBUSU1fSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX0xQVElNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBUSU0xKSB8fCBkZWZpbmVkIChMUFRJTTIpCisKKy8qKiBAYWRkdG9ncm91cCBMUFRJTQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9UeXBlcyBMUFRJTSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIExQVElNIENsb2NrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbiAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTb3VyY2U7ICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0Nsb2NrX1NvdXJjZSAgICovCisKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIGNsb2NrIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCisgIAorfUxQVElNX0Nsb2NrQ29uZmlnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgTFBUSU0gQ2xvY2sgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBvbGFyaXR5OyAgICAgIC8qITwgU2VsZWN0cyB0aGUgcG9sYXJpdHkgb2YgdGhlIGFjdGl2ZSBlZGdlIGZvciB0aGUgY291bnRlciB1bml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgVUxQVElNIGlucHV0IGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gVWx0cmEgbG93IHBvd2VyIGNsb2NrIHNvdXJjZSBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgdGhlIHBvbGFyaXR5IGlzIGNvbmZpZ3VyZWQgb24gJ2JvdGggZWRnZXMnLCBhbiBhdXhpbGlhcnkgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmUgb2YgdGhlIExvdyBwb3dlciBvc2NpbGxhdG9yKSBtdXN0IGJlIGFjdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfUG9sYXJpdHkgKi8gCisgIAorICB1aW50MzJfdCBTYW1wbGVUaW1lOyAgICAgLyohPCBTZWxlY3RzIHRoZSBjbG9jayBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgY2xvY2sgZ2xpdGNoIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSB3aGVuIFVsdHJhIGxvdyBwb3dlciBjbG9jayBzb3VyY2UgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfU2FtcGxlX1RpbWUgKi8gIAorICAKK31MUFRJTV9VTFBDbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIExQVElNIFRyaWdnZXIgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uICAKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFNvdXJjZTsgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgVHJpZ2dlciBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fVHJpZ2dlcl9Tb3VyY2UgKi8KKyAgCisgIHVpbnQzMl90IEFjdGl2ZUVkZ2U7ICAgIC8qITwgU2VsZWN0cyB0aGUgVHJpZ2dlciBhY3RpdmUgZWRnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gYW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0V4dGVybmFsX1RyaWdnZXJfUG9sYXJpdHkgKi8KKyAgCisgIHVpbnQzMl90IFNhbXBsZVRpbWU7ICAgIC8qITwgU2VsZWN0cyB0aGUgdHJpZ2dlciBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgY2xvY2sgZ2xpdGNoIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gYW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX1RyaWdnZXJfU2FtcGxlX1RpbWUgICovICAKK31MUFRJTV9UcmlnZ2VyQ29uZmlnVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgTFBUSU0gSW5pdGlhbGl6YXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIExQVElNX0Nsb2NrQ29uZmlnVHlwZURlZiAgICAgQ2xvY2s7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgTFBUSU1fVUxQQ2xvY2tDb25maWdUeXBlRGVmICBVbHRyYUxvd1Bvd2VyQ2xvY2s7ICAvKiE8IFNwZWNpZmllcyB0aGUgVWx0cmEgTG93IFBvd2VyIGNsb2NrIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgTFBUSU1fVHJpZ2dlckNvbmZpZ1R5cGVEZWYgICBUcmlnZ2VyOyAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVHJpZ2dlciBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgT3V0cHV0UG9sYXJpdHk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX091dHB1dF9Qb2xhcml0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZU1vZGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBvZiB0aGUgYXV0b3JlbG9hZCBhbmQgdGhlIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgaXMgZG9uZSBpbW1lZGlhdGVseSBvciBhZnRlciB0aGUgZW5kIG9mIGN1cnJlbnQgcGVyaW9kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fVXBkYXRpbmdfTW9kZSAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgQ291bnRlclNvdXJjZTsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBlYWNoIGludGVybmFsIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZWFjaCBleHRlcm5hbCBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0NvdW50ZXJfU291cmNlICovICAKKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIElucHV0MVNvdXJjZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHNvdXJjZSBzZWxlY3RlZCBmb3IgaW5wdXQxIChHUElPIG9yIGNvbXBhcmF0b3Igb3V0cHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0lucHV0MV9Tb3VyY2UgKi8gIAorCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgSW5wdXQyU291cmNlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgc291cmNlIHNlbGVjdGVkIGZvciBpbnB1dDIgKEdQSU8gb3IgY29tcGFyYXRvciBvdXRwdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSBmb3IgZW5jb2RlciBmZWF0dXJlIHNvIGlzIHVzZWQgb25seSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgTFBUSU0xIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fSW5wdXQyX1NvdXJjZSAqLyAgCit9TFBUSU1fSW5pdFR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBMUFRJTSBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovIAordHlwZWRlZiBlbnVtCit7CisgIEhBTF9MUFRJTV9TVEFURV9SRVNFVCAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLworICBIQUxfTFBUSU1fU1RBVEVfUkVBRFkgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX0xQVElNX1NUQVRFX0JVU1kgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9TVEFURV9USU1FT1VUICAgICAgICAgID0gMHgwM1UsICAgIC8qITwgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfTFBUSU1fU1RBVEVfRVJST1IgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IEludGVybmFsIFByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAqLworfUhBTF9MUFRJTV9TdGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIExQVElNIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCisgICovIAorI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZgoreworICAgICAgTFBUSU1fVHlwZURlZiAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAqLworICAgICAgCisgICAgICBMUFRJTV9Jbml0VHlwZURlZiAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBMUFRJTSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIAorICAgICAgSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgICAgIFN0YXR1czsgICAgICAgICAgIC8qITwgTFBUSU0gcGVyaXBoZXJhbCBzdGF0dXMgICAqLyAgCisgIAorICAgICAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgTFBUSU0gbG9ja2luZyBvYmplY3QgICAgICAqLworICAKKyAgIF9fSU8gIEhBTF9MUFRJTV9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAgICAvKiE8IExQVElNIHBlcmlwaGVyYWwgc3RhdGUgICAgKi8KKyAgCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgICgqIE1zcEluaXRDYWxsYmFjaykgICAgICAgICAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgIC8qITwgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogTXNwRGVJbml0Q2FsbGJhY2spICAgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgLyohPCBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAqLworICB2b2lkICAoKiBDb21wYXJlTWF0Y2hDYWxsYmFjaykgICAgKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAvKiE8IENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgICgqIEF1dG9SZWxvYWRNYXRjaENhbGxiYWNrKSAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgIC8qITwgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogVHJpZ2dlckNhbGxiYWNrKSAgICAgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayAgICAqLworICB2b2lkICAoKiBDb21wYXJlV3JpdGVDYWxsYmFjaykgICAgKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAvKiE8IENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgICAgICovCisgIHZvaWQgICgqIEF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKSAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgIC8qITwgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgdm9pZCAgKCogRGlyZWN0aW9uVXBDYWxsYmFjaykgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgLyohPCBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgICAqLworICB2b2lkICAoKiBEaXJlY3Rpb25Eb3duQ2FsbGJhY2spICAgKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAvKiE8IERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK31MUFRJTV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBMUFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgPSAweDAxVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgPSAweDAyVSwgICAgLyohPCBDb21wYXJlIG1hdGNoIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgPSAweDAzVSwgICAgLyohPCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRCAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgPSAweDA1VSwgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRCAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCAgICAgPSAweDA3VSwgICAgLyohPCBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgPSAweDA4VSwgICAgLyohPCBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQgICAgICAgKi8KK31IQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFRJTSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwTFBUSU1fQ2FsbGJhY2tUeXBlRGVmKShMUFRJTV9IYW5kbGVUeXBlRGVmICogaGxwdGltKTsgLyohPCBwb2ludGVyIHRvIHRoZSBMUFRJTSBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0NvbnN0YW50cyBMUFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0Nsb2NrX1NvdXJjZSBMUFRJTSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQyAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tTRUwKKy8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ2xvY2tfUHJlc2NhbGVyIExQVElNIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18wCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzEKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzAgfCBMUFRJTV9DRkdSX1BSRVNDXzEpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYxNiAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzIKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjMyICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzAgfCBMUFRJTV9DRkdSX1BSRVNDXzIpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY2NCAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18xIHwgTFBUSU1fQ0ZHUl9QUkVTQ18yKQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMTI4ICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fT3V0cHV0X1BvbGFyaXR5IExQVElNIE91dHB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fT1VUUFVUUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX09VVFBVVFBPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1dBVlBPTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19TYW1wbGVfVGltZSBMUFRJTSBDbG9jayBTYW1wbGUgVGltZQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX0NLRkxUXzEKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfQ0tGTFQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ2xvY2tfUG9sYXJpdHkgTFBUSU0gQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMAorI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8xCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX1RyaWdnZXJfU291cmNlIExQVElNIFRyaWdnZXIgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSAgICAgICAgICAgICAgIDB4MDAwMEZGRkZVCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzEgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzAKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8yICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8xCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMyAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMSkKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV80ICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8yCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNSAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMikKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV82ICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMSB8IExQVElNX0NGR1JfVFJJR1NFTF8yKQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzcgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0V4dGVybmFsX1RyaWdnZXJfUG9sYXJpdHkgTFBUSU0gRXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX0FDVElWRUVER0VfUklTSU5HICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR0VOXzAKKyNkZWZpbmUgTFBUSU1fQUNUSVZFRURHRV9GQUxMSU5HICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU5fMQorI2RlZmluZSBMUFRJTV9BQ1RJVkVFREdFX1JJU0lOR19GQUxMSU5HICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9UcmlnZ2VyX1NhbXBsZV9UaW1lIExQVElNIFRyaWdnZXIgU2FtcGxlIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8wCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfVFJHRkxUXzEKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fVXBkYXRpbmdfTW9kZSBMUFRJTSBVcGRhdGluZyBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9VUERBVEVfSU1NRURJQVRFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fVVBEQVRFX0VORE9GUEVSSU9EICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFTE9BRAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9Db3VudGVyX1NvdXJjZSBMUFRJTSBDb3VudGVyIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fQ09VTlRFUlNPVVJDRV9JTlRFUk5BTCAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX0NPVU5URVJTT1VSQ0VfRVhURVJOQUwgICAgICAgICAgICBMUFRJTV9DRkdSX0NPVU5UTU9ERQorLyoqCisgICogQH0KKyAgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fSW5wdXQxX1NvdXJjZSBMUFRJTSBJbnB1dDEgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9JTlBVVDFTT1VSQ0VfR1BJTyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0xIGFuZCBMUFRJTTIgKi8KKyNkZWZpbmUgTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAxICAgICAgICBMUFRJTV9DRkdSMl9JTjFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0xIGFuZCBMUFRJTTIgKi8KKyNkZWZpbmUgTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAyICAgICAgICAgTFBUSU1fQ0ZHUjJfSU4xU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIExQVElNMiAqLworI2RlZmluZSBMUFRJTV9JTlBVVDFTT1VSQ0VfQ09NUDFfQ09NUDIgICAoTFBUSU1fQ0ZHUjJfSU4xU0VMXzEgfCBMUFRJTV9DRkdSMl9JTjFTRUxfMCkgLyohPCBGb3IgTFBUSU0yICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0lucHV0Ml9Tb3VyY2UgTFBUSU0gSW5wdXQyIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fSU5QVVQyU09VUkNFX0dQSU8gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0xICovCisjZGVmaW5lIExQVElNX0lOUFVUMlNPVVJDRV9DT01QMiAgICAgICAgTFBUSU1fQ0ZHUjJfSU4yU0VMXzAgICAgICAgICAgIC8qITwgRm9yIExQVElNMSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9GbGFnX0RlZmluaXRpb24gTFBUSU0gRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fRkxBR19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRE9XTgorI2RlZmluZSBMUFRJTV9GTEFHX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9VUAorI2RlZmluZSBMUFRJTV9GTEFHX0FSUk9LICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJPSworI2RlZmluZSBMUFRJTV9GTEFHX0NNUE9LICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9DTVBPSworI2RlZmluZSBMUFRJTV9GTEFHX0VYVFRSSUcgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9FWFRUUklHCisjZGVmaW5lIExQVElNX0ZMQUdfQVJSTSAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0FSUk0KKyNkZWZpbmUgTFBUSU1fRkxBR19DTVBNICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQ01QTQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9JbnRlcnJ1cHRzX0RlZmluaXRpb24gTFBUSU0gSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9JVF9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9ET1dOSUUKKyNkZWZpbmUgTFBUSU1fSVRfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfVVBJRQorI2RlZmluZSBMUFRJTV9JVF9BUlJPSyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9BUlJPS0lFCisjZGVmaW5lIExQVElNX0lUX0NNUE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0NNUE9LSUUKKyNkZWZpbmUgTFBUSU1fSVRfRVhUVFJJRyAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfRVhUVFJJR0lFCisjZGVmaW5lIExQVElNX0lUX0FSUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk1JRQorI2RlZmluZSBMUFRJTV9JVF9DTVBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBNSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX01hY3JvcyBMUFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IExQVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX0xQVElNX1NUQVRFX1JFU0VUOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayAgID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRShfX0hBTkRMRV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgKExQVElNX0NSX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0RJU0FCTEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAgfihMUFRJTV9DUl9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBwZXJpcGhlcmFsIGluIENvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgTFBUSU1fQ1JfQ05UU1RSVCkKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIHBlcmlwaGVyYWwgaW4gc2luZ2xlIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoX19IQU5ETEVfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX1NOR1NUUlQpCisgCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBMUFRJTSBDb3VudGVyIHJlZ2lzdGVyIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9SRVNFVF9DT1VOVEVSKF9fSEFORExFX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBMUFRJTV9DUl9DT1VOVFJTVCkKKworLyoqCisgICogQGJyaWVmICBSZXNldCBhZnRlciByZWFkIG9mIHRoZSBMUFRJTSBDb3VudGVyIHJlZ2lzdGVyIGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fUkVTRVRfQ09VTlRFUl9BRlRFUlJFQUQoX19IQU5ETEVfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX1JTVEFSRSkKKyAgICAKKy8qKgorICAqIEBicmllZiAgV3JpdGUgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaW4gdGhlIEF1dG9yZWxvYWQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19WQUxVRV9fIEF1dG9yZWxvYWQgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoX19IQU5ETEVfXyAsIF9fVkFMVUVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaW4gdGhlIENvbXBhcmUgcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgX19WQUxVRV9fIENvbXBhcmUgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoX19IQU5ETEVfXyAsIF9fVkFMVUVfXykgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTVAgPSAgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIExQVElNIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBMUFRJTSBmbGFnIHRvIGNoZWNrCisgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZjoKKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQVJST0sgICA6IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQ01QT0sgICA6IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfRVhUVFJJRyA6IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggRmxhZy4KKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGZsYWcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIExQVElNIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIExQVElNIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZjoKKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQVJST0sgICA6IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQ01QT0sgICA6IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfRVhUVFJJRyA6IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggRmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSICA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgTFBUSU0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIExQVElNIGludGVycnVwdCB0byBzZXQuCisgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZjoKKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRE9XTiAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX1VQICAgICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk9LICAgOiBBdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE9LICAgOiBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0VYVFRSSUcgOiBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJNICAgIDogQXV0b3JlbG9hZCBtYXRjaCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE0gICAgOiBDb21wYXJlIG1hdGNoIEludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICB8PSAoX19JTlRFUlJVUFRfXykpCisKKyAvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBMUFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIHNldC4KKyAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJST0sgICA6IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QT0sgICA6IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRVhUVFJJRyA6IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggSW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworICAgIC8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIExQVElNIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJPSyAgIDogQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBPSyAgIDogQ29tcGFyZSByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9FWFRUUklHIDogRXh0ZXJuYWwgdHJpZ2dlciBlZGdlIGV2ZW50IEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQuCisgICogQHJldHZhbCBJbnRlcnJ1cHQgc3RhdHVzLgorICAqLworICAgIAorI2RlZmluZSBfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKioKKyAgKiBAfQorICAqLworICAgCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgTFBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Jbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRGVJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIE1TUCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9MUFRJTV9Nc3BJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9Nc3BEZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFdNIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1BXTV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1BXTV9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgT25lIFB1bHNlIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNldCBvbmNlIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVuY29kZXIgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUaW1lIG91dCAgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1RpbWVPdXRfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1RpbWVPdXRfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1RpbWVPdXRfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1RpbWVPdXRfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ291bnRlciBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiBSZWFkaW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX0xQVElNX1JlYWRDb3VudGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZEF1dG9SZWxvYWQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQ29tcGFyZShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiBMUFRJTSBJUlEgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfTFBUSU1fSVJRSGFuZGxlcihMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiBDYWxsQmFjayBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUmVnaXN0ZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpscGh0aW0sIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwTFBUSU1fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwaHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfTFBUSU1fU3RhdGVUeXBlRGVmIEhBTF9MUFRJTV9HZXRTdGF0ZShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVHlwZXMgTFBUSU0gUHJpdmF0ZSBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVmFyaWFibGVzIExQVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9Qcml2YXRlX0NvbnN0YW50cyBMUFRJTSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfTWFjcm9zIExQVElNIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19MUFRJTV9DTE9DS19TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQykpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMiAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjQgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY4ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMTYgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjMyICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY2NCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMTI4KSkKKworI2RlZmluZSBJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVJESVYxKF9fUFJFU0NBTEVSX18pICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxKQorCisjZGVmaW5lIElTX0xQVElNX09VVFBVVF9QT0xBUklUWShfX1BPTEFSSVRZX18pICAoKChfX1BPTEFSSVRZX18pID09IExQVElNX09VVFBVVFBPTEFSSVRZX0xPVyApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fT1VUUFVUUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfU0FNUExFX1RJTUUoX19TQU1QTEVUSU1FX18pICgoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTEVUSU1FX18pID09IExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJVElPTlMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TKSkKKworI2RlZmluZSBJU19MUFRJTV9DTE9DS19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgKCgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0xQVElNX1RSR19TT1VSQ0UoX19UUklHX18pICAgICAgICAgICAoKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNykpCisKKyNkZWZpbmUgSVNfTFBUSU1fRVhUX1RSR19QT0xBUklUWShfX1BPTEFSSVRZX18pICgoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQUNUSVZFRURHRV9SSVNJTkcgICAgICAgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQUNUSVZFRURHRV9GQUxMSU5HICAgICAgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQUNUSVZFRURHRV9SSVNJTkdfRkFMTElORyApKQorCisjZGVmaW5lIElTX0xQVElNX1RSSUdfU0FNUExFX1RJTUUoX19TQU1QTEVUSU1FX18pICgoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTlMgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMgICAgKSkKKworI2RlZmluZSBJU19MUFRJTV9VUERBVEVfTU9ERShfX01PREVfXykgICAgICAgICAgKCgoX19NT0RFX18pID09IExQVElNX1VQREFURV9JTU1FRElBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBMUFRJTV9VUERBVEVfRU5ET0ZQRVJJT0QpKQorCisjZGVmaW5lIElTX0xQVElNX0NPVU5URVJfU09VUkNFKF9fU09VUkNFX18pICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0lOVEVSTkFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKworI2RlZmluZSBJU19MUFRJTV9BVVRPUkVMT0FEKF9fQVVUT1JFTE9BRF9fKSAgICAgKChfX0FVVE9SRUxPQURfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX0NPTVBBUkUoX19DT01QQVJFX18pICAgICAgICAgICAoKF9fQ09NUEFSRV9fKSA8PSAweDAwMDBGRkZGVUwpCisKKyNkZWZpbmUgSVNfTFBUSU1fUEVSSU9EKF9fUEVSSU9EX18pICAgICAgICAgICAgICgoX19QRVJJT0RfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX1BVTFNFKF9fUFVMU0VfXykgICAgICAgICAgICAgICAoKF9fUFVMU0VfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX0lOUFVUMV9TT1VSQ0UoX19JTlNUQU5DRV9fLCBfX1NPVVJDRV9fKSAgXAorICAgICgoKChfX0lOU1RBTkNFX18pID09IExQVElNMSkgJiYgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoX19TT1VSQ0VfXykgPT0gTFBUSU1fSU5QVVQxU09VUkNFX0dQSU8pIHx8ICAgICAgICBcCisgICAgICAoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMVNPVVJDRV9DT01QMSkpKSAgICAgICAgXAorICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBMUFRJTTIpICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMVNPVVJDRV9HUElPKSB8fCAgICAgICAgXAorICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDFTT1VSQ0VfQ09NUDEpIHx8ICAgICAgIFwKKyAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAyKSB8fCAgICAgICBcCisgICAgICAoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMVNPVVJDRV9DT01QMV9DT01QMikpKSkKKworI2RlZmluZSBJU19MUFRJTV9JTlBVVDJfU09VUkNFKF9fSU5TVEFOQ0VfXywgX19TT1VSQ0VfXykgIFwKKyAgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBMUFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMlNPVVJDRV9HUElPKSB8fCAgICAgICAgXAorICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDJTT1VSQ0VfQ09NUDIpKSkKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIExQVElNMSB8fCBMUFRJTTIgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX0xQVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3B3ci5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfcHdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5ODhkMQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX3B3ci5oCkBAIC0wLDAgKzEsNTAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9wd3IuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1BXUl9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfUFdSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUiBQV1IKKyAgKiBAYnJpZWYgUFdSIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX1R5cGVzIFBXUiBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgUFdSIFBWRCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQVkRMZXZlbDsgICAgLyohPCBQVkRMZXZlbDogU3BlY2lmaWVzIHRoZSBQVkQgZGV0ZWN0aW9uIGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb3IgYSBjb21iaW5hdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBQV1JfUFZEX2RldGVjdGlvbl9sZXZlbC4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgLyohPCBNb2RlOiBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUFdSX1BWRF9Nb2RlLiAqLworfVBXUl9QVkRUeXBlRGVmOworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFBXUl9QVkRfZGV0ZWN0aW9uX2xldmVsICBQcm9ncmFtbWFibGUgVm9sdGFnZSBEZXRlY3Rpb24gbGV2ZWxzCisgICogQG5vdGUgICBzZWUgZGF0YXNoZWV0IGZvciBzZWxlY3Rpb24gdm9sdGFnZSB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF9SSVNJTkdfMCAgICAgICAgICAgICAgICgweDAwMDAwMDAwdSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQVkQgdGhyZXNob2xkIGxldmVsIDAgZm9yIHJpc2luZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX1JJU0lOR18xICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZEUlRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgMSBmb3IgcmlzaW5nIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfUklTSU5HXzIgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRSVF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUFZEIHRocmVzaG9sZCBsZXZlbCAyIGZvciByaXNpbmcgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF9SSVNJTkdfMyAgICAgICAgICAgICAgIChQV1JfQ1IyX1BWRFJUXzAgfCBQV1JfQ1IyX1BWRFJUXzEpICAgICAgICAgICAgICAgICAgICAgLyohPCBQVkQgdGhyZXNob2xkIGxldmVsIDMgZm9yIHJpc2luZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX1JJU0lOR180ICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZEUlRfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgNCBmb3IgcmlzaW5nIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfUklTSU5HXzUgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRSVF8yIHwgUFdSX0NSMl9QVkRSVF8wKSAgICAgICAgICAgICAgICAgICAgIC8qITwgUFZEIHRocmVzaG9sZCBsZXZlbCA1IGZvciByaXNpbmcgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF9SSVNJTkdfNiAgICAgICAgICAgICAgIChQV1JfQ1IyX1BWRFJUXzIgfCBQV1JfQ1IyX1BWRFJUXzEpICAgICAgICAgICAgICAgICAgICAgLyohPCBQVkQgdGhyZXNob2xkIGxldmVsIDYgZm9yIHJpc2luZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfMCAgICAgICAgICAgICAgKDB4MDAwMDAwMDB1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgMCBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfMSAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgMSBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfMiAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgMiBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfMyAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMCB8IFBXUl9DUjJfUFZERlRfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgMyBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfNCAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgNCBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfNSAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMiB8IFBXUl9DUjJfUFZERlRfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgNSBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMX0ZBTExJTkdfNiAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMiB8IFBXUl9DUjJfUFZERlRfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFBWRCB0aHJlc2hvbGQgbGV2ZWwgNiBmb3IgZmFsbGluZyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzAgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfMCB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzApICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCAwIG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzEgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfMSB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzEpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCAxIG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzIgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfMiB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzIpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCAyIG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzMgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfMyB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzMpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCAzIG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzQgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfNCB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzQpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCA0IG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzUgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfNSB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzUpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCA1IG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzYgICAgICAgICAgICAgICAgICAgICAgKFBXUl9QVkRMRVZFTF9SSVNJTkdfNiB8IFBXUl9QVkRMRVZFTF9GQUxMSU5HXzYpICAgICAgICAvKiE8IHNhbWUgUFZEIHRocmVzaG9sZCBsZXZlbCA2IG9uIHJpc2luZyAmIGZhbGxpbmcgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzcgICAgICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZEUlRfMiB8IFBXUl9DUjJfUFZEUlRfMSB8IFBXUl9DUjJfUFZEUlRfMCkgICAvKiE8IEV4dGVybmFsIGlucHV0IGFuYWxvZyB2b2x0YWdlIChjb21wYXJlZCBpbnRlcm5hbGx5IHRvIFZSRUZJTlQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9QVkRfTW9kZSAgUFdSIFBWRCBpbnRlcnJ1cHQgYW5kIGV2ZW50IG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfUFZEX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMHUpICAvKiE8IGJhc2ljIG1vZGUgaXMgdXNlZCAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAoMHgwMDAxMDAwMXUpICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgKDB4MDAwMTAwMDJ1KSAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAoMHgwMDAxMDAwM3UpICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfRVZFTlRfUklTSU5HICAgICAgICAgICAoMHgwMDAyMDAwMXUpICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZEX01PREVfRVZFTlRfRkFMTElORyAgICAgICAgICAoMHgwMDAyMDAwMnUpICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HICAgKDB4MDAwMjAwMDN1KSAgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX0VYVElfTElORSAgUFdSIFBWRCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZEICAgICAgICAgICAgICAgICAgIChFWFRJX0lNUjFfSU0xNikgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTYgY29ubmVjdGVkIHRvIFBWRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX0VWRU5UX0xJTkUgIFBXUiBQVkQgZXZlbnQgbGluZQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9FVkVOVF9MSU5FX1BWRCAgICAgICAgICAgICAgICAgIChFWFRJX0VNUjFfRU0xNikgIC8qITwgRXZlbnQgbGluZSAxNiBjb25uZWN0ZWQgdG8gUFZEICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1dha2VVcF9QaW5zICBQV1IgV2FrZVVwIHBpbnMKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjEgICAgICAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAxICAvKiE8IFdha2V1cCBwaW4gMSAod2l0aCBoaWdoIGxldmVsIGRldGVjdGlvbikgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4yICAgICAgICAgICAgICAgICAgICAgUFdSX0NSM19FV1VQMiAgLyohPCBXYWtldXAgcGluIDIgKHdpdGggaGlnaCBsZXZlbCBkZXRlY3Rpb24pICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONCAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjNfRVdVUDQgIC8qITwgV2FrZXVwIHBpbiA0ICh3aXRoIGhpZ2ggbGV2ZWwgZGV0ZWN0aW9uKSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjUgICAgICAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA1ICAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBoaWdoIGxldmVsIGRldGVjdGlvbikgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU42ICAgICAgICAgICAgICAgICAgICAgUFdSX0NSM19FV1VQNiAgLyohPCBXYWtldXAgcGluIDYgKHdpdGggaGlnaCBsZXZlbCBkZXRlY3Rpb24pICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMV9ISUdIICAgICAgICAgICAgICAgIFBXUl9DUjNfRVdVUDEgIC8qITwgV2FrZXVwIHBpbiAxICh3aXRoIGhpZ2ggbGV2ZWwgZGV0ZWN0aW9uKSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjJfSElHSCAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAyICAvKiE8IFdha2V1cCBwaW4gMiAod2l0aCBoaWdoIGxldmVsIGRldGVjdGlvbikgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU40X0hJR0ggICAgICAgICAgICAgICAgUFdSX0NSM19FV1VQNCAgLyohPCBXYWtldXAgcGluIDQgKHdpdGggaGlnaCBsZXZlbCBkZXRlY3Rpb24pICovCisjaWYgZGVmaW5lZChQV1JfQ1IzX0VXVVA1KQorI2RlZmluZSBQV1JfV0FLRVVQX1BJTjVfSElHSCAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA1ICAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBoaWdoIGxldmVsIGRldGVjdGlvbikgKi8KKyNlbmRpZgorI2RlZmluZSBQV1JfV0FLRVVQX1BJTjZfSElHSCAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA2ICAvKiE8IFdha2V1cCBwaW4gNiAod2l0aCBoaWdoIGxldmVsIGRldGVjdGlvbikgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4xX0xPVyAgICAgICAgICAgICAgICAgKChQV1JfQ1I0X1dQMSA8PCBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSB8IFBXUl9DUjNfRVdVUDEpIC8qITwgV2FrZXVwIHBpbiAxICh3aXRoIGxvdyBsZXZlbCBkZXRlY3Rpb24pICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMl9MT1cgICAgICAgICAgICAgICAgICgoUFdSX0NSNF9XUDIgPDwgUFdSX1dVUF9QT0xBUklUWV9TSElGVCkgfCBQV1JfQ1IzX0VXVVAyKSAvKiE8IFdha2V1cCBwaW4gMiAod2l0aCBsb3cgbGV2ZWwgZGV0ZWN0aW9uKSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfTE9XICAgICAgICAgICAgICAgICAoKFBXUl9DUjRfV1A0IDw8IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQNCkgLyohPCBXYWtldXAgcGluIDQgKHdpdGggbG93IGxldmVsIGRldGVjdGlvbikgKi8KKyNpZiBkZWZpbmVkKFBXUl9DUjNfRVdVUDUpCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONV9MT1cgICAgICAgICAgICAgICAgICgoUFdSX0NSNF9XUDUgPDwgUFdSX1dVUF9QT0xBUklUWV9TSElGVCkgfCBQV1JfQ1IzX0VXVVA1KSAvKiE8IFdha2V1cCBwaW4gNSAod2l0aCBsb3cgbGV2ZWwgZGV0ZWN0aW9uKSAqLworI2VuZGlmCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONl9MT1cgICAgICAgICAgICAgICAgICgoUFdSX0NSNF9XUDYgPDwgUFdSX1dVUF9QT0xBUklUWV9TSElGVCkgfCBQV1JfQ1IzX0VXVVA2KSAvKiE8IFdha2V1cCBwaW4gNiAod2l0aCBsb3cgbGV2ZWwgZGV0ZWN0aW9uKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTG93X1Bvd2VyX01vZGVfU2VsZWN0aW9uICBQV1IgTG93IFBvd2VyIE1vZGUgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0xPV1BPV0VSTU9ERV9TVE9QMCAgICAgICAgICAgICAgKDB4MDAwMDAwMDB1KSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIDA6IHN0b3AgbW9kZSB3aXRoIG1haW4gcmVndWxhdG9yICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUk1PREVfU1RPUDEgICAgICAgICAgICAgIChQV1JfQ1IxX0xQTVNfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCAxOiBzdG9wIG1vZGUgd2l0aCBsb3cgcG93ZXIgcmVndWxhdG9yICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUk1PREVfU1RBTkRCWSAgICAgICAgICAgIChQV1JfQ1IxX0xQTVNfMCB8IFBXUl9DUjFfTFBNU18xKSAgIC8qITwgU3RhbmRieSBtb2RlICovCisjaWYgZGVmaW5lZChQV1JfU0hEV19TVVBQT1JUKQorI2RlZmluZSBQV1JfTE9XUE9XRVJNT0RFX1NIVVRET1dOICAgICAgICAgICAoUFdSX0NSMV9MUE1TXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IFNodXRkb3duIG1vZGUgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUmVndWxhdG9yX3N0YXRlX2luX1NMRUVQX1NUT1BfbW9kZSAgUFdSIHJlZ3VsYXRvciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX01BSU5SRUdVTEFUT1JfT04gICAgICAgICAgICAgICAgKDB4MDAwMDAwMDB1KSAgLyohPCBSZWd1bGF0b3IgaW4gbWFpbiBtb2RlICAgICAgKi8KKyNkZWZpbmUgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OICAgICAgICAgICAgUFdSX0NSMV9MUFIgICAgLyohPCBSZWd1bGF0b3IgaW4gbG93LXBvd2VyIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1NMRUVQX21vZGVfZW50cnkgIFBXUiBTTEVFUCBtb2RlIGVudHJ5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1NMRUVQRU5UUllfV0ZJICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDF1KSAgICAgICAgLyohPCBXYWl0IEZvciBJbnRlcnJ1cHRpb24gaW5zdHJ1Y3Rpb24gdG8gZW50ZXIgU2xlZXAgbW9kZSAqLworI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkUgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMnUpICAgICAgICAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFNsZWVwIG1vZGUgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9TVE9QX21vZGVfZW50cnkgIFBXUiBTVE9QIG1vZGUgZW50cnkKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfU1RPUEVOVFJZX1dGSSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMXUpICAgICAgICAvKiE8IFdhaXQgRm9yIEludGVycnVwdGlvbiBpbnN0cnVjdGlvbiB0byBlbnRlciBTdG9wIG1vZGUgKi8KKyNkZWZpbmUgUFdSX1NUT1BFTlRSWV9XRkUgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJ1KSAgICAgICAgLyohPCBXYWl0IEZvciBFdmVudCBpbnN0cnVjdGlvbiB0byBlbnRlciBTdG9wIG1vZGUgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRmxhZyAgUFdSIFN0YXR1cyBGbGFncworICAqIEBicmllZiAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDAgMDBYWCAwMDBZIFlZWVliCisgICogICAgICAgICAgIC0gWSBZWVlZICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1IGJpdHMpCisgICogICAgICAgICAgIC0gWFggIDogU3RhdHVzIHJlZ2lzdGVyICgyIGJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IFNSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBTUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBQV1JfRkxBR19XVSwgZW5jb21wYXNzaW5nIGFsbAorICAqICAgICAgICAgd2FrZS11cCBmbGFncyBhbmQgc2V0IHRvIFBXUl9TUjFfV1VGLgorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9GTEFHX1dVRjEgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwdSB8IFBXUl9TUjFfV1VGMSkgICAgICAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDEgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfV1VGMiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDB1IHwgUFdSX1NSMV9XVUYyKSAgICAgIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gMiAqLworI2RlZmluZSBQV1JfRkxBR19XVUY0ICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMHUgfCBQV1JfU1IxX1dVRjQpICAgICAgLyohPCBXYWtldXAgZXZlbnQgb24gd2FrZXVwIHBpbiA0ICovCisjaWYgZGVmaW5lZChQV1JfQ1IzX0VXVVA1KQorI2RlZmluZSBQV1JfRkxBR19XVUY1ICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMHUgfCBQV1JfU1IxX1dVRjUpICAgICAgLyohPCBXYWtldXAgZXZlbnQgb24gd2FrZXVwIHBpbiA1ICovCisjZW5kaWYKKyNkZWZpbmUgUFdSX0ZMQUdfV1VGNiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDB1IHwgUFdSX1NSMV9XVUY2KSAgICAgIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gNiAqLworI2RlZmluZSBQV1JfRkxBR19XVUYgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMHUgfCBQV1JfU1IxX1dVRikgICAgICAgLyohPCBXYWtldXAgZXZlbnQgb24gYWxsIHdha2V1cCBwaW4gICovCisjZGVmaW5lIFBXUl9GTEFHX1NCICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwdSB8IFBXUl9TUjFfU0JGKSAgICAgICAvKiE8IFN0YW5kYnkgZmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19XVUZJICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMHUgfCBQV1JfU1IxX1dVRkkpICAgICAgLyohPCBXYWtldXAgb24gaW50ZXJuYWwgd2FrZXVwIGxpbmUgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfRkxBU0hfUkVBRFkgICAgICAgICAgICAgICAgKDB4MDAwMjAwMDB1IHwgUFdSX1NSMl9GTEFTSF9SRFkpIC8qITwgRmxhc2ggcmVhZHkgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfUkVHTFBTICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMjAwMDB1IHwgUFdSX1NSMl9SRUdMUFMpICAgIC8qITwgUmVndWxhdG9yIExvdyBQb3dlciBzdGFydGVkICovCisjZGVmaW5lIFBXUl9GTEFHX1JFR0xQRiAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDAwdSB8IFBXUl9TUjJfUkVHTFBGKSAgICAvKiE8IFJlZ3VsYXRvciBMb3cgUG93ZXIgZmxhZyAqLworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorI2RlZmluZSBQV1JfRkxBR19QVkRPICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMHUgfCBQV1JfU1IyX1BWRE8pICAgICAgLyohPCBQb3dlciBWb2x0YWdlIERldGVjdG9yIG91dHB1dCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfTWFjcm9zICBQV1IgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgUFdSIGZsYWcgaXMgc2V0LgorICAqIEBwYXJhbSAgX19GTEFHX18gIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgYSBjb21iaW5hdGlvbiBvZiBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUYxOiBXYWtlIFVwIEZsYWcgMS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiAxLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUYyOiBXYWtlIFVwIEZsYWcgMi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiAyLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUY0OiBXYWtlIFVwIEZsYWcgNC4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiA0LgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUY1OiBXYWtlIFVwIEZsYWcgNS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiA1LgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUY2OiBXYWtlIFVwIEZsYWcgNi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBXS1VQIHBpbiA2LgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19TQjogU3RhbmRCeSBGbGFnLiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtCisgICogICAgICAgICAgICAgICAgICBlbnRlcmVkIFN0YW5kQnkgbW9kZS4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGSTogV2FrZS1VcCBGbGFnIEludGVybmFsLiBTZXQgd2hlbiBhIHdha2V1cCBpcworICAqICAgICAgICAgICAgICAgICBkZXRlY3RlZCBvbiB0aGUgaW50ZXJuYWwgd2FrZXVwIGxpbmUuCisgICogICAgICAgICBPUiBhIGNvbWJpbmF0aW9uIG9mIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX0ZMQVNIX1JFQURZOiBGbGFzaCBpcyByZWFkeS4gSW5kaWNhdGVzIHdoZXRoZXIgZmxhc2gKKyAgKiAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgb3Igbm90CisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1JFR0xQUzogTG93IFBvd2VyIFJlZ3VsYXRvciBTdGFydGVkLiBJbmRpY2F0ZXMgd2hldGhlcgorICAqICAgICAgICAgICAgICAgICBvciBub3QgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaXMgcmVhZHkuCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1JFR0xQRjogTG93IFBvd2VyIFJlZ3VsYXRvciBGbGFnLiBJbmRpY2F0ZXMgd2hldGhlciB0aGUKKyAgKiAgICAgICAgICAgICAgICAgcmVndWxhdG9yIGlzIHJlYWR5IGluIG1haW4gbW9kZSBvciBpcyBpbiBsb3ctcG93ZXIgbW9kZS4KKyAgKiBAaWYgZGVmaW5lZChTVE0zMkcwODF4eCkKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfUFZETzogUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBPdXRwdXQuIEluZGljYXRlcyB3aGV0aGVyCisgICogICAgICAgICAgICAgICAgIFZERCB2b2x0YWdlIGlzIGJlbG93IG9yIGFib3ZlIHRoZSBzZWxlY3RlZCBQVkQgdGhyZXNob2xkLgorICAqIEBlbmRpZgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICgoKF9fRkxBR19fKSAmIDB4MDAwMTAwMDB1KSA/XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBXUi0+U1IxICYgKChfX0ZMQUdfXykgJiB+MHgwMDAzMDAwMHUpKSA9PSAoKF9fRkxBR19fKSAmIH4weDAwMDMwMDAwdSkpIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFdSLT5TUjIgJiAoKF9fRkxBR19fKSAmIH4weDAwMDMwMDAwdSkpID09ICgoX19GTEFHX18pICYgfjB4MDAwMzAwMDB1KSkpCisKKy8qKiBAYnJpZWYgIENsZWFyIGEgc3BlY2lmaWMgUFdSIGZsYWcuCisgICogQHBhcmFtICBfX0ZMQUdfXyAgc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGMTogV2FrZSBVcCBGbGFnIDEuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMS4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGMjogV2FrZSBVcCBGbGFnIDIuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMi4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGNDogV2FrZSBVcCBGbGFnIDQuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNC4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGNTogV2FrZSBVcCBGbGFnIDUuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNS4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGNjogV2FrZSBVcCBGbGFnIDYuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNi4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGOiBFbmNvbXBhc3NlcyBhbGwgV2FrZSBVcCBGbGFncy4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfU0I6IFN0YW5kYnkgRmxhZy4gSW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbQorICAqICAgICAgICAgICAgICAgICAgZW50ZXJlZCBTdGFuZGJ5IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgIChQV1ItPlNDUiA9IChfX0ZMQUdfXykpCisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgU0VUX0JJVChFWFRJLT5JTVIxLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgQ0xFQVJfQklUKEVYVEktPklNUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVkQgRXZlbnQgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgU0VUX0JJVChFWFRJLT5FTVIxLCBQV1JfRVZFTlRfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXZlbnQgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgICAgICAgQ0xFQVJfQklUKEVYVEktPkVNUjEsIFBXUl9FVkVOVF9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgU0VUX0JJVChFWFRJLT5SVFNSMSwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICBDTEVBUl9CSVQoRVhUSS0+UlRTUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgU0VUX0JJVChFWFRJLT5GVFNSMSwgUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgQ0xFQVJfQklUKEVYVEktPkZUU1IxLCBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgU0VUX0JJVChFWFRJLT5TV0lFUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIFBWRCBFWFRJIGludGVycnVwdCBSaXNpbmcgZmxhZyBpcyBzZXQuCisgICogQHJldHZhbCBFWFRJIFBWRCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9SSVNJTkdfRkxBRygpICAgICAgKEVYVEktPlJQUjEgJiBQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBQVkQgRVhUSSBpbnRlcnJ1cHQgRmFsbGluZyBmbGFnIGlzIHNldC4KKyAgKiBAcmV0dmFsIEVYVEkgUFZEIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfR0VUX0ZBTExJTkdfRkxBRygpICAgICAoRVhUSS0+RlBSMSAmIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFBWRCBFWFRJIGludGVycnVwdCBSaXNpbmcgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX1JJU0lOR19GTEFHKCkgICAgV1JJVEVfUkVHKEVYVEktPlJQUjEsIFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFBWRCBFWFRJIGludGVycnVwdCBGYWxsaW5nIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9DTEVBUl9GQUxMSU5HX0ZMQUcoKSAgIFdSSVRFX1JFRyhFWFRJLT5GUFIxLCBQV1JfRVhUSV9MSU5FX1BWRCkKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JFeF9XVVBfUG9sYXJpdHkgU2hpZnQgdG8gYXBwbHkgdG8gcmV0cmlldmUgcG9sYXJpdHkgaW5mb3JtYXRpb24gZnJvbSBQV1JfV0FLRVVQX1BJTnlfeHh4IGNvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQgICAgICAgICAgICAgIDB4MDh1ICAgLyohPCBJbnRlcm5hbCBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHdha2V1cCBwaW4gcG9sYXJpcnkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGVfTWFjcm9zICBQV1IgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorI2RlZmluZSBJU19QV1JfUFZEX0xFVkVMKExFVkVMKSAgICAgICAgICAgICAgICAgICAoKChMRVZFTCkgJiB+KFBXUl9DUjJfUFZEUlQgfCBQV1JfQ1IyX1BWREZUKSkgPT0gMHgwMDAwMDAwMHUpCisKKyNkZWZpbmUgSVNfUFdSX1BWRF9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX05PUk1BTCkgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX1JJU0lORykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX0ZBTExJTkcpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HKSkKKyNlbmRpZgorI2RlZmluZSBJU19QV1JfV0FLRVVQX1BJTihQSU4pICAgICAgICAgICAgICAgICAgICAoKCgoUElOKSAmICgoUFdSX0NSNF9XUCA8PCA4VSkgfCAoUFdSX0NSM19FV1VQKSkpICE9IDB4MDAwMDAwMDB1KSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQSU4pICYgfigoUFdSX0NSNF9XUCA8PCA4VSkgfCAoUFdSX0NSM19FV1VQKSkpID09IDB4MDAwMDAwMDB1KSkKKworI2RlZmluZSBJU19QV1JfUkVHVUxBVE9SKFJFR1VMQVRPUikgICAgICAgICAgICAgICAoKChSRUdVTEFUT1IpID09IFBXUl9NQUlOUkVHVUxBVE9SX09OKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFR1VMQVRPUikgPT0gUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OKSkKKworI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpICAgICAgICAgICAgICAgICAoKChFTlRSWSkgPT0gUFdSX1NMRUVQRU5UUllfV0ZJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVOVFJZKSA9PSBQV1JfU0xFRVBFTlRSWV9XRkUpKQorCisjZGVmaW5lIElTX1BXUl9TVE9QX0VOVFJZKEVOVFJZKSAgICAgICAgICAgICAgICAgICgoKEVOVFJZKSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFTlRSWSkgPT0gUFdSX1NUT1BFTlRSWV9XRkUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBQV1IgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfcHdyX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnMgIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9EZUluaXQodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3Modm9pZCk7CisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSX0NvbmZpZ1BWRChQV1JfUFZEVHlwZURlZiAqc0NvbmZpZ1BWRCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKTsKKyNlbmRpZgorLyogV2FrZVVwIHBpbnMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpblBvbGFyaXR5KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNMRUVQRW50cnkpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFJlZ3VsYXRvciwgdWludDhfdCBTVE9QRW50cnkpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0Rpc2FibGVTRVZPblBlbmQodm9pZCk7CisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX1BWRF9JUlFIYW5kbGVyKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9QVkRfUmlzaW5nX0NhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9QVkRfRmFsbGluZ19DYWxsYmFjayh2b2lkKTsKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9QV1JfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfcHdyX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9wd3JfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U5NDJmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfcHdyX2V4LmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3B3cl9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfUFdSX0VYX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9QV1JfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXggUFdSRXgKKyAgKiBAYnJpZWYgUFdSIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0NvbnN0YW50cyAgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfVkJBVF9CYXR0ZXJ5X0NoYXJnaW5nX1NlbGVjdGlvbiAgUFdSIGJhdHRlcnkgY2hhcmdpbmcgcmVzaXN0b3Igc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfNSAgICAgKDB4MDAwMDAwMDB1KSAgIC8qITwgVkJBVCBjaGFyZ2luZyB0aHJvdWdoIGEgNSBrT2htcyByZXNpc3RvciAgICovCisjZGVmaW5lIFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzFfNSAgIFBXUl9DUjRfVkJSUyAgICAvKiE8IFZCQVQgY2hhcmdpbmcgdGhyb3VnaCBhIDEuNSBrT2htcyByZXNpc3RvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9HUElPX0JpdF9OdW1iZXIgIEdQSU8gYml0IHBvc2l0aW9uCisgICogQGJyaWVmICAgIGZvciBJL08gcHVsbCB1cC9kb3duIHNldHRpbmcgaW4gc3RhbmRieS9zaHV0ZG93biBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzIgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMiAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMiAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzMgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMyAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzQgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVNCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzUgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVNSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzYgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVNiAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNiAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzcgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVNyAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gNyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzggICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVOCAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gOCAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzkgICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVOSAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gOSAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEwICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTAgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzExICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTEgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTEgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEyICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTIgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTIgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzEzICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTMgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTMgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzE0ICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTQgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTQgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQklUXzE1ICAgICAgICAgICAgICAgICAgICAgUFdSX1BVQ1JCX1BVMTUgIC8qITwgR1BJTyBwb3J0IEkvTyBwaW4gMTUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfR1BJT19Qb3J0ICBHUElPIFBvcnQKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfR1BJT19BICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMHUpICAvKiE8IEdQSU8gcG9ydCBBICovCisjZGVmaW5lIFBXUl9HUElPX0IgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxdSkgIC8qITwgR1BJTyBwb3J0IEIgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJ1KSAgLyohPCBHUElPIHBvcnQgQyAqLworI2RlZmluZSBQV1JfR1BJT19EICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM3UpICAvKiE8IEdQSU8gcG9ydCBEICovCisjZGVmaW5lIFBXUl9HUElPX0YgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA1dSkgIC8qITwgR1BJTyBwb3J0IEYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRmxhc2hfUG93ZXJEb3duICBGbGFzaCBQb3dlciBEb3duIG1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0ZMQVNIUERfTFBSVU4gICAgICAgICAgICAgICAgICAgUFdSX0NSMV9GUERfTFBSVU4gIC8qITwgRW5hYmxlIEZsYXNoIHBvd2VyIGRvd24gaW4gbG93IHBvd2VyIHJ1biBtb2RlICovCisjZGVmaW5lIFBXUl9GTEFTSFBEX0xQU0xFRVAgICAgICAgICAgICAgICAgIFBXUl9DUjFfRlBEX0xQU0xQICAvKiE8IEVuYWJsZSBGbGFzaCBwb3dlciBkb3duIGluIGxvdyBwb3dlciBzbGVlcCBtb2RlICovCisjZGVmaW5lIFBXUl9GTEFTSFBEX1NUT1AgICAgICAgICAgICAgICAgICAgIFBXUl9DUjFfRlBEX1NUT1AgICAvKiE8IEVuYWJsZSBGbGFzaCBwb3dlciBkb3duIGluIHN0b3AgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9SZWd1bGF0b3JfVm9sdGFnZV9TY2FsZSAgUFdSIFJlZ3VsYXRvciB2b2x0YWdlIHNjYWxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSAgICAgICAgUFdSX0NSMV9WT1NfMCAgLyohPCBWb2x0YWdlIHNjYWxpbmcgcmFuZ2UgMSAqLworI2RlZmluZSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyICAgICAgICBQV1JfQ1IxX1ZPU18xICAvKiE8IFZvbHRhZ2Ugc2NhbGluZyByYW5nZSAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCAgUFdSRXhfUHJpdmF0ZV9NYWNyb3MgICBQV1IgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19QV1JfQkFUVEVSWV9SRVNJU1RPUl9TRUxFQ1QoX19SRVNJU1RPUl9fKSAoKChfX1JFU0lTVE9SX18pID09IFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRVNJU1RPUl9fKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl8xXzUpKQorCisjZGVmaW5lIElTX1BXUl9HUElPX0JJVF9OVU1CRVIoX19CSVRfTlVNQkVSX18pICAoKCgoX19CSVRfTlVNQkVSX18pICYgMHgwMDAwRkZGRnUpICE9IDB4MDB1KSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19CSVRfTlVNQkVSX18pICYgMHhGRkZGMDAwMHUpID09IDB4MDB1KSkKKworI2RlZmluZSBJU19QV1JfR1BJTyhfX0dQSU9fXykgICAgICAgICAgICAgICAoKChfX0dQSU9fXykgPT0gUFdSX0dQSU9fQSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU9fXykgPT0gUFdSX0dQSU9fQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU9fXykgPT0gUFdSX0dQSU9fQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU9fXykgPT0gUFdSX0dQSU9fRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0dQSU9fXykgPT0gUFdSX0dQSU9fRikpCisKKyNkZWZpbmUgSVNfUFdSX0ZMQVNIX1BPV0VSRE9XTihfX01PREVfXykgICAgKCgoKF9fTU9ERV9fKSAmIChQV1JfRkxBU0hQRF9MUFJVTiB8IFBXUl9GTEFTSFBEX0xQU0xFRVAgfCBQV1JfRkxBU0hQRF9TVE9QKSkgIT0gMHgwMHUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fTU9ERV9fKSAmIH4oUFdSX0ZMQVNIUERfTFBSVU4gfCBQV1JfRkxBU0hQRF9MUFNMRUVQIHwgUFdSX0ZMQVNIUERfU1RPUCkpID09IDB4MDB1KSkKKworI2RlZmluZSBJU19QV1JfVk9MVEFHRV9TQ0FMSU5HX1JBTkdFKFJBTkdFKSAoKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9ucyAgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHVpbnQzMl90IFJlc2lzdG9yU2VsZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpOworI2lmIGRlZmluZWQoUFdSX0NSM19FTkJfVUxQKQordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVBPUk1vbml0b3JTYW1wbGluZyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlUE9STW9uaXRvclNhbXBsaW5nKHZvaWQpOworI2VuZGlmCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVJbnRlcm5hbFdha2VVcExpbmUodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlUHVsbFVwUHVsbERvd25Db25maWcodm9pZCk7CisjaWYgZGVmaW5lZChQV1JfQ1IzX1JSUykKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVTUkFNUmV0ZW50aW9uKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVTUkFNUmV0ZW50aW9uKHZvaWQpOworI2VuZGlmCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlRmxhc2hQb3dlckRvd24odWludDMyX3QgUG93ZXJNb2RlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlRmxhc2hQb3dlckRvd24odWludDMyX3QgUG93ZXJNb2RlKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9QV1JFeF9HZXRWb2x0YWdlUmFuZ2Uodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKTsKKyNpZiBkZWZpbmVkKFBXUl9TSERXX1NVUFBPUlQpCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUodm9pZCk7CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9QV1JfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfcmNjLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9yY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTRkYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfcmNjLmgKQEAgLTAsMCArMSwyNDQ0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9yY2MuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJDQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfUkNDX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcmNjLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZpbmVzIHVzZWQgZm9yIEZsYWdzICovCisjZGVmaW5lIENSX1JFR19JTkRFWCAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgQkRDUl9SRUdfSU5ERVggICAgICAgICAgICAyVQorI2RlZmluZSBDU1JfUkVHX0lOREVYICAgICAgICAgICAgIDNVCisKKyNkZWZpbmUgUkNDX0ZMQUdfTUFTSyAgICAgICAgICAgICAweDFGVQorCisvKiBEZWZpbmUgdXNlZCBmb3IgSVNfUkNDX0NMT0NLVFlQRSgpICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfQUxMICAgICAgICAgICAgICAoUkNDX0NMT0NLVFlQRV9TWVNDTEsgfCBSQ0NfQ0xPQ0tUWVBFX0hDTEsgfCBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSAgLyohPCBBbGwgY2xvY2t0eXBlIHRvIGNvbmZpZ3VyZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX1JDQ19PU0NJTExBVE9SVFlQRShfX09TQ0lMTEFUT1JfXykgKCgoX19PU0NJTExBVE9SX18pID09IFJDQ19PU0NJTExBVE9SVFlQRV9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkpCisKKyNkZWZpbmUgSVNfUkNDX0hTRShfX0hTRV9fKSAgKCgoX19IU0VfXykgPT0gUkNDX0hTRV9PRkYpIHx8ICgoX19IU0VfXykgPT0gUkNDX0hTRV9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hTRV9fKSA9PSBSQ0NfSFNFX0JZUEFTUykpCisKKyNkZWZpbmUgSVNfUkNDX0xTRShfX0xTRV9fKSAgKCgoX19MU0VfXykgPT0gUkNDX0xTRV9PRkYpIHx8ICgoX19MU0VfXykgPT0gUkNDX0xTRV9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xTRV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykpCisKKyNkZWZpbmUgSVNfUkNDX0hTSShfX0hTSV9fKSAgKCgoX19IU0lfXykgPT0gUkNDX0hTSV9PRkYpIHx8ICgoX19IU0lfXykgPT0gUkNDX0hTSV9PTikpCisKKyNkZWZpbmUgSVNfUkNDX0hTSV9DQUxJQlJBVElPTl9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAodWludDMyX3QpMTI3VSkKKworI2RlZmluZSBJU19SQ0NfSFNJRElWKF9fRElWX18pICgoKF9fRElWX18pID09IFJDQ19IU0lfRElWMSkgIHx8ICgoX19ESVZfXykgPT0gUkNDX0hTSV9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX0hTSV9ESVY0KSAgfHwgKChfX0RJVl9fKSA9PSBSQ0NfSFNJX0RJVjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfSFNJX0RJVjE2KSB8fCAoKF9fRElWX18pID09IFJDQ19IU0lfRElWMzIpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19IU0lfRElWNjQpIHx8ICgoX19ESVZfXykgPT0gUkNDX0hTSV9ESVYxMjgpKQorCisjZGVmaW5lIElTX1JDQ19MU0koX19MU0lfXykgICgoKF9fTFNJX18pID09IFJDQ19MU0lfT0ZGKSB8fCAoKF9fTFNJX18pID09IFJDQ19MU0lfT04pKQorCisjZGVmaW5lIElTX1JDQ19QTEwoX19QTExfXykgKCgoX19QTExfXykgPT0gUkNDX1BMTF9OT05FKSB8fCgoX19QTExfXykgPT0gUkNDX1BMTF9PRkYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BMTF9fKSA9PSBSQ0NfUExMX09OKSkKKworI2RlZmluZSBJU19SQ0NfUExMU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfSFNJKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfSFNFKSkKKworI2RlZmluZSBJU19SQ0NfUExMTV9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSBSQ0NfUExMTV9ESVY4KQorCisjZGVmaW5lIElTX1JDQ19QTExOX1ZBTFVFKF9fVkFMVUVfXykgKCg4VSA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IDg2VSkpCisKKyNkZWZpbmUgSVNfUkNDX1BMTFBfVkFMVUUoX19WQUxVRV9fKSAoKFJDQ19QTExQX0RJVjIgPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSBSQ0NfUExMUF9ESVYzMikpCisKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisjZGVmaW5lIElTX1JDQ19QTExRX1ZBTFVFKF9fVkFMVUVfXykgKChSQ0NfUExMUV9ESVYyIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gUkNDX1BMTFFfRElWOCkpCisjZW5kaWYKKworI2RlZmluZSBJU19SQ0NfUExMUl9WQUxVRShfX1ZBTFVFX18pICgoUkNDX1BMTFJfRElWMiA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IFJDQ19QTExSX0RJVjgpKQorCisjZGVmaW5lIElTX1JDQ19DTE9DS1RZUEUoX19DTEtfXykgICgoKChfX0NMS19fKSAmIFJDQ19DTE9DS1RZUEVfQUxMKSAhPSAweDAwVUwpICYmICgoKF9fQ0xLX18pICYgflJDQ19DTE9DS1RZUEVfQUxMKSA9PSAweDAwVUwpKQorCisjZGVmaW5lIElTX1JDQ19TWVNDTEtTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0kpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0xTRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9MU0kpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKSkKKworI2RlZmluZSBJU19SQ0NfSENMSyhfX0hDTEtfXykgKCgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMSkgICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNCkgICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjgpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMTYpICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMTI4KSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjI1NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNTEyKSkKKworI2RlZmluZSBJU19SQ0NfUENMSyhfX1BDTEtfXykgKCgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjEpIHx8ICgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVY0KSB8fCAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMTYpKQorCisjZGVmaW5lIElTX1JDQ19SVENDTEtTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyKSkKKworI2RlZmluZSBJU19SQ0NfTUNPKF9fTUNPWF9fKSAoKF9fTUNPWF9fKSA9PSBSQ0NfTUNPMSkKKworI2RlZmluZSBJU19SQ0NfTUNPMVNPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9IU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX1BMTENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9MU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNFKSkKKworI2RlZmluZSBJU19SQ0NfTUNPRElWKF9fRElWX18pICgoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMSkgfHwgKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzQpIHx8ICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl84KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8xNil8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzY0KXx8ICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8xMjgpKQorCisjZGVmaW5lIElTX1JDQ19MU0VfRFJJVkUoX19EUklWRV9fKSAoKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9MT1cpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1MT1cpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9ISUdIKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUkNDIFBMTCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQTExTdGF0ZTsgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgUExMU291cmNlOyAgLyohPCBSQ0NfUExMU291cmNlOiBQTEwgZW50cnkgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ2xvY2tfU291cmNlICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExNOyAgICAgICAvKiE8IFBMTE06IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMTV9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExOOyAgICAgICAvKiE8IFBMTE46IE11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NiAgICAqLworCisgIHVpbnQzMl90IFBMTFA7ICAgICAgIC8qITwgUExMUDogUExMIERpdmlzaW9uIGZhY3Rvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIGhhdmUgdG8gc2V0IHRoZSBQTExRIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gbm90IGV4Y2VlZCBtYXggZnJlcXVlbmN5IDY0TUhaLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkKKyAgdWludDMyX3QgUExMUTsgICAgICAgLyohPCBQTExROiBQTEwgRGl2aXNpb24gZmFjdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgaGF2ZSB0byBzZXQgdGhlIFBMTFEgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QgZXhjZWVkIG1heCBmcmVxdWVuY3kgNjRNSFouCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFFfQ2xvY2tfRGl2aWRlciAgICAgICAgICAgICAqLworI2VuZGlmCisKKyAgdWludDMyX3QgUExMUjsgICAgICAgLyohPCBQTExSOiBQTEwgRGl2aXNpb24gZm9yIHRoZSBtYWluIHN5c3RlbSBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIGhhdmUgdG8gc2V0IHRoZSBQTExSIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gbm90IGV4Y2VlZCBtYXggZnJlcXVlbmN5IDY0TUhaLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8KKworfSBSQ0NfUExMSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUkNDIEludGVybmFsL0V4dGVybmFsIE9zY2lsbGF0b3IgKEhTRSwgSFNJLCBMU0UgYW5kIExTSSkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT3NjaWxsYXRvclR5cGU7ICAgICAgIC8qITwgVGhlIG9zY2lsbGF0b3JzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX09zY2lsbGF0b3JfVHlwZSAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEhTRVN0YXRlOyAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIEhTRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSFNFX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTFNFU3RhdGU7ICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MU0VfQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBIU0lTdGF0ZTsgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTSV9Db25maWcgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEhTSURpdjsgICAgICAgICAgICAgICAvKiE8IFRoZSBkaXZpc2lvbiBmYWN0b3Igb2YgdGhlIEhTSTE2LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0lfRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBIU0lDYWxpYnJhdGlvblZhbHVlOyAgLyohPCBUaGUgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgKGRlZmF1bHQgaXMgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4N0YgKi8KKworICB1aW50MzJfdCBMU0lTdGF0ZTsgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBMU0kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTSV9Db25maWcgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIFJDQ19QTExJbml0VHlwZURlZiBQTEw7ICAgICAgICAvKiE8IE1haW4gUExMIHN0cnVjdHVyZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IFJDQ19Pc2NJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSQ0MgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNzZXMgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tUeXBlOyAgICAgICAgICAgICAvKiE8IFRoZSBjbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgICAgICAqLworCisgIHVpbnQzMl90IFNZU0NMS1NvdXJjZTsgICAgICAgICAgLyohPCBUaGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSAgICAqLworCisgIHVpbnQzMl90IEFIQkNMS0RpdmlkZXI7ICAgICAgICAgLyohPCBUaGUgQUhCIGNsb2NrIChIQ0xLKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfQUhCX0Nsb2NrX1NvdXJjZSAgICAgICAqLworCisgIHVpbnQzMl90IEFQQjFDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMSBjbG9jayAoUENMSzEpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfQVBCMV9DbG9ja19Tb3VyY2UgKi8KKworCit9IFJDQ19DbGtJbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0NvbnN0YW50cyBSQ0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfVGltZW91dF9WYWx1ZSBUaW1lb3V0IFZhbHVlcworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19EQlBfVElNRU9VVF9WQUxVRSAgICAgICAgICAyVSAgICAgICAgICAgICAgICAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAgKi8KKyNkZWZpbmUgUkNDX0xTRV9USU1FT1VUX1ZBTFVFICAgICAgICAgIExTRV9TVEFSVFVQX1RJTUVPVVQgIC8qIExTRSB0aW1lb3V0IGluIG1zICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfT3NjaWxsYXRvcl9UeXBlIE9zY2lsbGF0b3IgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9OT05FICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgT3NjaWxsYXRvciBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFICAgICAgICAgMHgwMDAwMDAwMVUgICAvKiE8IEhTRSB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSAgICAgICAgIDB4MDAwMDAwMDJVICAgLyohPCBIU0kgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UgICAgICAgICAweDAwMDAwMDA0VSAgIC8qITwgTFNFIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJICAgICAgICAgMHgwMDAwMDAwOFUgICAvKiE8IExTSSB0byBjb25maWd1cmUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9Db25maWcgSFNFIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IU0VfT0ZGICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19IU0VfT04gICAgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNFT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NSX0hTRUJZUCB8IFJDQ19DUl9IU0VPTikpIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBIU0UgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xTRV9Db25maWcgTFNFIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MU0VfT0ZGICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFNFIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNFX09OICAgICAgICAgICAgICAgICAgICAgUkNDX0JEQ1JfTFNFT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTRSBjbG9jayBhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19MU0VfQllQQVNTICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShSQ0NfQkRDUl9MU0VCWVAgfCBSQ0NfQkRDUl9MU0VPTikpIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBMU0UgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTSV9Db25maWcgSFNJIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IU0lfT0ZGICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNJX09OICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTSU9OICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBhY3RpdmF0aW9uICovCisKKyNkZWZpbmUgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQgICAgIDY0VSAgICAgICAgICAgICAgICAgICAgLyohPCBEZWZhdWx0IEhTSSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSFNJX0RpdiBIU0kgRGl2CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0hTSV9ESVYxICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIGlzIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIFJDQ19IU0lfRElWMiAgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBpcyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX0hTSV9ESVY0ICAgICAgICAgICAgICAgICAgIFJDQ19DUl9IU0lESVZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIGlzIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfSFNJX0RJVjggICAgICAgICAgICAgICAgICAgKFJDQ19DUl9IU0lESVZfMXxSQ0NfQ1JfSFNJRElWXzApICAgICAgICAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgaXMgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19IU0lfRElWMTYgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBpcyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19IU0lfRElWMzIgICAgICAgICAgICAgICAgICAoUkNDX0NSX0hTSURJVl8yfFJDQ19DUl9IU0lESVZfMCkgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBpcyBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIFJDQ19IU0lfRElWNjQgICAgICAgICAgICAgICAgICAoUkNDX0NSX0hTSURJVl8yfFJDQ19DUl9IU0lESVZfMSkgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBpcyBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIFJDQ19IU0lfRElWMTI4ICAgICAgICAgICAgICAgICAoUkNDX0NSX0hTSURJVl8yfFJDQ19DUl9IU0lESVZfMXxSQ0NfQ1JfSFNJRElWXzApICAvKiE8IEhTSSBjbG9jayBpcyBkaXZpZGVkIGJ5IDEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNJX0NvbmZpZyBMU0kgQ29uZmlnCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xTSV9PRkYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBMU0kgY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19MU0lfT04gICAgICAgICAgICAgICAgICAgICBSQ0NfQ1NSX0xTSU9OICAgICAgICAgIC8qITwgTFNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9Db25maWcgUExMIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19QTExfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IFBMTCBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLworI2RlZmluZSBSQ0NfUExMX09GRiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBQTEwgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19QTExfT04gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IFBMTCBhY3RpdmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIgUExMTSBDbG9jayBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA4ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYyICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDIgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjMgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMyAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWNCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExNXzEgfCBSQ0NfUExMQ0ZHUl9QTExNXzApICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA0ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY1ICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDUgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjYgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTV8yIHwgUkNDX1BMTENGR1JfUExMTV8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNiAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWNyAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzEpICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA3ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY4ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTE1fMiB8IFJDQ19QTExDRkdSX1BMTE1fMXwgUkNDX1BMTENGR1JfUExMTV8wKSAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgUExMUCBDbG9jayBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMiAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFBfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYzICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDMgICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xIHwgUkNDX1BMTENGR1JfUExMUF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNCAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNSAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFBfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA1ICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVY2ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMiB8IFJDQ19QTExDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDYgICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8yIHwgUkNDX1BMTENGR1JfUExMUF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzIgfCBSQ0NfUExMQ0ZHUl9QTExQXzEgfCBSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSA4ICAqLworI2RlZmluZSBSQ0NfUExMUF9ESVY5ICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDkgICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjEwICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8zIHwgUkNDX1BMTENGR1JfUExMUF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTEgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzMgfCBSQ0NfUExMQ0ZHUl9QTExQXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxMSAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxMiAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMyB8IFJDQ19QTExDRkdSX1BMTFBfMSB8IFJDQ19QTExDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDEyICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjEzICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8zIHwgUkNDX1BMTENGR1JfUExMUF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTMgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTQgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzMgfCBSQ0NfUExMQ0ZHUl9QTExQXzIgfCBSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxNCAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxNSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMyB8IFJDQ19QTExDRkdSX1BMTFBfMiB8IFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE1ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjE2ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8zIHwgUkNDX1BMTENGR1JfUExMUF8yIHwgUkNDX1BMTENGR1JfUExMUF8xIHwgUkNDX1BMTENGR1JfUExMUF8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTYgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTcgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFBfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAxNyAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYxOCAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfNCB8IFJDQ19QTExDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDE4ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjE5ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF80IHwgUkNDX1BMTENGR1JfUExMUF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTkgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQgfCBSQ0NfUExMQ0ZHUl9QTExQXzEgfCBSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyMCAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyMSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfNCB8IFJDQ19QTExDRkdSX1BMTFBfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDIxICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjIyICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF80IHwgUkNDX1BMTENGR1JfUExMUF8yIHwgUkNDX1BMTENGR1JfUExMUF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjIgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjMgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQgfCBSQ0NfUExMQ0ZHUl9QTExQXzIgfCBSQ0NfUExMQ0ZHUl9QTExQXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyMyAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyNCAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfNCB8IFJDQ19QTExDRkdSX1BMTFBfMiB8IFJDQ19QTExDRkdSX1BMTFBfMSB8IFJDQ19QTExDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI0ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjI1ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF80IHwgUkNDX1BMTENGR1JfUExMUF8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjUgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjYgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQgfCBSQ0NfUExMQ0ZHUl9QTExQXzMgfCBSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyNiAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYyNyAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfNCB8IFJDQ19QTExDRkdSX1BMTFBfMyB8IFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDI3ICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjI4ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF80IHwgUkNDX1BMTENGR1JfUExMUF8zIHwgUkNDX1BMTENGR1JfUExMUF8xIHwgUkNDX1BMTENGR1JfUExMUF8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjggKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjkgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQgfCBSQ0NfUExMQ0ZHUl9QTExQXzMgfCBSQ0NfUExMQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAyOSAqLworI2RlZmluZSBSQ0NfUExMUF9ESVYzMCAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfNCB8IFJDQ19QTExDRkdSX1BMTFBfMyB8IFJDQ19QTExDRkdSX1BMTFBfMiB8IFJDQ19QTExDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExQIGRpdmlzaW9uIGZhY3RvciA9IDMwICovCisjZGVmaW5lIFJDQ19QTExQX0RJVjMxICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF80IHwgUkNDX1BMTENGR1JfUExMUF8zIHwgUkNDX1BMTENGR1JfUExMUF8yIHwgUkNDX1BMTENGR1JfUExMUF8xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzEgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMzIgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQgfCBSQ0NfUExMQ0ZHUl9QTExQXzMgfCBSQ0NfUExMQ0ZHUl9QTExQXzIgfCBSQ0NfUExMQ0ZHUl9QTExQXzEgfCBSQ0NfUExMQ0ZHUl9QTExQXzApIC8qITwgUExMUCBkaXZpc2lvbiBmYWN0b3IgPSAzMiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTFFfQ2xvY2tfRGl2aWRlciBQTExRIENsb2NrIERpdmlkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMUV9ESVYyICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDIgKi8KKyNkZWZpbmUgUkNDX1BMTFFfRElWMyAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSAzICovCisjZGVmaW5lIFJDQ19QTExRX0RJVjQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUV8xIHwgUkNDX1BMTENGR1JfUExMUV8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFEgZGl2aXNpb24gZmFjdG9yID0gNCAqLworI2RlZmluZSBSQ0NfUExMUV9ESVY1ICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDUgKi8KKyNkZWZpbmUgUkNDX1BMTFFfRElWNiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzIgfCBSQ0NfUExMQ0ZHUl9QTExRXzApICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA2ICovCisjZGVmaW5lIFJDQ19QTExRX0RJVjcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUV8yIHwgUkNDX1BMTENGR1JfUExMUV8xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFEgZGl2aXNpb24gZmFjdG9yID0gNyAqLworI2RlZmluZSBSQ0NfUExMUV9ESVY4ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMiB8UkNDX1BMTENGR1JfUExMUV8xIHwgUkNDX1BMTENGR1JfUExMUV8wKSAgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDggKi8KKy8qKiAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTFJfQ2xvY2tfRGl2aWRlciBQTExSIENsb2NrIERpdmlkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMUl9ESVYyICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDIgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWMyAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSAzICovCisjZGVmaW5lIFJDQ19QTExSX0RJVjQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8xIHwgUkNDX1BMTENGR1JfUExMUl8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gNCAqLworI2RlZmluZSBSQ0NfUExMUl9ESVY1ICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDUgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWNiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSXzIgfCBSQ0NfUExMQ0ZHUl9QTExSXzApICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSA2ICovCisjZGVmaW5lIFJDQ19QTExSX0RJVjcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8yIHwgUkNDX1BMTENGR1JfUExMUl8xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gNyAqLworI2RlZmluZSBSQ0NfUExMUl9ESVY4ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFJfMiB8IFJDQ19QTExDRkdSX1BMTFJfMSB8IFJDQ19QTExDRkdSX1BMTFJfMCkgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDggKi8KKy8qKiAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ2xvY2tfU291cmNlIFBMTCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMU09VUkNFX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICAqLworI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTSSAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDX0hTSSAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTRSAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDX0hTRSAgLyohPCBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0Nsb2NrX091dHB1dCBQTEwgQ2xvY2sgT3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBDTEsgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFBFTiAgICAgIC8qITwgUExMUENMSyBzZWxlY3Rpb24gZnJvbSBtYWluIFBMTCAqLworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkKKyNkZWZpbmUgUkNDX1BMTFFDTEsgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFFTiAgICAgIC8qITwgUExMUUNMSyBzZWxlY3Rpb24gZnJvbSBtYWluIFBMTCAqLworI2VuZGlmCisjZGVmaW5lIFJDQ19QTExSQ0xLICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExSRU4gICAgICAvKiE8IFBMTFJDTEsgc2VsZWN0aW9uIGZyb20gbWFpbiBQTEwgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgU3lzdGVtIENsb2NrIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSyAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgU1lTQ0xLIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX0hDTEsgICAgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgSENMSyB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9QQ0xLMSAgICAgICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IFBDTEsxIHRvIGNvbmZpZ3VyZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSBTeXN0ZW0gQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9IU0kgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfSFNFICAgICAgICAgICBSQ0NfQ0ZHUl9TV18wICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSyAgICAgICAgUkNDX0NGR1JfU1dfMSAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9MU0kgICAgICAgICAgIChSQ0NfQ0ZHUl9TV18xIHwgUkNDX0NGR1JfU1dfMCkgICAvKiE8IExTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfTFNFICAgICAgICAgICBSQ0NfQ0ZHUl9TV18yICAgICAgICAgICAgICAgICAgICAgLyohPCBMU0Ugc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZV9TdGF0dXMgU3lzdGVtIENsb2NrIFNvdXJjZSBTdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRSAgICBSQ0NfQ0ZHUl9TV1NfMCAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLIFJDQ19DRkdSX1NXU18xICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19MU0kgICAgKFJDQ19DRkdSX1NXU18xIHwgUkNDX0NGR1JfU1dTXzApIC8qITwgTFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0xTRSAgICBSQ0NfQ0ZHUl9TV1NfMiAgICAgICAgICAgICAgICAgICAgLyohPCBMU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9DbG9ja19Tb3VyY2UgQUhCIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjIgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNCAgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY4ICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzMgfCBSQ0NfQ0ZHUl9IUFJFXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjE2ICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMSB8IFJDQ19DRkdSX0hQUkVfMCkgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjY0ICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjEyOCAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMiB8IFJDQ19DRkdSX0hQUkVfMCkgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxMjggKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYyNTYgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzMgfCBSQ0NfQ0ZHUl9IUFJFXzIgfCBSQ0NfQ0ZHUl9IUFJFXzEpICAgICAgICAgICAgICAgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMjU2ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNTEyICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8yIHwgUkNDX0NGR1JfSFBSRV8xIHwgUkNDX0NGR1JfSFBSRV8wKSAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDUxMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19Tb3VyY2UgQVBCIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IQ0xLX0RJVjEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMiAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX1BQUkVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWNCAgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFXzIgfCBSQ0NfQ0ZHUl9QUFJFXzApICAgICAgICAgICAgICAgICAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWOCAgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFXzIgfCBSQ0NfQ0ZHUl9QUFJFXzEpICAgICAgICAgICAgICAgICAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMTYgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFXzIgfCBSQ0NfQ0ZHUl9QUFJFXzEgfCBSQ0NfQ0ZHUl9QUFJFXzApIC8qITwgSENMSyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19SVENfQ2xvY2tfU291cmNlIFJUQyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IE5vIGNsb2NrIGNvbmZpZ3VyZWQgZm9yIFJUQyAqLworI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX0xTRSAgICAgICAgICAgUkNDX0JEQ1JfUlRDU0VMXzAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTFNJICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfMSAgICAgIC8qITwgTFNJIG9zY2lsbGF0b3IgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIgICAgIFJDQ19CRENSX1JUQ1NFTCAgICAgICAgLyohPCBIU0Ugb3NjaWxsYXRvciBjbG9jayBkaXZpZGVkIGJ5IDMyIHVzZWQgYXMgUlRDIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NQ09fSW5kZXggTUNPIEluZGV4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01DTzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFJDQ19NQ08gICAgICAgICAgICAgICAgICAgICAgICBSQ0NfTUNPMSAgICAgICAgICAgICAgIC8qITwgTUNPMSB0byBiZSBjb21wbGlhbnQgd2l0aCBvdGhlciBmYW1pbGllcyB3aXRoIDIgTUNPcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NQ08xX0Nsb2NrX1NvdXJjZSBNQ08xIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTzEgb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08xICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfMCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfMHwgUkNDX0NGR1JfTUNPU0VMXzEpIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9IU0UgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMXzIgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX1BMTENMSyAgICAgICAgICAoUkNDX0NGR1JfTUNPU0VMXzB8UkNDX0NGR1JfTUNPU0VMXzIpICAvKiE8IFBMTENMSyBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTFNJICAgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfMXxSQ0NfQ0ZHUl9NQ09TRUxfMikgIC8qITwgTFNJIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9MU0UgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8wfFJDQ19DRkdSX01DT1NFTF8xfFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DT3hfQ2xvY2tfUHJlc2NhbGVyIE1DTzEgQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01DT0RJVl8xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIFJDQ19NQ09ESVZfMiAgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09QUkVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX01DT0RJVl80ICAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1BSRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfTUNPRElWXzggICAgICAgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1BSRV8xIHwgUkNDX0NGR1JfTUNPUFJFXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBNQ08gZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19NQ09ESVZfMTYgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09QUkVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19NQ09ESVZfMzIgICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzIgfCBSQ0NfQ0ZHUl9NQ09QUkVfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIFJDQ19NQ09ESVZfNjQgICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzIgfCBSQ0NfQ0ZHUl9NQ09QUkVfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIFJDQ19NQ09ESVZfMTI4ICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzIgfCBSQ0NfQ0ZHUl9NQ09QUkVfMSB8IFJDQ19DRkdSX01DT1BSRV8wKSAvKiE8IE1DTyBkaXZpZGVkIGJ5IDEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSW50ZXJydXB0IEludGVycnVwdHMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSVRfTFNJUkRZICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfTFNJUkRZRiAgICAgICAgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0VSRFkgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9MU0VSRFlGICAgICAgICAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0hTSVJEWSAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX0hTSVJEWUYgICAgICAgICAgICAvKiE8IEhTSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNFUkRZICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfSFNFUkRZRiAgICAgICAgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9QTExSRFkgICAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9QTExSRFlGICAgICAgICAgICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0NTUyAgICAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX0NTU0YgICAgICAgICAgICAgICAvKiE8IEhTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX0xTRUNTUyAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX0xTRUNTU0YgICAgICAgICAgICAvKiE8IExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0ZsYWcgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IFhYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWFhYICA6IFJlZ2lzdGVyIGluZGV4CisgICogICAgICAgICAgICAgICAgIC0gMDAxOiBDUiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDAxMDogQkRDUiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDAxMTogQ1NSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKy8qIEZsYWdzIGluIHRoZSBDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19IU0lSRFkgICAgICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX0hTSVJEWV9Qb3MpIC8qITwgSFNJIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSFNFUkRZICAgICAgICAgICAgICAgICgoQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DUl9IU0VSRFlfUG9zKSAvKiE8IEhTRSBSZWFkeSBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX1BMTFJEWSAgICAgICAgICAgICAgICAoKENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1JfUExMUkRZX1BvcykgLyohPCBQTEwgUmVhZHkgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQkRDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19MU0VSRFkgICAgICAgICAgICAgICAgKChCRENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQkRDUl9MU0VSRFlfUG9zKSAgLyohPCBMU0UgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19MU0VDU1NEICAgICAgICAgICAgICAgKChCRENSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQkRDUl9MU0VDU1NEX1BvcykgLyohPCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBmbGFnICovCisKKy8qIEZsYWdzIGluIHRoZSBDU1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNJUkRZICAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0xTSVJEWV9Qb3MpICAgIC8qITwgTFNJIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfT0JMUlNUICAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX09CTFJTVEZfUG9zKSAgIC8qITwgT3B0aW9uIEJ5dGUgTG9hZGVyIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUElOUlNUICAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX1BJTlJTVEZfUG9zKSAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfUFdSUlNUICAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX1BXUlJTVEZfUG9zKSAgIC8qITwgQk9SIG9yIFBPUi9QRFIgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19TRlRSU1QgICAgICAgICAgICAgICAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfU0ZUUlNURl9Qb3MpICAgLyohPCBTb2Z0d2FyZSBSZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0lXREdSU1QgICAgICAgICAgICAgICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9JV0RHUlNURl9Qb3MpICAvKiE8IEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfV1dER1JTVCAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX1dXREdSU1RGX1BvcykgIC8qITwgV2luZG93IHdhdGNoZG9nIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFBXUlJTVCAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0xQV1JSU1RGX1BvcykgIC8qITwgTG93LVBvd2VyIHJlc2V0IGZsYWcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTFNFRHJpdmVfQ29uZmlnIExTRSBEcml2ZSBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IExTRSBsb3cgZHJpdmUgY2FwYWJpbGl0eSAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfTUVESVVNTE9XICAgICAgICAgICBSQ0NfQkRDUl9MU0VEUlZfMCAgICAgIC8qITwgTFNFIG1lZGl1bSBsb3cgZHJpdmUgY2FwYWJpbGl0eSAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgICBSQ0NfQkRDUl9MU0VEUlZfMSAgICAgIC8qITwgTFNFIG1lZGl1bSBoaWdoIGRyaXZlIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX0hJR0ggICAgICAgICAgICAgICAgUkNDX0JEQ1JfTFNFRFJWICAgICAgICAvKiE8IExTRSBoaWdoIGRyaXZlIGNhcGFiaWxpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX01hY3JvcyBSQ0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQUhCIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9ETUExRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0RNQTFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfRU5BQkxFKCkgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTEFTSEVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTEFTSEVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUkNFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjaWYgZGVmaW5lZChSTkcpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9STkdFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfUk5HRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZiAvKiBSTkcgKi8KKworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQUVTRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0FFU0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogQUVTICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0RNQTFFTikKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19ESVNBQkxFKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0ZMQVNIRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9DUkNFTikKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfRElTQUJMRSgpICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX1JOR0VOKQorI2VuZGlmIC8qIFJORyAqLworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0NMS19ESVNBQkxFKCkgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfQUVTRU4pCisjZW5kaWYgLyogQUVTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19JT1BPUlRfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgSU9QT1JUIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgSU8gUG9ydHMgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIElPIHBvcnRzIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKSAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9BRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9BRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0VOQUJMRSgpICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRU5BQkxFKCkgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0NMS19FTkFCTEUoKSAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9ERU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9ERU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19FTkFCTEUoKSAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9GRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9GRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0FFTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19ESVNBQkxFKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9CRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRElTQUJMRSgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQ0VOKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0RFTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19ESVNBQkxFKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9GRU4pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQVBCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU0yRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19DTEtfRU5BQkxFKCkgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU0zRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNM0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNNkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTZFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19FTkFCTEUoKSAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTdFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU03RU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKSAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9SVENBUEJFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9SVENBUEJFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUoKSAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1dXREdFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9XV0RHRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9TUEkyRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfU1BJMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRU5BQkxFKCkgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVVNBUlQyRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVVNBUlQyRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19FTkFCTEUoKSAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDNFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDNFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfQ0xLX0VOQUJMRSgpICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDRFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDRFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjaWYgZGVmaW5lZChMUFVBUlQxKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9DTEtfRU5BQkxFKCkgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9MUFVBUlQxRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfTFBVQVJUMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9JMkMxRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfSTJDMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfSTJDMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0kyQzJFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjaWYgZGVmaW5lZChDRUMpCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0NFQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0NFQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVUNQRDFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VQ1BEMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoVUNQRDIpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVUNQRDJFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VQ1BEMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2RlZmluZSBfX0hBTF9SQ0NfREJHTUNVX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9EQkdFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9EQkdFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1BXUkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1BXUkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNpZiBkZWZpbmVkKERBQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19FTkFCTEUoKSAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0RBQzFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9EQUMxRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX0VOQUJMRSgpICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVElNMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVElNMkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYKKworI2lmIGRlZmluZWQoTFBUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19FTkFCTEUoKSAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9MUFRJTTFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9MUFRJTTFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQVBCMiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1BJMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1NQSTFFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0VOQUJMRSgpICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1VTQVJUMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1VTQVJUMUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE0X0NMS19FTkFCTEUoKSAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE0RU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTRFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisjaWYgZGVmaW5lZChUSU0xNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0NMS19FTkFCTEUoKSAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTVFTik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xNUVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWcpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogVElNMTUgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0VOQUJMRSgpICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xNkVOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE2RU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0VOQUJMRSgpICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xN0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE3RU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQURDX0NMS19FTkFCTEUoKSAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19JTyB1aW50MzJfdCB0bXByZWc7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfQURDRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfQURDRU4pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2lmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNMkVOKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTNFTikKKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTZFTikKKyNlbmRpZiAvKiBUSU02ICovCisjaWYgZGVmaW5lZChUSU03KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19DTEtfRElTQUJMRSgpICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU03RU4pCisjZW5kaWYgLyogVElNNyAqLworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0NMS19ESVNBQkxFKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9SVENBUEJFTikKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfU1BJMkVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19ESVNBQkxFKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDJFTikKKyNpZiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19DTEtfRElTQUJMRSgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVVNBUlQzRU4pCisjZW5kaWYgLyogVVNBUlQzICovCisjaWYgZGVmaW5lZChVU0FSVDQpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfQ0xLX0RJU0FCTEUoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1VTQVJUNEVOKQorI2VuZGlmIC8qIFVTQVJUNCAqLworI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfTFBVQVJUMUVOKQorI2VuZGlmIC8qIExQVUFSVDEgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfSTJDMUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfRElTQUJMRSgpICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9JMkMyRU4pCisjaWYgZGVmaW5lZChDRUMpCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0NFQ0VOKQorI2VuZGlmIC8qIENFQyAqLworI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfRElTQUJMRSgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1VDUEQxRU4pCisjZW5kaWYgLyogVUNQRDEgKi8KKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VQ1BEMkVOKQorI2VuZGlmIC8qIFVDUEQyICovCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX0RJU0FCTEUoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0RCR0VOKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCkgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9QV1JFTikKKyNpZiBkZWZpbmVkKERBQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0RBQzFFTikKKyNlbmRpZiAvKiBEQUMxICovCisjaWYgZGVmaW5lZChMUFRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVElNMUVOKQorI2VuZGlmIC8qIExQVElNMSAqLworI2lmIGRlZmluZWQoTFBUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19ESVNBQkxFKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9MUFRJTTJFTikKKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfRElTQUJMRSgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19ESVNBQkxFKCkgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTFFTikKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1BJMUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19ESVNBQkxFKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9VU0FSVDFFTikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE0X0NMS19ESVNBQkxFKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTRFTikKKyNpZiBkZWZpbmVkKFRJTTE1KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xNUVOKQorI2VuZGlmIC8qIFRJTTE1ICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRSgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE2RU4pCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19DTEtfRElTQUJMRSgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE3RU4pCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX0FEQ0VOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVkX0Rpc2FibGVkX1N0YXR1cyBBSEIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQUhCIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTEFTSEVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKSAgICE9IFJFU0VUKQorI2lmIGRlZmluZWQoUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfUk5HRU4pICAgIT0gUkVTRVQpCisjZW5kaWYgLyogUk5HICovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9BRVNFTikgICAhPSBSRVNFVCkKKyNlbmRpZiAvKiBBRVMgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfRE1BMUVOKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9GTEFTSEVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCRU5SLCBSQ0NfQUhCRU5SX0NSQ0VOKSAgID09IFJFU0VUKQorI2lmIGRlZmluZWQoUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFJDQ19BSEJFTlJfUk5HRU4pICAgPT0gUkVTRVQpCisjZW5kaWYgLyogUk5HICovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUkNDX0FIQkVOUl9BRVNFTikgICA9PSBSRVNFVCkKKyNlbmRpZiAvKiBBRVMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0lPUE9SVF9DbG9ja19FbmFibGVkX0Rpc2FibGVkX1N0YXR1cyBJT1BPUlQgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIElPIFBvcnQgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9BRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0JFTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQ0VOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9ERU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0ZFTikgIT0gUkVTRVQpCisKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0FFTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9JU19DTEtfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPQkVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+SU9QRU5SLCBSQ0NfSU9QRU5SX0dQSU9DRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5JT1BFTlIsIFJDQ19JT1BFTlJfR1BJT0RFTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPklPUEVOUiwgUkNDX0lPUEVOUl9HUElPRkVOKSA9PSBSRVNFVCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19FbmFibGVkX0Rpc2FibGVkX1N0YXR1cyBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU0yRU4pICAgIT0gMFUpCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNM0VOKSAgICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU02RU4pICAgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTdFTikgICAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfUlRDQVBCRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9XV0RHRU4pICAgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1NQSTJFTikgICAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVVNBUlQyRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQzX0lTX0NMS19FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDNFTikgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfSVNfQ0xLX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1VTQVJUNEVOKSAhPSAwVSkKKyNpZiBkZWZpbmVkKExQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVUFSVDFFTikhPSAwVSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9JMkMxRU4pICAgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0kyQzJFTikgICAhPSAwVSkKKyNpZiBkZWZpbmVkKENFQykKKyNkZWZpbmUgX19IQUxfUkNDX0NFQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfQ0VDRU4pICAgICE9IDBVKQorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMSkKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVUNQRDFFTikgICE9IDBVKQorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMikKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVUNQRDJFTikgICE9IDBVKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfSVNfQ0xLX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0RCR0VOKSAgICAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfUFdSRU4pICAgICE9IDBVKQorI2lmIGRlZmluZWQoREFDMSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfREFDMUVOKSAgICE9IDBVKQorI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVElNMkVOKSAhPSAwVSkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9MUFRJTTFFTikgIT0gMFUpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTJFTikgICA9PSAwVSkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9USU0zRU4pICAgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1RJTTZFTikgICA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVElNN0VOKSAgID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9SVENBUEJFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1dXREdFTikgICA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfU1BJMkVOKSAgID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VU0FSVDJFTikgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfSVNfQ0xLX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX1VTQVJUM0VOKSA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNF9JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfVVNBUlQ0RU4pID09IDBVKQorI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfTFBVQVJUMUVOKT09IDBVKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0kyQzFFTikgICA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfSTJDMkVOKSAgID09IDBVKQorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9DRUNFTikgICAgPT0gMFUpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQxKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VQ1BEMUVOKSAgPT0gMFUpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9VQ1BEMkVOKSAgPT0gMFUpCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfREJHRU4pICAgID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9QV1JFTikgICAgPT0gMFUpCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIxLCBSQ0NfQVBCRU5SMV9EQUMxRU4pICAgPT0gMFUpCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUkNDX0FQQkVOUjFfTFBUSU0yRU4pID09IDBVKQorI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFJDQ19BUEJFTlIxX0xQVElNMUVOKSA9PSAwVSkKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZWRfRGlzYWJsZWRfU3RhdHVzIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xRU4pICAgIT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1NQSTFFTikgICAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVVNBUlQxRU4pICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xNEVOKSAgIT0gMFUpCisjaWYgZGVmaW5lZChUSU0xNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTVFTikgICE9IDBVKQorI2VuZGlmIC8qIFRJTTE1ICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE2RU4pICAhPSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTdFTikgICE9IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9BRENFTikgICAgIT0gMFUpCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xRU4pICAgPT0gMFUpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1NQSTFFTikgICA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVVNBUlQxRU4pID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9USU0xNEVOKSAgPT0gMFUpCisjaWYgZGVmaW5lZChUSU0xNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0lTX0NMS19ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTVFTikgID09IDBVKQorI2VuZGlmIC8qIFRJTTE1ICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFJDQ19BUEJFTlIyX1RJTTE2RU4pICA9PSAwVSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCRU5SMiwgUkNDX0FQQkVOUjJfVElNMTdFTikgID09IDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBSQ0NfQVBCRU5SMl9BRENFTikgICAgPT0gMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFIQiBQZXJpcGhlcmFsIEZvcmNlIFJlbGVhc2UgUmVzZXQKKyAgKiBAYnJpZWYgIEZvcmNlIG9yIHJlbGVhc2UgQUhCMSBwZXJpcGhlcmFsIHJlc2V0LgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19BSEJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIFdSSVRFX1JFRyhSQ0MtPkFIQlJTVFIsIDB4RkZGRkZGRkZVKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9GT1JDRV9SRVNFVCgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgUkNDX0FIQlJTVFJfRE1BMVJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPkFIQlJTVFIsIFJDQ19BSEJSU1RSX0ZMQVNIUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgUkNDX0FIQlJTVFJfQ1JDUlNUKQorI2lmIGRlZmluZWQoUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgUkNDX0FIQlJTVFJfUk5HUlNUKQorI2VuZGlmIC8qIFJORyAqLworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgUkNDX0FIQlJTVFJfQUVTUlNUKQorI2VuZGlmIC8qIEFFUyAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19BSEJfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIFdSSVRFX1JFRyhSQ0MtPkFIQlJTVFIsIDB4MDAwMDAwMDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCBSQ0NfQUhCUlNUUl9ETUExUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfUkVMRUFTRV9SRVNFVCgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCBSQ0NfQUhCUlNUUl9GTEFTSFJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QUhCUlNUUiwgUkNDX0FIQlJTVFJfQ1JDUlNUKQorI2lmIGRlZmluZWQoUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCBSQ0NfQUhCUlNUUl9STkdSU1QpCisjZW5kaWYgLyogUk5HICovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVNfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFIQlJTVFIsIFJDQ19BSEJSU1RSX0FFU1JTVCkKKyNlbmRpZiAvKiBBRVMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0lPUE9SVF9Gb3JjZV9SZWxlYXNlX1Jlc2V0IElPUE9SVCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIElPIFBvcnQgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0lPUF9GT1JDRV9SRVNFVCgpICAgICAgICAgICAgV1JJVEVfUkVHKFJDQy0+SU9QUlNUUiwgMHhGRkZGRkZGRlUpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9GT1JDRV9SRVNFVCgpICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BSU1RSLCBSQ0NfSU9QUlNUUl9HUElPQVJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPklPUFJTVFIsIFJDQ19JT1BSU1RSX0dQSU9CUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfRk9SQ0VfUkVTRVQoKSAgICAgICAgICBTRVRfQklUKFJDQy0+SU9QUlNUUiwgUkNDX0lPUFJTVFJfR1BJT0NSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9GT1JDRV9SRVNFVCgpICAgICAgICAgIFNFVF9CSVQoUkNDLT5JT1BSU1RSLCBSQ0NfSU9QUlNUUl9HUElPRFJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPklPUFJTVFIsIFJDQ19JT1BSU1RSX0dQSU9GUlNUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19JT1BfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIFdSSVRFX1JFRyhSQ0MtPklPUFJTVFIsIDB4MDAwMDAwMDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVCgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5JT1BSU1RSLCBSQ0NfSU9QUlNUUl9HUElPQVJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QUlNUUiwgUkNDX0lPUFJTVFJfR1BJT0JSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19SRUxFQVNFX1JFU0VUKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPklPUFJTVFIsIFJDQ19JT1BSU1RSX0dQSU9DUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVCgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5JT1BSU1RSLCBSQ0NfSU9QUlNUUl9HUElPRFJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+SU9QUlNUUiwgUkNDX0lPUFJTVFJfR1BJT0ZSU1QpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIxIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIxIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FQQjFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgV1JJVEVfUkVHKFJDQy0+QVBCUlNUUjEsIDB4RkZGRkZGRkZVKQorCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9GT1JDRV9SRVNFVCgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9USU0yUlNUKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1RJTTNSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19USU02X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1RJTTZSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1RJTTdSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1NQSTJSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDJfRk9SQ0VfUkVTRVQoKSAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1VTQVJUMlJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19GT1JDRV9SRVNFVCgpICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfVVNBUlQzUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X0ZPUkNFX1JFU0VUKCkgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9VU0FSVDRSU1QpCisjaWYgZGVmaW5lZChMUFVBUlQxKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9GT1JDRV9SRVNFVCgpICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9MUFVBUlQxUlNUKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0kyQzFSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0kyQzJSU1QpCisjaWYgZGVmaW5lZChDRUMpCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0NFQ1JTVCkKKyNlbmRpZgorI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9GT1JDRV9SRVNFVCgpICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1VDUEQxUlNUKQorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMikKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQyX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfVUNQRDJSU1QpCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX0RCR01DVV9GT1JDRV9SRVNFVCgpICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfREJHUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9QV1JSU1QpCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9GT1JDRV9SRVNFVCgpICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9EQUMxUlNUKQorI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTJfRk9SQ0VfUkVTRVQoKSAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0xQVElNMlJTVCkKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCkgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9MUFRJTTFSU1QpCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjFfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgV1JJVEVfUkVHKFJDQy0+QVBCUlNUUjEsIDB4MDAwMDAwMDBVKQorI2lmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9USU0yUlNUKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19USU0zX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfVElNM1JTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9USU02UlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1RJTTdSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfU1BJMlJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9VU0FSVDJSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfUkVMRUFTRV9SRVNFVCgpICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfVVNBUlQzUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQ0X1JFTEVBU0VfUkVTRVQoKSAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1VTQVJUNFJTVCkKKyNpZiBkZWZpbmVkKExQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX1JFTEVBU0VfUkVTRVQoKSAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfTFBVQVJUMVJTVCkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0kyQzFSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIxLCBSQ0NfQVBCUlNUUjFfSTJDMlJTVCkKKyNpZiBkZWZpbmVkKENFQykKKyNkZWZpbmUgX19IQUxfUkNDX0NFQ19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9DRUNSU1QpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQxKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfUkVMRUFTRV9SRVNFVCgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX1VDUEQxUlNUKQorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMikKKyNkZWZpbmUgX19IQUxfUkNDX1VDUEQyX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9VQ1BEMlJTVCkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfREJHTUNVX1JFTEVBU0VfUkVTRVQoKSAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0RCR1JTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9QV1JSU1QpCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMSwgUkNDX0FQQlJTVFIxX0RBQzFSU1QpCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9MUFRJTTJSU1QpCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFJDQ19BUEJSU1RSMV9MUFRJTTFSU1QpCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIyIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgV1JJVEVfUkVHKFJDQy0+QVBCUlNUUjIsIDB4RkZGRkZGRkZVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0ZPUkNFX1JFU0VUKCkgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9TWVNDRkdSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1RJTTFSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1NQSTFSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfRk9SQ0VfUkVTRVQoKSAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1VTQVJUMVJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE0X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIyLCBSQ0NfQVBCUlNUUjJfVElNMTRSU1QpCisjaWYgZGVmaW5lZChUSU0xNSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE1X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIyLCBSQ0NfQVBCUlNUUjJfVElNMTVSU1QpCisjZW5kaWYgLyogVElNMTUgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgU0VUX0JJVChSQ0MtPkFQQlJTVFIyLCBSQ0NfQVBCUlNUUjJfVElNMTZSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19GT1JDRV9SRVNFVCgpICAgICAgICAgIFNFVF9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1RJTTE3UlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBTRVRfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9BRENSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgV1JJVEVfUkVHKFJDQy0+QVBCUlNUUjIsIDB4MDBVKQorI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX1JFTEVBU0VfUkVTRVQoKSAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1NZU0NGR1JTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9USU0xUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1NQSTFSU1QpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfUkVMRUFTRV9SRVNFVCgpICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIyLCBSQ0NfQVBCUlNUUjJfVVNBUlQxUlNUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfUkVMRUFTRV9SRVNFVCgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJSU1RSMiwgUkNDX0FQQlJTVFIyX1RJTTE0UlNUKQorI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9SRUxFQVNFX1JFU0VUKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIyLCBSQ0NfQVBCUlNUUjJfVElNMTVSU1QpCisjZW5kaWYgLyogVElNMTUgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X1JFTEVBU0VfUkVTRVQoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9USU0xNlJTVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X1JFTEVBU0VfUkVTRVQoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9USU0xN1JTVCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjIsIFJDQ19BUEJSU1RSMl9BRENSU1QpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBSEIgUGVyaXBoZXJhbHMgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9ETUExU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfRkxBU0hTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfU1JBTV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9TUkFNU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgU0VUX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfQ1JDU01FTikKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgU0VUX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfUk5HU01FTikKKyNlbmRpZiAvKiBSTkcgKi8KKyNpZiBkZWZpbmVkKEFFUykKKyNkZWZpbmUgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgU0VUX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfQUVTU01FTikKKyNlbmRpZiAvKiBBRVMgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9ETUExU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9GTEFTSFNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfU1JBTVNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIENMRUFSX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfQ1JDU01FTikKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgQ0xFQVJfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9STkdTTUVOKQorI2VuZGlmIC8qIFJORyAqLworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0FFU1NNRU4pCisjZW5kaWYgLyogQUVTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0lPUE9SVF9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBJT1BPUlQgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBJT1BPUlQgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBJT1BPUlQgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9BU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0JTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPQ1NNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9EU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0ZTTUVOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0FTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9CU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgQ0xFQVJfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPQ1NNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9GU01FTikKKy8qKgorICAqICAgQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVElNMlNNRU4pCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU0zU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU02U01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTdfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU03U01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9SVENBUEJTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1dXREdTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1NQSTJTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1VTQVJUMlNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVVNBUlQzU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNF9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDRTTUVOKQorI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFVBUlQxU01FTikKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzFTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzJTTUVOKQorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0NFQ1NNRU4pCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQxKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1VDUEQxU01FTikKKyNlbmRpZgorI2lmIGRlZmluZWQoVUNQRDIpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVUNQRDJTTUVOKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfREJHU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9QV1JTTUVOKQorI2lmIGRlZmluZWQoREFDMSkKKyNkZWZpbmUgX19IQUxfUkNDX0RBQzFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9EQUMxU01FTikKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0xQVElNMlNNRU4pCisjZW5kaWYKKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFRJTTFTTUVOKQorI2VuZGlmCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVElNMlNNRU4pCisjZW5kaWYKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1RJTTNTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNNl9DTEtfU0xFRVBfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVElNNlNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19USU03X0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU03U01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1JUQ0FQQlNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9XV0RHU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1NQSTJTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVVNBUlQyU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1VTQVJUM1NNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDRfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDRTTUVOKQorI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0xQVUFSVDFTTUVOKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9JMkMxU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzJTTUVOKQorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfQ0VDU01FTikKKyNlbmRpZgorI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VQ1BEMVNNRU4pCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVUNQRDJTTUVOKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9EQkdTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfUFdSU01FTikKKyNpZiBkZWZpbmVkKERBQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19EQUMxX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9EQUMxU01FTikKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfTFBUSU0yU01FTikKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfTFBUSU0xU01FTikKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUoKSAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9TWVNDRkdTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xU01FTikKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfU1BJMVNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1VTQVJUMVNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNF9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTE0U01FTikKKyNpZiBkZWZpbmVkKFRJTTE1KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xNVNNRU4pCisjZW5kaWYgLyogVElNMTUgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVElNMTZTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBTRVRfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xN1NNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX0FEQ1NNRU4pCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19DTEtfU0xFRVBfRElTQUJMRSgpICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9TWVNDRkdTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTFTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1NQSTFTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFKCkgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1VTQVJUMVNNRU4pCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNF9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVElNMTRTTUVOKQorI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVElNMTVTTUVOKQorI2VuZGlmIC8qIFRJTTE1ICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfU0xFRVBfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVElNMTZTTUVOKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTE3U01FTikKKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgQ0xFQVJfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9BRENTTUVOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJfQ2xvY2tfU2xlZXBfRW5hYmxlZF9EaXNhYmxlZF9TdGF0dXMgQUhCIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0RNQTFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0ZMQVNIU01FTikhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU1fSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX1NSQU1TTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0NSQ1NNRU4pICAhPSBSRVNFVCkKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX1JOR1NNRU4pICAhPSBSRVNFVCkKKyNlbmRpZiAvKiBSTkcgKi8KKyNpZiBkZWZpbmVkKEFFUykKKyNkZWZpbmUgX19IQUxfUkNDX0FFU19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0FFU1NNRU4pICAhPSBSRVNFVCkKKyNlbmRpZiAvKiBBRVMgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0RNQTFTTUVOKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9GTEFTSFNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfU1JBTVNNRU4pICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BSEJTTUVOUiwgUkNDX0FIQlNNRU5SX0NSQ1NNRU4pICAgPT0gUkVTRVQpCisjaWYgZGVmaW5lZChSTkcpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QUhCU01FTlIsIFJDQ19BSEJTTUVOUl9STkdTTUVOKSAgID09IFJFU0VUKQorI2VuZGlmIC8qIFJORyAqLworI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBSQ0NfQUhCU01FTlJfQUVTU01FTikgICA9PSBSRVNFVCkKKyNlbmRpZiAvKiBBRVMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfSU9QT1JUX0Nsb2NrX1NsZWVwX0VuYWJsZWRfRGlzYWJsZWRfU3RhdHVzIElPUE9SVCBDbG9jayBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgSU9QT1JUIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0FTTUVOKSE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0JTTUVOKSE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0NTTUVOKSE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKSE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0ZTTUVOKSE9IFJFU0VUKQorCisKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0FTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9CU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+SU9QU01FTlIsIFJDQ19JT1BTTUVOUl9HUElPQ1NNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgIChSRUFEX0JJVChSQ0MtPklPUFNNRU5SLCBSQ0NfSU9QU01FTlJfR1BJT0RTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9GX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUkNDX0lPUFNNRU5SX0dQSU9GU01FTikgPT0gUkVTRVQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlZF9EaXNhYmxlZF9TdGF0dXMgQVBCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVElNMlNNRU4pICAgIT0gUkVTRVQpCisjZW5kaWYgLyogVElNMiAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1RJTTNTTUVOKSAgICE9IFJFU0VUKQorI2lmIGRlZmluZWQoVElNNikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU02U01FTikgICAhPSBSRVNFVCkKKyNlbmRpZiAvKiBUSU02ICovCisjaWYgZGVmaW5lZChUSU03KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1RJTTdTTUVOKSAgICE9IFJFU0VUKQorI2VuZGlmIC8qIFRJTTcgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9SVENBUEJTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9XV0RHU01FTikgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9TUEkyU01FTikgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDJTTUVOKSAhPSBSRVNFVCkKKyNpZiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDNTTUVOKSAhPSBSRVNFVCkKKyNlbmRpZiAvKiBVU0FSVDMgKi8KKyNpZiBkZWZpbmVkKFVTQVJUNCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDRTTUVOKSAhPSBSRVNFVCkKKyNlbmRpZiAvKiBVU0FSVDQgKi8KKyNpZiBkZWZpbmVkKExQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfTFBVQVJUMVNNRU4pIT0gUkVTRVQpCisjZW5kaWYgLyogTFBVQVJUMSAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzFTTUVOKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzJTTUVOKSAgICE9IFJFU0VUKQorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0NFQ1NNRU4pICAgICE9IFJFU0VUKQorI2VuZGlmIC8qIENFQyAqLworI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVUNQRDFTTUVOKSAgIT0gUkVTRVQpCisjZW5kaWYgLyogVUNQRDEgKi8KKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1VDUEQyU01FTikgICE9IFJFU0VUKQorI2VuZGlmIC8qIFVDUEQyICovCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfREJHU01FTikgICAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfUFdSU01FTikgICAgIT0gUkVTRVQpCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0RBQzFTTUVOKSAgICE9IFJFU0VUKQorI2VuZGlmIC8qIERBQzEgKi8KKyNpZiBkZWZpbmVkKExQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFRJTTJTTUVOKSAhPSBSRVNFVCkKKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFRJTTFTTUVOKSAhPSBSRVNFVCkKKyNlbmRpZiAvKiBMUFRJTTEgKi8KKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVElNMlNNRU4pICAgPT0gUkVTRVQpCisjZW5kaWYgLyogVElNMiAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1RJTTNTTUVOKSAgID09IFJFU0VUKQorI2lmIGRlZmluZWQoVElNNikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9USU02U01FTikgICA9PSBSRVNFVCkKKyNlbmRpZiAvKiBUSU02ICovCisjaWYgZGVmaW5lZChUSU03KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNN19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1RJTTdTTUVOKSAgID09IFJFU0VUKQorI2VuZGlmIC8qIFRJTTYgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9SVENBUEJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9XV0RHU01FTikgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9TUEkyU01FTikgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDJTTUVOKSA9PSBSRVNFVCkKKyNpZiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDNTTUVOKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBVU0FSVDMgKi8KKyNpZiBkZWZpbmVkKFVTQVJUNCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9VU0FSVDRTTUVOKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBVU0FSVDQgKi8KKyNpZiBkZWZpbmVkKExQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfTFBVQVJUMVNNRU4pPT0gUkVTRVQpCisjZW5kaWYgLyogTFBVQVJUMSAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzFTTUVOKSAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0kyQzJTTUVOKSAgID09IFJFU0VUKQorI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0NFQ1NNRU4pICAgID09IFJFU0VUKQorI2VuZGlmIC8qIENFQyAqLworI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIF9fSEFMX1JDQ19VQ1BEMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfVUNQRDFTTUVOKSAgPT0gUkVTRVQpCisjZW5kaWYgLyogVUNQRDEgKi8KKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBfX0hBTF9SQ0NfVUNQRDJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX1VDUEQyU01FTikgID09IFJFU0VUKQorI2VuZGlmIC8qIFVDUEQyICovCisjZGVmaW5lIF9fSEFMX1JDQ19EQkdNQ1VfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfREJHU01FTikgICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19QV1JfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFJDQ19BUEJTTUVOUjFfUFdSU01FTikgICAgPT0gUkVTRVQpCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBfX0hBTF9SQ0NfREFDMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIxLCBSQ0NfQVBCU01FTlIxX0RBQzFTTUVOKSAgID09IFJFU0VUKQorI2VuZGlmIC8qIERBQzEgKi8KKyNpZiBkZWZpbmVkKExQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFRJTTJTTUVOKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMSwgUkNDX0FQQlNNRU5SMV9MUFRJTTFTTUVOKSA9PSBSRVNFVCkKKyNlbmRpZiAvKiBMUFRJTTEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19TbGVlcF9FbmFibGVkX0Rpc2FibGVkX1N0YXR1cyBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1NZU0NGR1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xU01FTikgICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfU1BJMVNNRU4pICAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1VTQVJUMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xNFNNRU4pICAhPSBSRVNFVCkKKyNpZiBkZWZpbmVkKFRJTTE1KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xNVNNRU4pICAhPSBSRVNFVCkKKyNlbmRpZgorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xNlNNRU4pICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVElNMTdTTUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX0FEQ1NNRU4pICAgICE9IFJFU0VUKQorCisKKyNkZWZpbmUgX19IQUxfUkNDX1NZU0NGR19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfU1lTQ0ZHU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTFTTUVOKSAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9TUEkxU01FTikgICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfVVNBUlQxU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTE0U01FTikgID09IFJFU0VUKQorI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTE1U01FTikgID09IFJFU0VUKQorI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjIgLCBSQ0NfQVBCU01FTlIyX1RJTTE2U01FTikgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QVBCU01FTlIyICwgUkNDX0FQQlNNRU5SMl9USU0xN1NNRU4pICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiAsIFJDQ19BUEJTTUVOUjJfQURDU01FTikgICAgPT0gUkVTRVQpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQmFja3VwX0RvbWFpbl9SZXNldCBSQ0MgQmFja3VwIERvbWFpbiBSZXNldAorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBmb3JjZSBvciByZWxlYXNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0LgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIFJUQyBwZXJpcGhlcmFsIChpbmNsdWRpbmcgdGhlIGJhY2t1cCByZWdpc3RlcnMpCisgICogICAgICAgICBhbmQgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGluIFJDQ19DU1IgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGUgQktQU1JBTSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyByZXNldC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpCisKKyNkZWZpbmUgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKSBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUlRDX0Nsb2NrX0NvbmZpZ3VyYXRpb24gUkNDIFJUQyBDbG9jayBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBSVEMgY2xvY2suCisgICogQG5vdGUgICBBcyB0aGUgUlRDIGlzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHRvCisgICogICAgICAgICB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlIGFjY2VzcyB1c2luZworICAqICAgICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZSB0aGUgUlRDCisgICogICAgICAgICAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4KKyAgKiBAbm90ZSAgIFRoZXNlIG1hY3JvcyBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIFJUQyBjbG9jayBzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpICAgICAgICAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKQorCisjZGVmaW5lIF9fSEFMX1JDQ19SVENfRElTQUJMRSgpICAgICAgICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQ2xvY2tfQ29uZmlndXJhdGlvbiBSQ0MgQ2xvY2sgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4KKyAgKiBAbm90ZSAgIFRoZSBIU0kgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogICAgICAgICBJdCBpcyB1c2VkIChlbmFibGVkIGJ5IGhhcmR3YXJlKSBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyIHN0YXJ0dXAKKyAgKiAgICAgICAgIGZyb20gUmVzZXQsIHdha2V1cCBmcm9tIFNUT1AgYW5kIFNUQU5EQlkgbW9kZSwgb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgICogICAgICAgICBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhcyBzeXN0ZW0gY2xvY2sgKGlmIHRoZSBDbG9jaworICAqICAgICAgICAgU2VjdXJpdHkgU3lzdGVtIENTUyBpcyBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBIU0ksIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0lSRFkKKyAgKiAgICAgICAgIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBIU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcworICAqICAgICAgICAgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCkgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpLgorICAqIEBub3RlICAgSFNJIGNhbiBub3QgYmUgc3RvcHBlZCBpZiBpdCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuIEluIHRoaXMgY2FzZSwKKyAgKiAgICAgICAgIHlvdSBoYXZlIHRvIHNlbGVjdCBhbm90aGVyIHNvdXJjZSBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gc3RvcCB0aGUgSFNJLgorICAqIEBub3RlICAgV2hlbiB0aGUgSFNJIGlzIHN0b3BwZWQsIEhTSVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyIDYgSFNJIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGNsb2NrIGN5Y2xlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9ESVNBQkxFKCkgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lPTikKKworLyoqIEBicmllZiAgTWFjcm8gdG8gYWRqdXN0IHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgY2FsaWJyYXRpb24gdmFsdWUuCisgICogQG5vdGUgICBUaGUgY2FsaWJyYXRpb24gaXMgdXNlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgdmFyaWF0aW9ucyBpbiB2b2x0YWdlCisgICogICAgICAgICBhbmQgdGVtcGVyYXR1cmUgdGhhdCBpbmZsdWVuY2UgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgaW50ZXJuYWwgSFNJIFJDLgorICAqIEBwYXJhbSAgX19IU0lDQUxJQlJBVElPTlZBTFVFX18gc3BlY2lmaWVzIHRoZSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZQorICAqICAgICAgICAgKGRlZmF1bHQgaXMgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEyNy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChfX0hTSUNBTElCUkFUSU9OVkFMVUVfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJVFJJTSwgKHVpbnQzMl90KShfX0hTSUNBTElCUkFUSU9OVkFMVUVfXykgPDwgUkNDX0lDU0NSX0hTSVRSSU1fUG9zKQorCisvKioKKyAgKiBAYnJpZWYgICAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBmb3JjZSBvZiB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpCisgICogICAgICAgICAgIGluIFNUT1AgbW9kZSB0byBiZSBxdWlja2x5IGF2YWlsYWJsZSBhcyBrZXJuZWwgY2xvY2sgZm9yIFVTQVJUcyBhbmQgSTJDcy4KKyAgKiBAbm90ZSAgICAgS2VlcGluZyB0aGUgSFNJIE9OIGluIFNUT1AgbW9kZSBhbGxvd3MgdG8gYXZvaWQgc2xvd2luZyBkb3duIHRoZSBjb21tdW5pY2F0aW9uCisgICogICAgICAgICAgIHNwZWVkIGJlY2F1c2Ugb2YgdGhlIEhTSSBzdGFydHVwIHRpbWUuCisgICogQG5vdGUgICAgIFRoZSBlbmFibGUgb2YgdGhpcyBmdW5jdGlvbiBoYXMgbm90IGVmZmVjdCBvbiB0aGUgSFNJT04gYml0LgorICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNJU1RPUF9FTkFCTEUoKSAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pCisKKyNkZWZpbmUgX19IQUxfUkNDX0hTSVNUT1BfRElTQUJMRSgpICAgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSFNJU1lTIGNsb2NrLgorICAqIEBwYXJhbSAgX19IU0lESVZfXyBzcGVjaWZpZXMgdGhlIEhTSTE2IGRpdmlzaW9uIGZhY3Rvci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0lfRElWMSAgIEhTSSBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9ESVYyICAgSFNJIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNJX0RJVjQgICBIU0kgY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0lfRElWOCAgIEhTSSBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSA4CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9ESVYxNiAgSFNJIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDE2CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9ESVYzMiAgSFNJIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDMyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9ESVY2NCAgSFNJIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDY0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTSV9ESVYxMjggSFNJIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDEyOAorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNJX0NPTkZJRyhfX0hTSURJVl9fKSBcCisgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DUiwgUkNDX0NSX0hTSURJViwgKF9fSFNJRElWX18pKQorCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIExTSSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgICogICAgICAgICBMU0lSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IExTSSBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byBjbG9jayB0aGUgSVdERyBhbmQvb3IgdGhlIFJUQy4KKyAgKiBAbm90ZSAgIExTSSBjYW4gbm90IGJlIGRpc2FibGVkIGlmIHRoZSBJV0RHIGlzIHJ1bm5pbmcuCisgICogQG5vdGUgICBXaGVuIHRoZSBMU0kgaXMgc3RvcHBlZCwgTFNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBMU0kgb3NjaWxsYXRvcgorICAqICAgICAgICAgY2xvY2sgY3ljbGVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNJX0VOQUJMRSgpICAgICAgICAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lPTikKKworI2RlZmluZSBfX0hBTF9SQ0NfTFNJX0RJU0FCTEUoKSAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0UpLgorICAqIEBub3RlICAgVHJhbnNpdGlvbiBIU0UgQnlwYXNzIHRvIEhTRSBPbiBhbmQgSFNFIE9uIHRvIEhTRSBCeXBhc3MgYXJlIG5vdAorICAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIEhTRSBPZmYKKyAgKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIEhTRSBPbiBvciBIU0UgQnlwYXNzLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIEhTRSAoUkNDX0hTRV9PTiBvciBSQ0NfSFNFX0J5cGFzcyksIHRoZSBhcHBsaWNhdGlvbgorICAqICAgICAgICAgc29mdHdhcmUgc2hvdWxkIHdhaXQgb24gSFNFUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBIU0UgY2xvY2sKKyAgKiAgICAgICAgIGlzIHN0YWJsZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2xvY2sgdGhlIFBMTCBhbmQvb3Igc3lzdGVtIGNsb2NrLgorICAqIEBub3RlICAgSFNFIHN0YXRlIGNhbiBub3QgYmUgY2hhbmdlZCBpZiBpdCBpcyB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlCisgICogICAgICAgICBQTEwgYXMgc3lzdGVtIGNsb2NrLiBJbiB0aGlzIGNhc2UsIHlvdSBoYXZlIHRvIHNlbGVjdCBhbm90aGVyIHNvdXJjZQorICAqICAgICAgICAgb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIGNoYW5nZSB0aGUgSFNFIHN0YXRlIChleC4gZGlzYWJsZSBpdCkuCisgICogQG5vdGUgICBUaGUgSFNFIGlzIHN0b3BwZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldCB0aGUgQ1NTT04gYml0LCBzbyBpZiB0aGUgY2xvY2sgc2VjdXJpdHkgc3lzdGVtKENTUykKKyAgKiAgICAgICAgIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgeW91IGhhdmUgdG8gZW5hYmxlIGl0IGFnYWluIGFmdGVyIGNhbGxpbmcgdGhpcworICAqICAgICAgICAgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX1NUQVRFX18gIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBIU0UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfT0ZGICBUdXJuIE9GRiB0aGUgSFNFIG9zY2lsbGF0b3IsIEhTRVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFX09OICBUdXJuIE9OIHRoZSBIU0Ugb3NjaWxsYXRvci4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFX0JZUEFTUyAgSFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGlmKChfX1NUQVRFX18pID09IFJDQ19IU0VfT04pICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKChfX1NUQVRFX18pID09IFJDQ19IU0VfQllQQVNTKSBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKS4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb25zIExTRSBCeXBhc3MgdG8gTFNFIE9uIGFuZCBMU0UgT24gdG8gTFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gTFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuCisgICogQG5vdGUgICBBcyB0aGUgTFNFIGlzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkIHRvCisgICogICAgICAgICB0aGlzIGRvbWFpbiBhZnRlciByZXNldCwgeW91IGhhdmUgdG8gZW5hYmxlIHdyaXRlIGFjY2VzcyB1c2luZworICAqICAgICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCkgZnVuY3Rpb24gYmVmb3JlIHRvIGNvbmZpZ3VyZSB0aGUgTFNFCisgICogICAgICAgICAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBMU0UgKFJDQ19MU0VfT04gb3IgUkNDX0xTRV9CWVBBU1MpLCB0aGUgYXBwbGljYXRpb24KKyAgKiAgICAgICAgIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIExTRVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgTFNFIGNsb2NrCisgICogICAgICAgICBpcyBzdGFibGUgYW5kIGNhbiBiZSB1c2VkIHRvIGNsb2NrIHRoZSBSVEMuCisgICogQHBhcmFtICBfX1NUQVRFX18gIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VfT0ZGICBUdXJuIE9GRiB0aGUgTFNFIG9zY2lsbGF0b3IsIExTRVJEWSBmbGFnIGdvZXMgbG93IGFmdGVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IExTRSBvc2NpbGxhdG9yIGNsb2NrIGN5Y2xlcy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX09OICBUdXJuIE9OIHRoZSBMU0Ugb3NjaWxsYXRvci4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX0JZUEFTUyAgTFNFIG9zY2lsbGF0b3IgYnlwYXNzZWQgd2l0aCBleHRlcm5hbCBjbG9jay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRV9DT05GSUcoX19TVEFURV9fKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBpZigoX19TVEFURV9fKSA9PSBSQ0NfTFNFX09OKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKChfX1NUQVRFX18pID09IFJDQ19MU0VfQllQQVNTKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfUlRDX0Nsb2NrX0NvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gY29uZmlndXJlIHRoZSBSVEMgY2xvY2sgKFJUQ0NMSykuCisgICogQG5vdGUgICBBcyB0aGUgUlRDIGNsb2NrIGNvbmZpZ3VyYXRpb24gYml0cyBhcmUgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlCisgICogICAgICAgICBhY2Nlc3MgaXMgZGVuaWVkIHRvIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUKKyAgKiAgICAgICAgIGFjY2VzcyB1c2luZyB0aGUgUG93ZXIgQmFja3VwIEFjY2VzcyBtYWNybyBiZWZvcmUgdG8gY29uZmlndXJlCisgICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZSAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4KKyAgKiBAbm90ZSAgIE9uY2UgdGhlIFJUQyBjbG9jayBpcyBjb25maWd1cmVkIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVubGVzcyB0aGUKKyAgKiAgICAgICAgIEJhY2t1cCBkb21haW4gaXMgcmVzZXQgdXNpbmcgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgbWFjcm8sIG9yIGJ5CisgICogICAgICAgICBhIFBvd2VyIE9uIFJlc2V0IChQT1IpLgorICAqCisgICogQHBhcmFtICBfX1JUQ19DTEtTT1VSQ0VfXyAgc3BlY2lmaWVzIHRoZSBSVEMgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNJICBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZAorICAqCisgICogQG5vdGUgICBJZiB0aGUgTFNFIG9yIExTSSBpcyB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UsIHRoZSBSVEMgY29udGludWVzIHRvCisgICogICAgICAgICB3b3JrIGluIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMsIGFuZCBjYW4gYmUgdXNlZCBhcyB3YWtldXAgc291cmNlLgorICAqICAgICAgICAgSG93ZXZlciwgd2hlbiB0aGUgSFNFIGNsb2NrIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQworICAqICAgICAgICAgY2Fubm90IGJlIHVzZWQgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSBmb3IgUlRDIGlzIDFNSHogKHdoZW4gdXNpbmcgSFNFIGFzCisgICogICAgICAgICBSVEMgY2xvY2sgc291cmNlKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19DT05GSUcoX19SVENfQ0xLU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKCBSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCwgKF9fUlRDX0NMS1NPVVJDRV9fKSkKKworCisvKiogQGJyaWVmIE1hY3JvIHRvIGdldCB0aGUgUlRDIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JUQ0NMS1NPVVJDRV9OT05FIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0xTSSAgTFNJIHNlbGVjdGVkIGFzIFJUQyBjbG9jay4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMiAgSFNFIGNsb2NrIGRpdmlkZWQgYnkgMzIgc2VsZWN0ZWQKKyAgKi8KKyNkZWZpbmUgIF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMKSkpCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgbWFpbiBQTEwuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgbWFpbiBQTEwsIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbgorICAqICAgICAgICAgUExMUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBQTEwgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4KKyAgKiAgICAgICAgIGJlIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiBAbm90ZSAgIFRoZSBtYWluIFBMTCBjYW4gbm90IGJlIGRpc2FibGVkIGlmIGl0IGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqIEBub3RlICAgVGhlIG1haW4gUExMIGlzIGRpc2FibGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19DbG9ja19Db25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0VOQUJMRSgpICAgICAgICAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pCisKKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9ESVNBQkxFKCkgICAgICAgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMIGNsb2NrIHNvdXJjZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX1BMTFNPVVJDRV9fICBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfTk9ORSAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNFICBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTFNPVVJDRV9DT05GSUcoX19QTExTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQywgKF9fUExMU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIG1haW4gUExMIGlzIGRpc2FibGVkLgorICAqIEBwYXJhbSAgX19QTExNX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgUkNDX1BMTE1fQ2xvY2tfRGl2aWRlci4KKyAgKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMTSBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGVuc3VyZSB0aGF0IHRoZSBWQ08gaW5wdXQKKyAgKiAgICAgICAgIGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1Iei4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2VsZWN0IGEgZnJlcXVlbmN5CisgICogICAgICAgICBvZiAxNiBNSHogdG8gbGltaXQgUExMIGppdHRlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX1BMTE1fQ09ORklHKF9fUExMTV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTSwgKF9fUExMTV9fKSkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIG1haW4gUExMIGNsb2NrIHNvdXJjZSwgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGZhY3RvcnMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIG1haW4gUExMIGlzIGRpc2FibGVkLgorICAqCisgICogQHBhcmFtICBfX1BMTFNPVVJDRV9fICBzcGVjaWZpZXMgdGhlIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNJICBIU0kgb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNFICBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKgorICAqIEBwYXJhbSAgX19QTExNX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIuCisgICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTE0gcGFyYW1ldGVyIGNvcnJlY3RseSB0byBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0CisgICogICAgICAgICBmcmVxdWVuY3kgcmFuZ2VzIGZyb20gNCB0byAxNiBNSHouIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNlbGVjdCBhIGZyZXF1ZW5jeQorICAqICAgICAgICAgb2YgMTYgTUh6IHRvIGxpbWl0IFBMTCBqaXR0ZXIuCisgICoKKyAgKiBAcGFyYW0gIF9fUExMTl9fICBzcGVjaWZpZXMgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gOCBhbmQgODYuCisgICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTE4gcGFyYW1ldGVyIGNvcnJlY3RseSB0byBlbnN1cmUgdGhhdCB0aGUgVkNPCisgICogICAgICAgICBvdXRwdXQgZnJlcXVlbmN5IGlzIGJldHdlZW4gNjQgYW5kIDM0NCBNSHouCisgICoKKyAgKiBAcGFyYW0gIF9fUExMUF9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgQURDIGNsb2NrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFBfQ2xvY2tfRGl2aWRlci4KKyAgKgorICAqIEBwYXJhbSAgX19QTExRX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBSQkcgJiBIUyBUaW1lcnMgY2xvY2tzLigxKQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFFfQ2xvY2tfRGl2aWRlcgorICAqIEBub3RlICAgKDEpX19QTExRX18gcGFyYW1ldGVyIGF2YWlsYWJpbGl0eSBkZXBlbmRzIG9uIGRldmljZXMKKyAgKiBAbm90ZSAgIElmIHRoZSBVU0IgRlMgaXMgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgaGF2ZSB0byBzZXQgdGhlCisgICogICAgICAgICBQTExRIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gaGF2ZSA0OCBNSHogY2xvY2sgZm9yIHRoZSBVU0IuIEhvd2V2ZXIsCisgICogICAgICAgICB0aGUgUk5HIG5lZWRzIGEgZnJlcXVlbmN5IGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gNDggTUh6IHRvIHdvcmsKKyAgKiAgICAgICAgIGNvcnJlY3RseS4KKyAgKgorICAqIEBwYXJhbSAgX19QTExSX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciB0aGUgbWFpbiBzeXN0ZW0gY2xvY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgUkNDX1BMTFJfQ2xvY2tfRGl2aWRlcgorICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTEwgcGFyYW1ldGVycyBjb3JyZWN0bHkgdG8gbm90IGV4Y2VlZCA2NE1IWi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHKF9fUExMU09VUkNFX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExQX18sIF9fUExMUV9fLF9fUExMUl9fICkgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyggUkNDLT5QTExDRkdSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFNSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgKF9fUExMU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpIChfX1BMTE1fXykgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoKF9fUExMTl9fKSA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgKF9fUExMUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpIChfX1BMTFFfXykgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoX19QTExSX18pKSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHKF9fUExMU09VUkNFX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExQX18sIF9fUExMUl9fICkgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyggUkNDLT5QTExDRkdSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFNSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExSKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KSAoX19QTExTT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgKF9fUExMTV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpICgoX19QTExOX18pIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoX19QTExQX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgKF9fUExMUl9fKSkpCisjZW5kaWYKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgb3NjaWxsYXRvciB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgb3NjaWxsYXRvciB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lCisgICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FIE5vIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKSAoKHVpbnQzMl90KShSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExTUkMpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBlYWNoIGNsb2NrIG91dHB1dCAoUkNDX1BMTFJDTEssIFJDQ19QTExRQ0xLKCopLCBSQ0NfUExMUENMSykKKyAgKiBAbm90ZSAgIEVuYWJsaW5nIGNsb2NrIG91dHB1dHMgUkNDX1BMTFBDTEsgYW5kIFJDQ19QTExRQ0xLKCopIGNhbiBiZSBkb25lIGF0IGFueXRpbWUKKyAgKiAgICAgICAgIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3RvcCB0aGUgUExMIGluIG9yZGVyIHRvIHNhdmUgcG93ZXIuIEJ1dCBSQ0NfUExMUkNMSyBjYW5ub3QKKyAgKiAgICAgICAgIGJlIHN0b3BwZWQgaWYgdXNlZCBhcyBTeXN0ZW0gQ2xvY2suCisgICogQG5vdGUgICAoKikgUkNDX1BMTFFDTEsgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqIEBwYXJhbSAgX19QTExDTE9DS09VVF9fIHNwZWNpZmllcyB0aGUgUExMIGNsb2NrIHRvIGJlIG91dHB1dC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFBDTEsgIFRoaXMgY2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMuCisgICogQGlmIGRlZmluZWQoU1RNMzJHMDgxeHgpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFFDTEsgIFRoaXMgQ2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBIaWdoIFNwZWVkIFRpbWVycywKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJhbmRvbSBhbmFsb2cgZ2VuZXJhdG9yICg8PTQ4IE1IeikuCisgICogQGVuZGlmCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFJDTEsgIFRoaXMgQ2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGlnaCBzcGVlZCBzeXN0ZW0gY2xvY2sgKHVwIHRvIDY0TUh6KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShfX1BMTENMT0NLT1VUX18pICAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZWFjaCBjbG9jayBvdXRwdXQgKFJDQ19QTExSQ0xLLCBSQ0NfUExMUUNMSygqKSwgUkNDX1BMTFBDTEspCisgICogQG5vdGUgICBEaXNhYmxpbmcgY2xvY2sgb3V0cHV0cyBSQ0NfUExMUENMSyBhbmQgUkNDX1BMTFFDTEsoKikgY2FuIGJlIGRvbmUgYXQgYW55dGltZQorICAqICAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byBzdG9wIHRoZSBQTEwgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlci4gQnV0IFJDQ19QTExSQ0xLIGNhbm5vdAorICAqICAgICAgICAgYmUgc3RvcHBlZCBpZiB1c2VkIGFzIFN5c3RlbSBDbG9jay4KKyAgKiBAbm90ZSAgICgqKSBSQ0NfUExMUUNMSyBhdmFpbGFiaWxpdHkgZGVwZW5kcyBvbiBkZXZpY2VzCisgICogQHBhcmFtICBfX1BMTENMT0NLT1VUX18gIHNwZWNpZmllcyB0aGUgUExMIGNsb2NrIHRvIGJlIG91dHB1dC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFBDTEsgIFRoaXMgY2xvY2sgbWF5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgQURDLCBJMlMxLgorICAqIEBpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExRQ0xLIFRoaXMgQ2xvY2sgbWF5IGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgSGlnaCBTcGVlZCBUaW1lcnMsCisgICogICAgICAgICAgICAgYW5kIFJORyAoPD00OCBNSHopLgorICAqIEBlbmRpZgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExSQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2ggc3BlZWQgc3lzdGVtIGNsb2NrICh1cCB0byA2NE1IeikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTENMS09VVF9ESVNBQkxFKF9fUExMQ0xPQ0tPVVRfXykgIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBvdXRwdXQgZW5hYmxlIHN0YXR1cyAoUkNDX1BMTFJDTEssIFJDQ19QTExRQ0xLKCopLCBSQ0NfUExMUENMSykKKyAgKiBAcGFyYW0gIF9fUExMQ0xPQ0tPVVRfXyBzcGVjaWZpZXMgdGhlIG91dHB1dCBQTEwgY2xvY2sgdG8gYmUgY2hlY2tlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSQ0NfUExMUENMSyBUaGlzIGNsb2NrIG1heSBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgQURDLCBJMlMxLgorICAqIEBpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KQorICAqICAgICAgICAgICAgQGFyZyBSQ0NfUExMUUNMSyBUaGlzIENsb2NrIG1heSBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIEhTIFRpbWVycywKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFJORyAoPD00OCBNSHopLgorICAqIEBlbmRpZgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExSQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2ggc3BlZWQgc3lzdGVtIGNsb2NrICh1cCB0byA2NE1IeikKKyAgKiBAcmV0dmFsIFNFVCAvIFJFU0VUCisgICogQG5vdGUgICAoKikgUkNDX1BMTFFDTEsgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoX19QTExDTE9DS09VVF9fKSAgUkVBRF9CSVQoUkNDLT5QTExDRkdSLCAoX19QTExDTE9DS09VVF9fKSkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX1NZU0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0kgSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9QTExDTEsgUExMIG91dHB1dCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX0xTSSBMU0kgb3NjaWxsYXRvciBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX0xTRSBMU0Ugb3NjaWxsYXRvciBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDTEtfQ09ORklHKF9fU1lTQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVywgKF9fU1lTQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIGNsb2NrIHNvdXJjZSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lCisgICogICAgICAgICBvZiB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRSBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEsgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfTFNJIExTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19MU0UgTFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgICAgICAgICAoUkNDLT5DRkdSICYgUkNDX0NGR1JfU1dTKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiBAbm90ZSAgIEFzIHRoZSBMU0UgaXMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgdG8KKyAgKiAgICAgICAgIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUgYWNjZXNzIHVzaW5nCisgICogICAgICAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKSBmdW5jdGlvbiBiZWZvcmUgdG8gY29uZmlndXJlIHRoZSBMU0UKKyAgKiAgICAgICAgICh0byBiZSBkb25lIG9uY2UgYWZ0ZXIgcmVzZXQpLgorICAqIEBwYXJhbSAgX19MU0VEUklWRV9fIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9MT1cgTFNFIG9zY2lsbGF0b3IgbG93IGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUxPVyBMU0Ugb3NjaWxsYXRvciBtZWRpdW0gbG93IGRyaXZlIGNhcGFiaWxpdHkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRURSSVZFX01FRElVTUhJR0ggTFNFIG9zY2lsbGF0b3IgbWVkaXVtIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfSElHSCBMU0Ugb3NjaWxsYXRvciBoaWdoIGRyaXZlIGNhcGFiaWxpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VEUklWRV9DT05GSUcoX19MU0VEUklWRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWLCAodWludDMyX3QpKF9fTFNFRFJJVkVfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTUNPIGNsb2NrLgorICAqIEBwYXJhbSAgX19NQ09DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIE1DTyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICBNQ08gb3V0cHV0IGRpc2FibGVkCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLIFN5c3RlbSAgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSSBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTRSBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZWUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIE1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiBAcGFyYW0gIF9fTUNPRElWX18gc3BlY2lmaWVzIHRoZSBNQ08gY2xvY2sgcHJlc2NhbGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzIgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfNCAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSA0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl84ICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzE2ICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgMTYKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX01DTzFfQ09ORklHKF9fTUNPQ0xLU09VUkNFX18sIF9fTUNPRElWX18pIFwKKyAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIChSQ0NfQ0ZHUl9NQ09TRUwgfCBSQ0NfQ0ZHUl9NQ09QUkUpLCAoKF9fTUNPQ0xLU09VUkNFX18pIHwgKF9fTUNPRElWX18pKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudAorICAqIEBicmllZiBtYWNyb3MgdG8gbWFuYWdlIHRoZSBzcGVjaWZpZWQgUkNDIEZsYWdzIGFuZCBpbnRlcnJ1cHRzLgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSQ0MgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBTRVRfQklUKFJDQy0+Q0lFUiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmIERpc2FibGUgUkNDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0lSRFkgTFNJIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgTFNFIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgSFNJIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgSFNFIHJlYWR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgIE1haW4gUExMIHJlYWR5IGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBDTEVBUl9CSVQoUkNDLT5DSUVSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIFJDQyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSVJEWSBMU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSVJEWSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSBIU0UgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0NTUyAgICAgSFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgKFJDQy0+Q0lDUiA9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgUkNDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJDQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJUkRZIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfQ1NTICAgICBIU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0lUKF9fSU5URVJSVVBUX18pICgoUkNDLT5DSUZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgU2V0IFJNVkYgYml0IHRvIGNsZWFyIHRoZSByZXNldCBmbGFncy4KKyAgKiAgICAgICAgVGhlIHJlc2V0IGZsYWdzIGFyZTogUkNDX0ZMQUdfT0JMUlNULCBSQ0NfRkxBR19QSU5SU1QsIFJDQ19GTEFHX1BXUlJTVCwKKyAgKiAgICAgICAgUkNDX0ZMQUdfU0ZUUlNULCBSQ0NfRkxBR19JV0RHUlNULCBSQ0NfRkxBR19XV0RHUlNUIGFuZCBSQ0NfRkxBR19MUFdSUlNULgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfUkVTRVRfRkxBR1MoKSAoUkNDLT5DU1IgfD0gUkNDX0NTUl9STVZGKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RlZCBSQ0MgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19IU0lSRFkgSFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19IU0VSRFkgSFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19QTExSRFkgIE1haW4gUExMIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNFUkRZIExTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNFQ1NTRCBDbG9jayBzZWN1cml0eSBzeXN0ZW0gZmFpbHVyZSBvbiBMU0Ugb3NjaWxsYXRvciBkZXRlY3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0lSRFkgTFNJIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19QV1JSU1QgQk9SIG9yIFBPUi9QRFIgcmVzZXQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19PQkxSU1QgT0JMUlNUIHJlc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUElOUlNUIFBpbiByZXNldAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1NGVFJTVCBTb2Z0d2FyZSByZXNldAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0lXREdSU1QgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19XV0RHUlNUIFdpbmRvdyBXYXRjaGRvZyByZXNldAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0xQV1JSU1QgTG93IFBvd2VyIHJlc2V0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9GTEFHKF9fRkxBR19fKSAoKCgoKCgoX19GTEFHX18pID4+IDVVKSA9PSBDUl9SRUdfSU5ERVgpID8gUkNDLT5DUiA6ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0ZMQUdfXykgPj4gNVUpID09IEJEQ1JfUkVHX0lOREVYKSA/IFJDQy0+QkRDUiA6ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fRkxBR19fKSA+PiA1VSkgPT0gQ1NSX1JFR19JTkRFWCkgPyBSQ0MtPkNTUiA6IFJDQy0+Q0lGUikpKSAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxVSA8PCAoKF9fRkxBR19fKSAmIFJDQ19GTEFHX01BU0spKSkgIT0gUkVTRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFJDQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9yY2NfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0RlSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfT3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19DbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCBGTGF0ZW5jeSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPRGl2KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19FbmFibGVMU0VDU1Modm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0Rpc2FibGVMU0VDU1Modm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSh2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0SENMS0ZyZXEodm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldFBDTEsxRnJlcSh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfR2V0T3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCAqcEZMYXRlbmN5KTsKKy8qIExTRSAmIEhTRSBDU1MgTk1JIElSUSBoYW5kbGVyICovCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpOworLyogVXNlciBDYWxsYmFja3MgaW4gbm9uIGJsb2NraW5nIG1vZGUgKElUIG1vZGUpICovCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0NTU0NhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19MU0VDU1NDYWxsYmFjayh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfUkNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3JjY19leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfcmNjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZjI4MwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX3JjY19leC5oCkBAIC0wLDAgKzEsODIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9yY2NfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1JDQ19FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfUkNDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfVHlwZXMgUkNDRXggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJDQyBleHRlbmRlZCBjbG9ja3Mgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaENsb2NrU2VsZWN0aW9uOyAgIC8qITwgVGhlIEV4dGVuZGVkIENsb2NrIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgVXNhcnQxQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBTcGVjaWZpZXMgVVNBUlQxIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgKi8KKyNpZiAoUkNDX0NDSVBSX1VTQVJUMlNFTCkKKyAgdWludDMyX3QgVXNhcnQyQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBTcGVjaWZpZXMgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1VTQVJUMl9DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZgorI2lmIChSQ0NfQ0NJUFJfTFBVQVJUMVNFTCkKKyAgdWludDMyX3QgTHB1YXJ0MUNsb2NrU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgTFBVQVJUMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0xQVUFSVDFfQ2xvY2tfU291cmNlICovCisjZW5kaWYKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBTcGVjaWZpZXMgSTJDMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyQzFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJzMUNsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBTcGVjaWZpZXMgSTJTMSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0kyUzFfQ2xvY2tfU291cmNlICovCisKKyNpZiAoUkNDX0NDSVBSX0xQVElNMVNFTCkKKyAgdWludDMyX3QgTHB0aW0xQ2xvY2tTZWxlY3Rpb247ICAgLyohPCBTcGVjaWZpZXMgTFBUSU0xIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmCisjaWYgKFJDQ19DQ0lQUl9MUFRJTTJTRUwpCisgIHVpbnQzMl90IExwdGltMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgU3BlY2lmaWVzIExQVElNMiBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0xQVElNMl9DbG9ja19Tb3VyY2UgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoUk5HKQorICB1aW50MzJfdCBSbmdDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSTkcgY2xvY2sgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9STkdfQ2xvY2tfU291cmNlICovCisjZW5kaWYKKyAgdWludDMyX3QgQWRjQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgQURDIGludGVyZmFjZSBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQ19DbG9ja19Tb3VyY2UgKi8KKyNpZiBkZWZpbmVkKENFQykKKyAgdWludDMyX3QgQ2VjQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgQ0VDIENsb2NrIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ0VDX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmCisjaWYgKFJDQ19DQ0lQUl9USU0xU0VMKQorICB1aW50MzJfdCBUaW0xQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgVElNMSBDbG9jayBjbG9jayBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9USU0xX0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmCisjaWYgKFJDQ19DQ0lQUl9USU0xNVNFTCkKKyAgdWludDMyX3QgVGltMTVDbG9ja1NlbGVjdGlvbjsgICAgIC8qITwgU3BlY2lmaWVzIFRJTTE1IENsb2NrIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X1RJTTE1X0Nsb2NrX1NvdXJjZSAqLworI2VuZGlmCisgIHVpbnQzMl90IFJUQ0Nsb2NrU2VsZWN0aW9uOyAgICAgIC8qITwgU3BlY2lmaWVzIFJUQyBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworfSBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBSQ0NFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xTQ09fQ2xvY2tfU291cmNlIExvdyBTcGVlZCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFNDT1NPVVJDRV9MU0kgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTFNJIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworI2RlZmluZSBSQ0NfTFNDT1NPVVJDRV9MU0UgICAgICAgICAgICAgUkNDX0JEQ1JfTFNDT1NFTCAgICAgIC8qITwgTFNFIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uIFBlcmlwaCBDbG9jayBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgICAgICAgICAgMHgwMDAwMDAwMVUKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDJTRUwpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgICAgICAgICAweDAwMDAwMDAyVQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9VU0FSVDJTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEgICAgICAgICAgMHgwMDAwMDAyMFUKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgICAgICAgICAgMHgwMDAwMDA0MFUKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFRJTTFTRUwpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBUSU0xICAgICAgICAgICAweDAwMDAwMjAwVQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTFTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFRJTTJTRUwpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBUSU0yICAgICAgICAgICAweDAwMDAwNDAwVQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTJTRUwgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19JMlMxICAgICAgICAgICAgIDB4MDAwMDA4MDBVCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQURDICAgICAgICAgICAgICAweDAwMDA0MDAwVQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgICAgICAgICAgMHgwMDAyMDAwMFUKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9STkdTRUwpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUk5HICAgICAgICAgICAgICAweDAwMDQwMDAwVQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9STkdTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9DRUNTRUwpCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQ0VDICAgICAgICAgICAgICAweDAwMDgwMDAwVQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9DRUNTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgICAgICAgICAgMHgwMDIwMDAwMFUKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMVNFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTE1U0VMKQorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICAgICAgICAgICAgMHgwMDQwMDAwMFUKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUMV9DbG9ja19Tb3VyY2UgUkNDIFVTQVJUMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQVBCIGNsb2NrIHNlbGVjdGVkIGFzIFVTQVJUIDEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgICAgIFJDQ19DQ0lQUl9VU0FSVDFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBVU0FSVCAxIGNsb2NrICovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICAgICAgICBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMSBjbG9jayAqLworI2RlZmluZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgICAgICAgKFJDQ19DQ0lQUl9VU0FSVDFTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDFTRUxfMSkgIC8qITwgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIFVTQVJUIDEgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDJTRUwpCisvKiogQGRlZmdyb3VwIFJDQ0V4X1VTQVJUMl9DbG9ja19Tb3VyY2UgUkNDIFVTQVJUMiBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQVBCIGNsb2NrIHNlbGVjdGVkIGFzIFVTQVJUIDIgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEsgICAgIFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBVU0FSVCAyIGNsb2NrICovCisjZGVmaW5lIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJICAgICAgICBSQ0NfQ0NJUFJfVVNBUlQyU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMiBjbG9jayAqLworI2RlZmluZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRSAgICAgICAgKFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCB8IFJDQ19DQ0lQUl9VU0FSVDJTRUxfMSkgIC8qITwgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIFVTQVJUIDIgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMlNFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0xQVUFSVDFTRUwpCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xQVUFSVDFfQ2xvY2tfU291cmNlIFJDQyBMUFVBUlQxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFQQiBjbG9jayBzZWxlY3RlZCBhcyBMUFVBUlQgMSBjbG9jayAqLworI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEsgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgY2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUIDEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVUFSVCAxIGNsb2NrICovCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSAgICAgICAoUkNDX0NDSVBSX0xQVUFSVDFTRUxfMCB8IFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzEpICAvKiE8IExTRSBjbG9jayBzZWxlY3RlZCBhcyBMUFVBUlQgMSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzFfQ2xvY2tfU291cmNlIFJDQyBJMkMxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBUEIgY2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jayAqLworI2RlZmluZSBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEsgICAgICAgUkNDX0NDSVBSX0kyQzFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfSFNJICAgICAgICAgIFJDQ19DQ0lQUl9JMkMxU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyUzFfQ2xvY2tfU291cmNlIFJDQyBJMlMxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMlMxQ0xLU09VUkNFX1NZU0NMSyAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBJMlMxIGNsb2NrICovCisjZGVmaW5lIFJDQ19JMlMxQ0xLU09VUkNFX1BMTCAgICAgICAgICBSQ0NfQ0NJUFJfSTJTMVNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTCAiUCIgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jayAqLworI2RlZmluZSBSQ0NfSTJTMUNMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NDSVBSX0kyUzFTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jayAqLworI2RlZmluZSBSQ0NfSTJTMUNMS1NPVVJDRV9FWFQgICAgICAgICAgUkNDX0NDSVBSX0kyUzFTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBJMlMgY2xvY2sgc291cmNlIHNlbGVjdGVkIGFzIEkyUzEgY2xvY2sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIChSQ0NfQ0NJUFJfTFBUSU0xU0VMKQorLyoqIEBkZWZncm91cCBSQ0NFeF9MUFRJTTFfQ2xvY2tfU291cmNlIFJDQyBMUFRJTTEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBBUEIgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUaW1lciAxIGNsb2NrICovCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0xU0VMXzAgICAgIC8qITwgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVGltZXIgMSBjbG9jayAqLworI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgICAgICAgUkNDX0NDSVBSX0xQVElNMVNFTF8xICAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBMUFRpbWVyIDEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0UgICAgICAgIFJDQ19DQ0lQUl9MUFRJTTFTRUwgICAgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUaW1lciAxIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTFTRUwgKi8KKworI2lmIChSQ0NfQ0NJUFJfTFBUSU0yU0VMKQorLyoqIEBkZWZncm91cCBSQ0NFeF9MUFRJTTJfQ2xvY2tfU291cmNlIFJDQyBMUFRJTTIgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLMSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBBUEIgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUaW1lciAyIGNsb2NrICovCisjZGVmaW5lIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNJICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0yU0VMXzAgICAgIC8qITwgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVGltZXIgMiBjbG9jayAqLworI2RlZmluZSBSQ0NfTFBUSU0yQ0xLU09VUkNFX0hTSSAgICAgICAgUkNDX0NDSVBSX0xQVElNMlNFTF8xICAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBMUFRpbWVyIDIgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0xQVElNMkNMS1NPVVJDRV9MU0UgICAgICAgIFJDQ19DQ0lQUl9MUFRJTTJTRUwgICAgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUaW1lciAyIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTJTRUwgKi8KKworI2lmIGRlZmluZWQoUk5HKQorLyoqIEBkZWZncm91cCBSQ0NFeF9STkdfQ2xvY2tfU291cmNlIFJDQyBSTkcgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1JOR0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGNsb2NrIHNlbGVjdGVkICovCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfSFNJX0RJVjggICAgICBSQ0NfQ0NJUFJfUk5HU0VMXzAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgb3NjaWxsYXRvciBkaXZpZGVkIGJ5IDggY2xvY2sgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrICovCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfU1lTQ0xLICAgICAgICBSQ0NfQ0NJUFJfUk5HU0VMXzEgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrICovCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfUExMICAgICAgICAgICAoUkNDX0NDSVBSX1JOR1NFTF8wfFJDQ19DQ0lQUl9STkdTRUxfMSkgLyohPCBQTEwgIlEiIHNlbGVjdGVkIGFzIFJORyBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1JOR19EaXZpc2lvbl9mYWN0b3IgUkNDIFJORyBEaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUk5HQ0xLX0RJVjEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgY2xvY2sgbm90IGRpdmlkZWQgICovCisjZGVmaW5lIFJDQ19STkdDTEtfRElWMiAgICAgICAgICAgUkNDX0NDSVBSX1JOR0RJVl8wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJORyBjbG9jayBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX1JOR0NMS19ESVY0ICAgICAgICAgICBSQ0NfQ0NJUFJfUk5HRElWXzEgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUk5HIGNsb2NrIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfUk5HQ0xLX0RJVjggICAgICAgICAgIChSQ0NfQ0NJUFJfUk5HRElWXzB8UkNDX0NDSVBSX1JOR0RJVl8xKSAgLyohPCBSTkcgY2xvY2sgZGl2aWRlZCBieSA4ICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUk5HICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDX0Nsb2NrX1NvdXJjZSBSQ0MgQURDIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgUkNDX0FEQ0NMS1NPVVJDRV9TWVNDTEsgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBTWVNDTEsgdXNlZCBhcyBBREMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0FEQ0NMS1NPVVJDRV9QTExBREMgICAgICAgUkNDX0NDSVBSX0FEQ1NFTF8wICAgICAgLyohPCBQTEwgIlAiIChQTExBREMpIHVzZWQgYXMgQURDIGNsb2NrICovCisjZGVmaW5lIFJDQ19BRENDTEtTT1VSQ0VfSFNJICAgICAgICAgIFJDQ19DQ0lQUl9BRENTRUxfMSAgICAgIC8qITwgSFNJIHVzZWQgYXMgQURDIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChDRUMpCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NFQ19DbG9ja19Tb3VyY2UgUkNDIENFQyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ0VDQ0xLU09VUkNFX0hTSV9ESVY0ODggICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IEhTSSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgNDg4IHVzZWQgYXMgZGVmYXVsdCBDRUMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0NFQ0NMS1NPVVJDRV9MU0UgICAgICAgICAgICAgICAgIFJDQ19DQ0lQUl9DRUNTRUwgLyohPCBMU0Ugb3NjaWxsYXRvciBjbG9jayAgdXNlZCBhcyBDRUMgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogQ0VDICovCisKKyNpZiAoUkNDX0NDSVBSX1RJTTFTRUwpCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTTFfQ2xvY2tfU291cmNlIFJDQyBUSU0xIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19USU0xQ0xLU09VUkNFX1BDTEsxICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQVBCIGNsb2NrIHNlbGVjdGVkIGFzIFRpbWVyIDEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1RJTTFDTEtTT1VSQ0VfUExMICAgICAgICAgUkNDX0NDSVBSX1RJTTFTRUwgICAgICAgLyohPCBQTEwgIlEiIGNsb2NrIHNlbGVjdGVkIGFzIFRpbWVyIDEgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTFTRUwgKi8KKworI2lmIChSQ0NfQ0NJUFJfVElNMTVTRUwpCisvKiogQGRlZmdyb3VwIFJDQ0V4X1RJTTE1X0Nsb2NrX1NvdXJjZSBSQ0MgVElNMTUgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1RJTTE1Q0xLU09VUkNFX1BDTEsxICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBBUEIgY2xvY2sgc2VsZWN0ZWQgYXMgVGltZXIgMTUgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1RJTTE1Q0xLU09VUkNFX1BMTCAgICAgICAgUkNDX0NDSVBSX1RJTTE1U0VMICAgICAgLyohPCBQTEwgIlEiIGNsb2NrIHNlbGVjdGVkIGFzIFRpbWVyIDE1IGNsb2NrICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTE1U0VMICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfTWFjcm9zIFJDQ0V4IEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMSBjbG9jayAoSTJDMUNMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fSTJDMV9DTEtTT1VSQ0VfXyAgc3BlY2lmaWVzIHRoZSBJMkMxIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NPTkZJRyhfX0kyQzFfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzFTRUwsICh1aW50MzJfdCkoX19JMkMxX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyQzFTRUwpKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMlMxIGNsb2NrIChJMlMxQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19JMlMxX0NMS1NPVVJDRV9fICBzcGVjaWZpZXMgdGhlIEkyUzEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyUzFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlMxQ0xLU09VUkNFX1BMTCAgICAgUExMUCBDbG9jayBzZWxlY3RlZCBhcyBJMlMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyUzFDTEtTT1VSQ0VfSFNJICAgICBIU0kgQ2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlMxQ0xLU09VUkNFX0VYVCAgICAgRXh0ZXJuYWwgY2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJTMV9DT05GSUcoX19JMlMxX0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMlMxU0VMLCAodWludDMyX3QpKF9fSTJTMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSTJTMSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyUzFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlMxQ0xLU09VUkNFX1BMTCAgICAgUExMUCBDbG9jayBzZWxlY3RlZCBhcyBJMlMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyUzFDTEtTT1VSQ0VfSFNJICAgICBIU0kgQ2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMlMxQ0xLU09VUkNFX0VYVCAgICAgRXh0ZXJuYWwgY2xvY2sgc2VsZWN0ZWQgYXMgSTJTMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyUzFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyUzFTRUwpKSkKKworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayAoVVNBUlQxQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19VU0FSVDFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0FSVDEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSAgIFBDTEsxIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhfX1VTQVJUMV9DTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQxU0VMLCAodWludDMyX3QpKF9fVVNBUlQxX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVU0FSVDEgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzEgICBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMVNFTCkpKQorCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgKFVTQVJUMkNMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fVVNBUlQyX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEgICBQQ0xLMSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSAgSFNJIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMl9DT05GSUcoX19VU0FSVDJfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1VTQVJUMlNFTCwgKHVpbnQzMl90KShfX1VTQVJUMl9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxICAgUENMSzEgc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQyIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9VU0FSVDJTRUwpKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQyU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBMUFVBUlQxIGNsb2NrIChMUFVBUlQxQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19MUFVBUlQxX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgTFBVQVJUMSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAgIFBDTEsxIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kgIEhTSSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRSAgTFNFIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ09ORklHKF9fTFBVQVJUMV9DTEtTT1VSQ0VfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCwgKHVpbnQzMl90KShfX0xQVUFSVDFfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJIEhTSSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCkpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFVBUlQxU0VMICovCisKKyNpZiAoUkNDX0NDSVBSX0xQVElNMVNFTCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBUSU0xIGNsb2NrIChMUFRJTTFDTEspLgorICAqCisgICogQHBhcmFtICBfX0xQVElNMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVElNMSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgSFNJICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgTFNJICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgTFNFICBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoX19MUFRJTTFfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMVNFTCwgKHVpbnQzMl90KShfX0xQVElNMV9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBUSU0xIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0kgIEhTSSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9MUFRJTTFTRUwpKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBUSU0xU0VMICovCisKKyNpZiAoUkNDX0NDSVBSX0xQVElNMlNFTCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBUSU0yIGNsb2NrIChMUFRJTTJDTEspLgorICAqCisgICogQHBhcmFtICBfX0xQVElNMl9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVElNMiBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX0xTSSAgSFNJICBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX0hTSSAgTFNJICBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX0xTRSAgTFNFICBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9DT05GSUcoX19MUFRJTTJfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMlNFTCwgKHVpbnQzMl90KShfX0xQVElNMl9DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBUSU0yIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX0xTSSAgSFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfSFNJICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgTFBUSU0yIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMkNMS1NPVVJDRV9MU0UgIExTRSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFRJTTJfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVElNMlNFTCkpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTJTRUwgKi8KKworI2lmIGRlZmluZWQoQ0VDKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBDRUMgY2xvY2sgKENFQ0NMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fQ0VDX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgQ0VDIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DRUNDTEtTT1VSQ0VfSFNJX0RJVjQ4OCBIU0lfRElWXzQ4OCBzZWxlY3RlZCBhcyBDRUMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ0VDQ0xLU09VUkNFX0xTRSBMU0Ugc2VsZWN0ZWQgYXMgQ0VDIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DRUNfQ09ORklHKF9fQ0VDX0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DRUNTRUwsICh1aW50MzJfdCkoX19DRUNfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIENFQyBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NFQ0NMS1NPVVJDRV9IU0lfRElWNDg4IEhTSV9ESVZfNDg4IENsb2NrIHNlbGVjdGVkIGFzIENFQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DRUNDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgQ0VDIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfQ0VDX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DRUNTRUwpKSkKKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIGRlZmluZWQoUk5HKQorLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBSTkcgY2xvY2suCisgICoKKyAgKgorICAqIEBwYXJhbSAgX19STkdfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBSTkcgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX05PTkUgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJORyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJX0RJVjggSFNJIENsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBSTkcgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX1NZU0NMSyBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9QTEwgUExMUSBPdXRwdXQgQ2xvY2sgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ09ORklHKF9fUk5HX0NMS1NPVVJDRV9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdTRUwsICh1aW50MzJfdCkoX19STkdfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFJORyBjbG9jay4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX05PTkUgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJORyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfSFNJX0RJVjggSFNJIENsb2NrIGRpdmlkZSBieSA4IHNlbGVjdGVkIGFzIFJORyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBjbG9jayBzZWxlY3RlZCBhcyBSTkcgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLU09VUkNFX1BMTCBQTExRIE91dHB1dCBDbG9jayBzZWxlY3RlZCBhcyBSTkcgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9STkdfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1JOR1NFTCkpKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFJORyBjbG9jay4KKyAgKgorICAqCisgICogQHBhcmFtICBfX1JOR19DTEtESVZfXyBzcGVjaWZpZXMgdGhlIFJORyBjbG9jayBkaXZpc2lvbiBmYWN0b3IuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtfRElWMSAgUk5HIENsb2NrIG5vdCBkaXZpZGVkCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS19ESVYyICBSTkcgQ2xvY2sgZGl2aWRlZCBieSAyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS19ESVY0ICBSTkcgQ2xvY2sgZGl2aWRlZCBieSA0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS19ESVY4ICBSTkcgQ2xvY2sgZGl2aWRlZCBieSA4CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19STkdESVZfQ09ORklHKF9fUk5HX0NMS0RJVl9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdESVYsICh1aW50MzJfdCkoX19STkdfQ0xLRElWX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFJORyBjbG9jayBkaXZpc2lvbiBmYWN0b3IuCisgICogQHJldHZhbCBUaGUgZGl2aXNpb24gZmFjdG9yIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS19ESVYxICAgUk5HIENsb2NrIG5vdCBkaXZpZGVkCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS19ESVYyICAgUk5HIENsb2NrIGRpdmlkZWQgYnkgMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19STkdDTEtfRElWNCAgIFJORyBDbG9jayBkaXZpZGVkIGJ5IDQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUk5HQ0xLX0RJVjggICBSTkcgQ2xvY2sgZGl2aWRlZCBieSA4CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUk5HX0RJVigpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdESVYpKSkKKyNlbmRpZiAvKiBSTkcgKi8KKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBBREMgaW50ZXJmYWNlIGNsb2NrCisgICogQHBhcmFtICBfX0FEQ19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEFEQyBkaWdpdGFsIGludGVyZmFjZSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfUExMQURDIFBMTCAiUCIgKFBMTEFEQykgQ2xvY2sgc2VsZWN0ZWQgYXMgQURDIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQ0NMS1NPVVJDRV9TWVNDTEsgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfSFNJIEhTSSBDbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19DT05GSUcoX19BRENfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0FEQ1NFTCwgKHVpbnQzMl90KShfX0FEQ19DTEtTT1VSQ0VfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgQURDIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDQ0xLU09VUkNFX1BMTEFEQyBQTEwgIlAiIChQTExBREMpIENsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfU1lTQ0xLIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDQ0xLU09VUkNFX0hTSSBIU0kgQ2xvY2sgc2VsZWN0ZWQgYXMgQURDIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfQURDX1NPVVJDRSgpICgodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9BRENTRUwpKSkKKworI2lmIChSQ0NfQ0NJUFJfVElNMVNFTCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMSBpbnRlcmZhY2UgY2xvY2sKKyAgKiBAcGFyYW0gIF9fVElNMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFRJTTEgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS1NPVVJDRV9QTEwgUExMUSBPdXRwdXQgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLU09VUkNFX1BDTEsxIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBUSU0xIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NPTkZJRyhfX1RJTTFfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1RJTTFTRUwsICh1aW50MzJfdCkoX19USU0xX0NMS1NPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBUSU0xIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMUNMS1NPVVJDRV9QTEwgUExMUSBPdXRwdXQgQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19USU0xQ0xLU09VUkNFX1BDTEsxICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1RJTTFfU09VUkNFKCkgKCh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1RJTTFTRUwpKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMVNFTCAqLworCisjaWYgKFJDQ19DQ0lQUl9USU0xNVNFTCkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVElNMTUgaW50ZXJmYWNlIGNsb2NrCisgICogQHBhcmFtICBfX1RJTTE1X0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgVElNMTUgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUkNDX1RJTTE1Q0xLU09VUkNFX1BMTCBQTExRIE91dHB1dCBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBSQ0NfVElNMTVDTEtTT1VSQ0VfUENMSzEgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBUSU0xNSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVElNMTVfQ09ORklHKF9fVElNMTVfQ0xLU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1RJTTE1U0VMLCAodWludDMyX3QpKF9fVElNMTVfQ0xLU09VUkNFX18pKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFRJTTE1IGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVElNMTVDTEtTT1VSQ0VfUExMIFBMTFEgT3V0cHV0IENsb2NrIHNlbGVjdGVkIGFzIFRJTTE1IGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1RJTTE1Q0xLU09VUkNFX1BDTEsxICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgVElNMTUgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9USU0xNV9TT1VSQ0UoKSAoKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVElNMTVTRUwpKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9GbGFnc19JbnRlcnJ1cHRzX01hbmFnZW1lbnQgRmxhZ3MgSW50ZXJydXB0cyBNYW5hZ2VtZW50CisgICogQGJyaWVmIG1hY3JvcyB0byBtYW5hZ2UgdGhlIHNwZWNpZmllZCBSQ0MgRmxhZ3MgYW5kIGludGVycnVwdHMuCisgICogQHsKKyAgKi8KKworCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICAqUGVyaXBoQ2xrSW5pdCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEodWludDMyX3QgUGVyaXBoQ2xrKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfRW5hYmxlTFNDTyh1aW50MzJfdCBMU0NPU291cmNlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9EaXNhYmxlTFNDTyh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX01hY3JvcyBSQ0NFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfUkNDX0xTQ09TT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0xTQ09TT1VSQ0VfTFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MU0NPU09VUkNFX0xTRSkpCisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgIFwKKyAgICAgICAgICAgICAgICgoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSAgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgPT0gUkNDX1BFUklQSENMS19JMkMxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJTMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpICA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0yKSAgPT0gUkNDX1BFUklQSENMS19MUFRJTTIpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgID09IFJDQ19QRVJJUEhDTEtfQURDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSAgICAgPT0gUkNDX1BFUklQSENMS19STkcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0NFQykgICAgID09IFJDQ19QRVJJUEhDTEtfQ0VDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19USU0xKSAgICA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVElNMTUpICAgPT0gUkNDX1BFUklQSENMS19USU0xNSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzA3MXh4KQorI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgIFwKKyAgICAgICAgICAgICAgICgoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSAgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgID09IFJDQ19QRVJJUEhDTEtfVVNBUlQyKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgPT0gUkNDX1BFUklQSENMS19JMkMxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJTMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpICA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0yKSAgPT0gUkNDX1BFUklQSENMS19MUFRJTTIpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgID09IFJDQ19QRVJJUEhDTEtfQURDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfQ0VDKSAgICAgPT0gUkNDX1BFUklQSENMS19DRUMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1RJTTEpICAgID09IFJDQ19QRVJJUEhDTEtfVElNMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19USU0xNSkgICA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTE1KSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHMDcweHgpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgXAorICAgICAgICAgICAgICAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpICA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQyKSAgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMxKSAgICA9PSBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfQURDKSAgICAgPT0gUkNDX1BFUklQSENMS19BREMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JUQykgICAgID09IFJDQ19QRVJJUEhDTEtfUlRDKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHMDQxeHgpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgXAorICAgICAgICAgICAgICAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpICA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkgPT0gUkNDX1BFUklQSENMS19MUFVBUlQxKSB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19JMlMxKSAgICA9PSBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSAgPT0gUkNDX1BFUklQSENMS19MUFRJTTEpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMikgID09IFJDQ19QRVJJUEhDTEtfTFBUSU0yKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSAgICAgPT0gUkNDX1BFUklQSENMS19SVEMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1JORykgICAgID09IFJDQ19QRVJJUEhDTEtfUk5HKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19USU0xKSAgICA9PSBSQ0NfUEVSSVBIQ0xLX1RJTTEpKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwMzF4eCkKKyNkZWZpbmUgSVNfUkNDX1BFUklQSENMT0NLKF9fU0VMRUNUSU9OX18pICBcCisgICAgICAgICAgICAgICAoKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgPT0gUkNDX1BFUklQSENMS19JMkMxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJTMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTEpICA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0yKSAgPT0gUkNDX1BFUklQSENMS19MUFRJTTIpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgID09IFJDQ19QRVJJUEhDTEtfQURDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SVEMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVElNMSkgICAgPT0gUkNDX1BFUklQSENMS19USU0xKSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHMDMweHgpCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTE9DSyhfX1NFTEVDVElPTl9fKSAgXAorICAgICAgICAgICAgICAgKCgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19VU0FSVDEpICA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgICAgPT0gUkNDX1BFUklQSENMS19JMkMxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyUzEpICAgID09IFJDQ19QRVJJUEhDTEtfSTJTMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19BREMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSAgICAgPT0gUkNDX1BFUklQSENMS19SVEMpKQorI2VuZGlmIC8qIFNUTTMyRzA4MXh4ICovCisKKyNkZWZpbmUgSVNfUkNDX1VTQVJUMUNMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkgICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kpKQorCisjaWYgKFJDQ19DQ0lQUl9VU0FSVDJTRUwpCisjZGVmaW5lIElTX1JDQ19VU0FSVDJDTEtTT1VSQ0UoX19TT1VSQ0VfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzEpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0UpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQyU0VMICovCisKKyNpZiAoUkNDX0NDSVBSX0xQVUFSVDFTRUwpCisjZGVmaW5lIElTX1JDQ19MUFVBUlQxQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kpKQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFVBUlQxU0VMICovCisKKyNkZWZpbmUgSVNfUkNDX0kyQzFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSkgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEspICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpKQorCisjZGVmaW5lIElTX1JDQ19JMlMxQ0xLU09VUkNFKF9fU09VUkNFX18pICAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0kyUzFDTEtTT1VSQ0VfU1lTQ0xLKXx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMlMxQ0xLU09VUkNFX1BMTCkgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJTMUNMS1NPVVJDRV9IU0kpICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyUzFDTEtTT1VSQ0VfRVhUKSkKKworI2lmIChSQ0NfQ0NJUFJfTFBUSU0xU0VMKQorI2RlZmluZSBJU19SQ0NfTFBUSU0xQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKXx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJKSAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSkpCisjZW5kaWYgLyogUkNDX0NDSVBSX0xQVElNMVNFTCAqLworCisjaWYgKFJDQ19DQ0lQUl9MUFRJTTJTRUwpCisjZGVmaW5lIElTX1JDQ19MUFRJTTJDTEtTT1VSQ0UoX19TT1VSQ0VfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSzEpfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMkNMS1NPVVJDRV9MU0kpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0yQ0xLU09VUkNFX0hTSSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBUSU0yU0VMICovCisKKyNkZWZpbmUgSVNfUkNDX0FEQ0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQ0NMS1NPVVJDRV9QTExBREMpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDQ0xLU09VUkNFX1NZU0NMSykgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19BRENDTEtTT1VSQ0VfSFNJKSkKKworI2lmIGRlZmluZWQoUk5HKQorI2RlZmluZSBJU19SQ0NfUk5HQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX05PTkUpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JOR0NMS1NPVVJDRV9IU0lfRElWOCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19STkdDTEtTT1VSQ0VfU1lTQ0xLKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX1BMTCkpCisjZGVmaW5lIElTX1JDQ19STkdESVYoX19ESVZfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fRElWX18pID09IFJDQ19STkdDTEtfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX1JOR0NMS19ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfUk5HQ0xLX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19STkdDTEtfRElWOCkpCisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKENFQykKKyNkZWZpbmUgSVNfUkNDX0NFQ0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0NFQ0NMS1NPVVJDRV9IU0lfRElWNDg4KXx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19DRUNDTEtTT1VSQ0VfTFNFKSkKKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIChSQ0NfQ0NJUFJfVElNMVNFTCkKKyNkZWZpbmUgSVNfUkNDX1RJTTFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19USU0xQ0xLU09VUkNFX1BMTCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19USU0xQ0xLU09VUkNFX1BDTEsxKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMVNFTCAqLworCisjaWYgKFJDQ19DQ0lQUl9USU0xNVNFTCkKKyNkZWZpbmUgSVNfUkNDX1RJTTE1Q0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfVElNMTVDTEtTT1VSQ0VfUExMKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1RJTTE1Q0xLU09VUkNFX1BDTEsxKSkKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX1JDQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9ybmcuaCBiL0luYy9zdG0zMmcweHhfaGFsX3JuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2M2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9ybmcuaApAQCAtMCwwICsxLDM3NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfcm5nLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJORyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9STkdfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1JOR19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDQxeHgpCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HIFJORworICAqIEBicmllZiBSTkcgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlcyBSTkcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9UeXBlc19Hcm91cDEgUk5HIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIENsb2NrRXJyb3JEZXRlY3Rpb247IC8qITwgQ0VEIENsb2NrIGVycm9yIGRldGVjdGlvbiAqLworfSBSTkdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX1R5cGVzX0dyb3VwMiBSTkcgU3RhdGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9STkdfU1RBVEVfUkVTRVQgICAgID0gMHgwMFUsICAvKiE8IFJORyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICovCisgIEhBTF9STkdfU1RBVEVfUkVBRFkgICAgID0gMHgwMVUsICAvKiE8IFJORyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICovCisgIEhBTF9STkdfU1RBVEVfQlVTWSAgICAgID0gMHgwMlUsICAvKiE8IFJORyBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICovCisgIEhBTF9STkdfU1RBVEVfVElNRU9VVCAgID0gMHgwM1UsICAvKiE8IFJORyB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9STkdfU1RBVEVfRVJST1IgICAgID0gMHgwNFUgICAvKiE8IFJORyBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX1JOR19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX1R5cGVzX0dyb3VwMyBSTkcgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCAgX19STkdfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgUk5HX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAqLworCisgIFJOR19Jbml0VHlwZURlZiAgICAgICAgICAgICBJbml0OyAgICAgICAgIC8qITwgUk5HIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgIC8qITwgUk5HIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8KKworICBfX0lPIEhBTF9STkdfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAvKiE8IFJORyBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyAgX19JTyAgdWludDMyX3QgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgIC8qITwgUk5HIEVycm9yIGNvZGUgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXI7IC8qITwgTGFzdCBHZW5lcmF0ZWQgUk5HIERhdGEgKi8KKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBSZWFkeURhdGFDYWxsYmFjaykoc3RydWN0IF9fUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHVpbnQzMl90IHJhbmRvbTMyYml0KTsgIC8qITwgUk5HIERhdGEgUmVhZHkgQ2FsbGJhY2sgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUk5HIEVycm9yIENhbGxiYWNrICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgTXNwIEluaXQgY2FsbGJhY2sgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgTXNwIERlSW5pdCBjYWxsYmFjayAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBSTkdfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFJORyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JOR19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDBVLCAgICAgLyohPCBSTkcgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKworICBIQUxfUk5HX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwMVUsICAgICAvKiE8IFJORyBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwMlUgICAgICAvKiE8IFJORyBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAqLworCit9IEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFJORyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwUk5HX0NhbGxiYWNrVHlwZURlZikoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gUk5HIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmICB2b2lkICgqcFJOR19SZWFkeURhdGFDYWxsYmFja1R5cGVEZWYpKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCk7ICAgLyohPCBwb2ludGVyIHRvIGFuIFJORyBEYXRhIFJlYWR5IHNwZWNpZmljIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0NvbnN0YW50cyBSTkcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzX0dyb3VwMSBSTkcgSW50ZXJydXB0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSTkdfSVRfRFJEWSAgUk5HX1NSX0RSRFkgIC8qITwgRGF0YSBSZWFkeSBpbnRlcnJ1cHQgICovCisjZGVmaW5lIFJOR19JVF9DRUkgICBSTkdfU1JfQ0VJUyAgLyohPCBDbG9jayBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUk5HX0lUX1NFSSAgIFJOR19TUl9TRUlTICAvKiE8IFNlZWQgZXJyb3IgaW50ZXJydXB0ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzX0dyb3VwMiBSTkcgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUk5HX0ZMQUdfRFJEWSAgIFJOR19TUl9EUkRZICAvKiE8IERhdGEgcmVhZHkgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJOR19GTEFHX0NFQ1MgICBSTkdfU1JfQ0VDUyAgLyohPCBDbG9jayBlcnJvciBjdXJyZW50IHN0YXR1cyAqLworI2RlZmluZSBSTkdfRkxBR19TRUNTICAgUk5HX1NSX1NFQ1MgIC8qITwgU2VlZCBlcnJvciBjdXJyZW50IHN0YXR1cyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0NvbnN0YW50c19Hcm91cDMgUk5HIENsb2NrIEVycm9yIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJOR19DRURfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDBVIC8qITwgQ2xvY2sgZXJyb3IgZGV0ZWN0aW9uIEVuYWJsZWQgICovCisjZGVmaW5lIFJOR19DRURfRElTQUJMRSAgICAgICAgIFJOR19DUl9DRUQgIC8qITwgQ2xvY2sgZXJyb3IgZGV0ZWN0aW9uIERpc2FibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FcnJvcl9EZWZpbml0aW9uICAgUk5HIEVycm9yIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSAgSEFMX1JOR19FUlJPUl9OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lICBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgMHgwMDAwMDAwMVUgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2RlZmluZSAgSEFMX1JOR19FUlJPUl9USU1FT1VUICAgICAgICAgIDB4MDAwMDAwMDJVICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX01hY3JvcyBSTkcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBSTkcgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1JOR19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUk5HX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVTRVQpCisjZW5kaWYgLypVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBSTkcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgUk5HX0NSX1JOR0VOKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBSTkcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gflJOR19DUl9STkdFTikKKworLyoqCisgICogQGJyaWVmICBDaGVjayB0aGUgc2VsZWN0ZWQgUk5HIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBSTkcgZmxhZworICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJOR19GTEFHX0RSRFk6ICBEYXRhIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIFJOR19GTEFHX0NFQ1M6ICBDbG9jayBlcnJvciBjdXJyZW50IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBSTkdfRkxBR19TRUNTOiAgU2VlZCBlcnJvciBjdXJyZW50IHN0YXR1cworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhcnMgdGhlIHNlbGVjdGVkIFJORyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gUk5HIGZsYWcgdG8gY2xlYXIKKyAgKiBAbm90ZSAgIFdBUk5JTkc6IFRoaXMgaXMgYSBkdW1teSBtYWNybyBmb3IgSEFMIGNvZGUgYWxpZ25tZW50LAorICAqICAgICAgICAgZmxhZ3MgUk5HX0ZMQUdfRFJEWSwgUk5HX0ZMQUdfQ0VDUyBhbmQgUk5HX0ZMQUdfU0VDUyBhcmUgcmVhZC1vbmx5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgICAgLyogZHVtbXkgIG1hY3JvICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgUk5HIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0VOQUJMRV9JVChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIFJOR19DUl9JRSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlcyB0aGUgUk5HIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUk5HX0RJU0FCTEVfSVQoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH5STkdfQ1JfSUUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSTkcgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSTkcgaW50ZXJydXB0IHN0YXR1cyBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0lUX0RSRFk6IERhdGEgcmVhZHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFJOR19JVF9DRUk6IENsb2NrIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSTkdfSVRfU0VJOiBTZWVkIGVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9STkdfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUk5HIGludGVycnVwdCBzdGF0dXMgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSTkcgaW50ZXJydXB0IHN0YXR1cyBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJOR19JVF9DRUk6IENsb2NrIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBSTkdfSVRfU0VJOiBTZWVkIGVycm9yIGludGVycnVwdAorICAqIEBub3RlICAgUk5HX0lUX0RSRFkgZmxhZyBpcyByZWFkLW9ubHksIHJlYWRpbmcgUk5HX0RSIHJlZ2lzdGVyIGF1dG9tYXRpY2FsbHkgY2xlYXJzIFJOR19JVF9EUkRZLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zIFJORyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX0luaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19EZUluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX01zcEluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX01zcERlSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCBIQUxfUk5HX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBSTkdfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1VuUmVnaXN0ZXJDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19SZWdpc3RlclJlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCBwUk5HX1JlYWR5RGF0YUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgdWludDMyX3QgKnJhbmRvbTMyYml0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfR2VuZXJhdGVSYW5kb21OdW1iZXJfSVQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordWludDMyX3QgSEFMX1JOR19SZWFkTGFzdFJhbmRvbU51bWJlcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7CisKK3ZvaWQgSEFMX1JOR19JUlFIYW5kbGVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKK3ZvaWQgSEFMX1JOR19FcnJvckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKK3ZvaWQgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgdWludDMyX3QgcmFuZG9tMzJiaXQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9STkdfU3RhdGVUeXBlRGVmIEhBTF9STkdfR2V0U3RhdGUoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordWludDMyX3QgICAgICAgICAgICAgSEFMX1JOR19HZXRFcnJvcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSTkdfUHJpdmF0ZV9NYWNyb3MgUk5HIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUk5HX0lUKElUKSAoKChJVCkgPT0gUk5HX0lUX0NFSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAoKElUKSA9PSBSTkdfSVRfU0VJKSkKKworI2RlZmluZSBJU19STkdfRkxBRyhGTEFHKSAoKChGTEFHKSA9PSBSTkdfRkxBR19EUkRZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBSTkdfRkxBR19DRUNTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFHKSA9PSBSTkdfRkxBR19TRUNTKSkKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIFJORyBDbG9jayBFcnJvciBEZXRlY3Rpb24gbW9kZS4KKyAgKiBAcGFyYW0gX19NT0RFX18gUk5HIENsb2NrIEVycm9yIERldGVjdGlvbiBtb2RlCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfUk5HX0NFRChfX01PREVfXykgICAoKChfX01PREVfXykgPT0gUk5HX0NFRF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gUk5HX0NFRF9ESVNBQkxFKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfUk5HX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3J0Yy5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyMjU2YwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfaGFsX3J0Yy5oCkBAIC0wLDAgKzEsOTYxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1JUQ19ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQyBSVEMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfVHlwZXMgUlRDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JUQ19TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBSVEMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfUlRDX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IFJUQyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICovCisgIEhBTF9SVENfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgUlRDIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBSVEMgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfUlRDX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHgwNFUgICAvKiE8IFJUQyBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICovCisKK31IQUxfUlRDU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBIb3VyRm9ybWF0OyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBIb3VyIEZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0hvdXJfRm9ybWF0cyAqLworCisgIHVpbnQzMl90IEFzeW5jaFByZWRpdjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFzeW5jaHJvbm91cyBQcmVkaXZpZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDdGICovCisKKyAgdWludDMyX3QgU3luY2hQcmVkaXY7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgU3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RkZGICovCisKKyAgdWludDMyX3QgT3V0UHV0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIHNpZ25hbCB3aWxsIGJlIHJvdXRlZCB0byB0aGUgUlRDIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfT3V0cHV0X3NlbGVjdGlvbl9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IE91dFB1dFJlbWFwOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcmVtYXAgZm9yIFJUQyBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmICBSVENfT3V0cHV0X0FMQVJNX09VVF9SZW1hcCAqLworCisgIHVpbnQzMl90IE91dFB1dFBvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIG91dHB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19PdXRwdXRfUG9sYXJpdHlfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBPdXRQdXRUeXBlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBPdXRwdXQgUGluIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19PdXRwdXRfVHlwZV9BTEFSTV9PVVQgKi8KKworICB1aW50MzJfdCBPdXRQdXRQdWxsVXA7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBPdXRwdXQgUHVsbC1VcCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfT3V0cHV0X1B1bGxVcF9BTEFSTV9PVVQgKi8KK31SVENfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIFRpbWUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4X3QgSG91cnM7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIEhvdXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEyIGlmIHRoZSBSVENfSG91ckZvcm1hdF8xMiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjMgaWYgdGhlIFJUQ19Ib3VyRm9ybWF0XzI0IGlzIHNlbGVjdGVkICovCisKKyAgdWludDhfdCBNaW51dGVzOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgTWludXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNTkgKi8KKworICB1aW50OF90IFNlY29uZHM7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBTZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OSAqLworCisgIHVpbnQ4X3QgVGltZUZvcm1hdDsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBTS9QTSBUaW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQU1fUE1fRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBTdWJTZWNvbmRzOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQ19TU1IgUlRDIFN1YiBTZWNvbmQgcmVnaXN0ZXIgY29udGVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNvcnJlc3BvbmRzIHRvIGEgdGltZSB1bml0IHJhbmdlIGJldHdlZW4gWzAtMV0gU2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFsxIFNlYyAvIFNlY29uZEZyYWN0aW9uICsxXSBncmFudWxhcml0eSAqLworCisgIHVpbnQzMl90IFNlY29uZEZyYWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIHJhbmdlIG9yIGdyYW51bGFyaXR5IG9mIFN1YiBTZWNvbmQgcmVnaXN0ZXIgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byBTeW5jaHJvbm91cyBwcmUtc2NhbGVyIGZhY3RvciB2YWx1ZSAoUFJFRElWX1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjb3JyZXNwb25kcyB0byBhIHRpbWUgdW5pdCByYW5nZSBiZXR3ZWVuIFswLTFdIFNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBbMSBTZWMgLyBTZWNvbmRGcmFjdGlvbiArMV0gZ3JhbnVsYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIHdpbGwgYmUgdXNlZCBvbmx5IGJ5IEhBTF9SVENfR2V0VGltZSBmdW5jdGlvbiAqLworCisgIHVpbnQzMl90IERheUxpZ2h0U2F2aW5nOyAgLyohPCBTcGVjaWZpZXMgUlRDX0RheUxpZ2h0U2F2ZU9wZXJhdGlvbjogdGhlIHZhbHVlIG9mIGhvdXIgYWRqdXN0bWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0RheUxpZ2h0U2F2aW5nX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgU3RvcmVPcGVyYXRpb247ICAvKiE8IFNwZWNpZmllcyBSVENfU3RvcmVPcGVyYXRpb24gdmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgQktQIGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ1IgcmVnaXN0ZXIgdG8gc3RvcmUgdGhlIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX1N0b3JlT3BlcmF0aW9uX0RlZmluaXRpb25zICovCit9UlRDX1RpbWVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBEYXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IFdlZWtEYXk7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBNb250aDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIE1vbnRoIChpbiBCQ0QgZm9ybWF0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19Nb250aF9EYXRlX0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBEYXRlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzEgKi8KKworICB1aW50OF90IFllYXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgWWVhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDk5ICovCisKK31SVENfRGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIEFsYXJtIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBSVENfVGltZVR5cGVEZWYgQWxhcm1UaW1lOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBUaW1lIG1lbWJlcnMgKi8KKworICB1aW50MzJfdCBBbGFybU1hc2s7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBNYXNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1NYXNrX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgQWxhcm1TdWJTZWNvbmRNYXNrOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gU3ViU2Vjb25kcyBNYXNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1fU3ViX1NlY29uZHNfTWFza3NfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBBbGFybURhdGVXZWVrRGF5U2VsOyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBpcyBvbiBEYXRlIG9yIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1EYXRlV2Vla0RheV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQ4X3QgQWxhcm1EYXRlV2Vla0RheTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIERhdGUvV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIEFsYXJtIERhdGUgaXMgc2VsZWN0ZWQsIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIGEgdmFsdWUgaW4gdGhlIDEtMzEgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBBbGFybSBXZWVrRGF5IGlzIHNlbGVjdGVkLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgQWxhcm07ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhbGFybSAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtc19EZWZpbml0aW9ucyAqLworfVJUQ19BbGFybVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIFJUQ19UeXBlRGVmICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIFRhbXBPZmZzZXQ7IC8qITwgT2Zmc2V0IHRvIFRBTVAgaW5zdGFuY2UgICovCisKKyAgUlRDX0luaXRUeXBlRGVmICAgICAgICAgICBJbml0OyAgICAgICAvKiE8IFJUQyByZXF1aXJlZCBwYXJhbWV0ZXJzICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgTG9jazsgICAgICAgLyohPCBSVEMgbG9ja2luZyBvYmplY3QgICAgICAgKi8KKworICBfX0lPIEhBTF9SVENTdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgIC8qITwgVGltZSBjb21tdW5pY2F0aW9uIHN0YXRlICovCisKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgICgqIEFsYXJtQUV2ZW50Q2FsbGJhY2spICAgICAgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgICAgICAgICAgLyohPCBSVEMgQWxhcm0gQSBFdmVudCBjYWxsYmFjayAgICAgICAgICAgICovCisKKyAgdm9pZCAgKCogQWxhcm1CRXZlbnRDYWxsYmFjaykgICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAgICAgICAgICAvKiE8IFJUQyBBbGFybSBCIEV2ZW50IGNhbGxiYWNrICAgICAgICAgICAgKi8KKworICB2b2lkICAoKiBUaW1lU3RhbXBFdmVudENhbGxiYWNrKSAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgICAgICAgICAgIC8qITwgUlRDIFRpbWVTdGFtcCBFdmVudCBjYWxsYmFjayAgICAgICAgICAqLworCisgIHZvaWQgICgqIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjaykgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgICAgICAgICAgLyohPCBSVEMgV2FrZVVwVGltZXIgRXZlbnQgY2FsbGJhY2sgICAgICAgICovCisKKyAgdm9pZCAgKCogVGFtcGVyMUV2ZW50Q2FsbGJhY2spICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAgICAgICAgICAvKiE8IFJUQyBUYW1wZXIgMSBFdmVudCBjYWxsYmFjayAgICAgICAgICAgKi8KKworICB2b2lkICAoKiBUYW1wZXIyRXZlbnRDYWxsYmFjaykgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgICAgICAgICAgIC8qITwgUlRDIFRhbXBlciAyIEV2ZW50IGNhbGxiYWNrICAgICAgICAgICAqLworCisKKyAgdm9pZCAgKCogSW50ZXJuYWxUYW1wZXIzRXZlbnRDYWxsYmFjaykgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgICAvKiE8IFJUQyBJbnRlcm5hbCBUYW1wZXIgMyBFdmVudCBjYWxsYmFjayAgKi8KKworICB2b2lkICAoKiBJbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrKSAgICAgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgIC8qITwgUlRDIEludGVybmFsIFRhbXBlciA0IEV2ZW50IGNhbGxiYWNrICAqLworCisgIHZvaWQgICgqIEludGVybmFsVGFtcGVyNUV2ZW50Q2FsbGJhY2spICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAgLyohPCBSVEMgSW50ZXJuYWwgVGFtcGVyIDUgRXZlbnQgY2FsbGJhY2sgICovCisKKyAgdm9pZCAgKCogSW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjaykgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgICAvKiE8IFJUQyBJbnRlcm5hbCBUYW1wZXIgNiBFdmVudCBjYWxsYmFjayAgKi8KKworCisgIHZvaWQgICgqIE1zcEluaXRDYWxsYmFjaykgICAgICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAgLyohPCBSVEMgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisKKyAgdm9pZCAgKCogTXNwRGVJbml0Q2FsbGJhY2spICAgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgICAvKiE8IFJUQyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgKi8KKworI2VuZGlmIC8qIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MpICovCisKK31SVENfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIExQVElNIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfUlRDX0FMQVJNX0FfRVZFTlRfQ0JfSUQgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgUlRDIEFsYXJtIEEgRXZlbnQgQ2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfUlRDX0FMQVJNX0JfRVZFTlRfQ0JfSUQgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgUlRDIEFsYXJtIEIgRXZlbnQgQ2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfUlRDX1RJTUVTVEFNUF9FVkVOVF9DQl9JRCAgICAgICAgID0gMHgwMlUsICAgIC8qITwgUlRDIFRpbWVTdGFtcCBFdmVudCBDYWxsYmFjayBJRCAgICAqLworICBIQUxfUlRDX1dBS0VVUFRJTUVSX0VWRU5UX0NCX0lEICAgICAgID0gMHgwM1UsICAgIC8qITwgUlRDIFdha2VVcCBUaW1lciBFdmVudCBDYWxsYmFjayBJRCAqLworICBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgUlRDIFRhbXBlciAxIENhbGxiYWNrIElEICAgICAgICAgICAqLworICBIQUxfUlRDX1RBTVBFUjJfRVZFTlRfQ0JfSUQgICAgICAgICAgID0gMHgwNVUsICAgIC8qITwgUlRDIFRhbXBlciAyIENhbGxiYWNrIElEICAgICAgICAgICAqLworICBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjNfRVZFTlRfQ0JfSUQgID0gMHgwOVUsICAgIC8qITwgUlRDIEludGVybmFsIFRhbXBlciAzIENhbGxiYWNrIElEICAqLworICBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjRfRVZFTlRfQ0JfSUQgID0gMHgwQVUsICAgIC8qITwgUlRDIEludGVybmFsIFRhbXBlciA0IENhbGxiYWNrIElEICAqLworICBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjVfRVZFTlRfQ0JfSUQgID0gMHgwQlUsICAgIC8qITwgUlRDIEludGVybmFsIFRhbXBlciA1IENhbGxiYWNrIElEICAqLworICBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjZfRVZFTlRfQ0JfSUQgID0gMHgwQ1UsICAgIC8qITwgUlRDIEludGVybmFsIFRhbXBlciA2IENhbGxiYWNrIElEICAqLworICBIQUxfUlRDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwRVUsICAgIC8qITwgUlRDIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAqLworICBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwRlUgICAgIC8qITwgUlRDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAqLworfUhBTF9SVENfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFJUQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwUlRDX0NhbGxiYWNrVHlwZURlZikoUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgLyohPCBwb2ludGVyIHRvIGFuIFJUQyBjYWxsYmFjayBmdW5jdGlvbiAqLworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfQ29uc3RhbnRzIFJUQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19Ib3VyX0Zvcm1hdHMgUlRDIEhvdXIgRm9ybWF0cworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUXzI0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1CisjZGVmaW5lIFJUQ19IT1VSRk9STUFUXzEyICAgICAgICAgICAgICAgICAgIFJUQ19DUl9GTVQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfT3V0cHV0X3NlbGVjdGlvbl9EZWZpbml0aW9ucyBSVENFeCBPdXRwdXQgU2VsZWN0aW9uIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX0RJU0FCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfT1VUUFVUX0FMQVJNQSAgICAgICAgICAgICAgICAgICBSVENfQ1JfT1NFTF8wCisjZGVmaW5lIFJUQ19PVVRQVVRfQUxBUk1CICAgICAgICAgICAgICAgICAgIFJUQ19DUl9PU0VMXzEKKyNkZWZpbmUgUlRDX09VVFBVVF9XQUtFVVAgICAgICAgICAgICAgICAgICAgUlRDX0NSX09TRUwKKyNkZWZpbmUgUlRDX09VVFBVVF9UQU1QRVIgICAgICAgICAgICAgICAgICAgUlRDX0NSX1RBTVBPRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1BvbGFyaXR5X0RlZmluaXRpb25zIFJUQyBPdXRwdXQgUG9sYXJpdHkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfT1VUUFVUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICBSVENfQ1JfUE9MCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19PdXRwdXRfVHlwZV9BTEFSTV9PVVQgUlRDIE91dHB1dCBUeXBlIEFMQVJNIE9VVAorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19PVVRQVVRfVFlQRV9QVVNIUFVMTCAgICAgICAgICAgIDB4MDAwMDAwMDB1CisjZGVmaW5lIFJUQ19PVVRQVVRfVFlQRV9PUEVORFJBSU4gICAgICAgICAgIFJUQ19DUl9UQU1QQUxSTV9UWVBFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19PdXRwdXRfUHVsbFVwX0FMQVJNX09VVCBSVEMgT3V0cHV0IFB1bGwtVXAgQUxBUk0gT1VUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX09VVFBVVF9QVUxMVVBfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgUlRDX09VVFBVVF9QVUxMVVBfT04gICAgICAgICAgICAgICAgUlRDX0NSX1RBTVBBTFJNX1BVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19PdXRwdXRfQUxBUk1fT1VUX1JlbWFwIFJUQyBPdXRwdXQgQUxBUk0gT1VUIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9OT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QT1MxICAgICAgICAgICAgICAgUlRDX0NSX09VVDJFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfQU1fUE1fRGVmaW5pdGlvbnMgUlRDIEFNIFBNIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0hPVVJGT1JNQVQxMl9BTSAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBSVENfSE9VUkZPUk1BVDEyX1BNICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHg0MFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19EYXlMaWdodFNhdmluZ19EZWZpbml0aW9ucyBSVEMgRGF5TGlnaHRTYXZpbmcgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfREFZTElHSFRTQVZJTkdfU1VCMUggICAgICAgICAgICBSVENfQ1JfU1VCMUgKKyNkZWZpbmUgUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIICAgICAgICAgICAgUlRDX0NSX0FERDFICisjZGVmaW5lIFJUQ19EQVlMSUdIVFNBVklOR19OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDB1CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19TdG9yZU9wZXJhdGlvbl9EZWZpbml0aW9ucyBSVEMgU3RvcmVPcGVyYXRpb24gRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU1RPUkVPUEVSQVRJT05fUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfU1RPUkVPUEVSQVRJT05fU0VUICAgICAgICAgICAgICBSVENfQ1JfQktQCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19JbnB1dF9wYXJhbWV0ZXJfZm9ybWF0X2RlZmluaXRpb25zIFJUQyBJbnB1dCBQYXJhbWV0ZXIgRm9ybWF0IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0ZPUk1BVF9CSU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgUlRDX0ZPUk1BVF9CQ0QgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMXUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX01vbnRoX0RhdGVfRGVmaW5pdGlvbnMgUlRDIE1vbnRoIERhdGUgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworCisvKiBDb2RlZCBpbiBCQ0QgZm9ybWF0ICovCisjZGVmaW5lIFJUQ19NT05USF9KQU5VQVJZICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgUlRDX01PTlRIX0ZFQlJVQVJZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBSVENfTU9OVEhfTUFSQ0ggICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lIFJUQ19NT05USF9BUFJJTCAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0VSkKKyNkZWZpbmUgUlRDX01PTlRIX01BWSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBSVENfTU9OVEhfSlVORSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lIFJUQ19NT05USF9KVUxZICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkKKyNkZWZpbmUgUlRDX01PTlRIX0FVR1VTVCAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDhVKQorI2RlZmluZSBSVENfTU9OVEhfU0VQVEVNQkVSICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpCisjZGVmaW5lIFJUQ19NT05USF9PQ1RPQkVSICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDEwVSkKKyNkZWZpbmUgUlRDX01PTlRIX05PVkVNQkVSICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTFVKQorI2RlZmluZSBSVENfTU9OVEhfREVDRU1CRVIgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX1dlZWtEYXlfRGVmaW5pdGlvbnMgUlRDIFdlZWtEYXkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIFJUQ19XRUVLREFZX1RVRVNEQVkgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfV0VETkVTREFZICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSBSVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lIFJUQ19XRUVLREFZX0ZSSURBWSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfU0FUVVJEQVkgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSBSVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FsYXJtRGF0ZVdlZWtEYXlfRGVmaW5pdGlvbnMgUlRDIEFsYXJtRGF0ZVdlZWtEYXkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9XRUVLREFZICAgICBSVENfQUxSTUFSX1dEU0VMCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0FsYXJtTWFza19EZWZpbml0aW9ucyBSVEMgQWxhcm1NYXNrIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNTUFTS19OT05FICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgUlRDX0FMQVJNTUFTS19EQVRFV0VFS0RBWSAgICAgICAgICAgUlRDX0FMUk1BUl9NU0s0CisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfSE9VUlMgICAgICAgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMworI2RlZmluZSBSVENfQUxBUk1NQVNLX01JTlVURVMgICAgICAgICAgICAgICBSVENfQUxSTUFSX01TSzIKKyNkZWZpbmUgUlRDX0FMQVJNTUFTS19TRUNPTkRTICAgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfQUxMICAgICAgICAgICAgICAgICAgIChSVENfQUxBUk1NQVNLX05PTkUgfCBSVENfQUxBUk1NQVNLX0RBVEVXRUVLREFZIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX0hPVVJTIHwgUlRDX0FMQVJNTUFTS19NSU5VVEVTICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0FMQVJNTUFTS19TRUNPTkRTKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybXNfRGVmaW5pdGlvbnMgUlRDIEFsYXJtcyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTV9BICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJBRQorI2RlZmluZSBSVENfQUxBUk1fQiAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQkUKKworLyoqCisgICogQH0KKyAgKi8KKworCisgIC8qKiBAZGVmZ3JvdXAgUlRDX0FsYXJtX1N1Yl9TZWNvbmRzX01hc2tzX0RlZmluaXRpb25zIFJUQyBBbGFybSBTdWIgU2Vjb25kcyBNYXNrcyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfQUxMICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBBbGFybSBTUyBmaWVsZHMgYXJlIG1hc2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gY29tcGFyaXNvbiBvbiBzdWIgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQWxhcm0gKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEgICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6MV0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1swXSBpcyBjb21wYXJlZC4gICAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzIgICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6Ml0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1sxOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzMgICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6M10gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1syOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzQgICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6NF0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1szOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzUgICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6NV0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s0OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzYgICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6Nl0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s1OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzcgICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMikgIC8qITwgU1NbMTQ6N10gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s2OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzggICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6OF0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s3OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzkgICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6OV0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s4OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEwICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6MTBdIG5vdCB1c2VkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbOTowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMSAgICAgIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpICAvKiE8IFNTWzE0OjExXSBub3QgdXNlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzEwOjBdIGFyZSBjb21wYXJlZCAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTIgICAgICAoUlRDX0FMUk1BU1NSX01BU0tTU18yIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDoxMl0gbm90IHVzZWQgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi5Pbmx5IFNTWzExOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEzICAgICAgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMiB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykgIC8qITwgU1NbMTQ6MTNdIG5vdCB1c2VkIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMTI6MF0gYXJlIGNvbXBhcmVkICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNCAgICAgICAgIChSVENfQUxSTUFTU1JfTUFTS1NTXzEgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzIgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpICAvKiE8IFNTWzE0XSBub3QgdXNlZCBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLk9ubHkgU1NbMTM6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUgICAgICAgICBSVENfQUxSTUFTU1JfTUFTS1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDowXSBhcmUgY29tcGFyZWQgYW5kIG11c3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWN0aXZhdGUgYWxhcm0uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19JbnRlcnJ1cHRzX0RlZmluaXRpb25zIFJUQyBJbnRlcnJ1cHRzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0lUX1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1RTSUUgICAgICAgIC8qITwgRW5hYmxlIFRpbWVzdGFtcCBJbnRlcnJ1cHQgICAgKi8KKyNkZWZpbmUgUlRDX0lUX1dVVCAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1dVVElFICAgICAgIC8qITwgRW5hYmxlIFdha2V1cCB0aW1lciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlRDX0lUX0FMUkEgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkFJRSAgICAgIC8qITwgRW5hYmxlIEFsYXJtIEEgSW50ZXJydXB0ICAgICAgKi8KKyNkZWZpbmUgUlRDX0lUX0FMUkIgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkJJRSAgICAgIC8qITwgRW5hYmxlIEFsYXJtIEIgSW50ZXJydXB0ICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0ZsYWdfTWFzayAgICBSVEMgRmxhZyBNYXNrICg1Yml0cykgZGVzY3JpYmUgaW4gUlRDX0ZsYWdzX0RlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGdSAgICAgICAgLyohPCBSVEMgZmxhZ3MgbWFzayAoNWJpdHMpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19GbGFnc19EZWZpbml0aW9ucyBSVEMgRmxhZ3MgRGVmaW5pdGlvbnMKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDAwMFhYMDAwWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IGZsYWcgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogSUNTUiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBTUiBvciBTQ1Igb3IgTUlTUiBvciBTTUlTUiByZWdpc3RlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfRkxBR19SRUNBTFBGICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUgfCBSVENfSUNTUl9SRUNBTFBGX1BvcykgLyohPCBSZWNhbGlicmF0aW9uIHBlbmRpbmcgRmxhZyAqLworI2RlZmluZSBSVENfRkxBR19JTklURiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUgfCBSVENfSUNTUl9JTklURl9Qb3MpICAgLyohPCBJbml0aWFsaXphdGlvbiBmbGFnICovCisjZGVmaW5lIFJUQ19GTEFHX1JTRiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwVSB8IFJUQ19JQ1NSX1JTRl9Qb3MpICAgICAvKiE8IFJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gZmxhZyAqLworI2RlZmluZSBSVENfRkxBR19JTklUUyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUgfCBSVENfSUNTUl9JTklUU19Qb3MpICAgLyohPCBJbml0aWFsaXphdGlvbiBzdGF0dXMgZmxhZyAqLworI2RlZmluZSBSVENfRkxBR19TSFBGICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUgfCBSVENfSUNTUl9TSFBGX1BvcykgICAgLyohPCBTaGlmdCBvcGVyYXRpb24gcGVuZGluZyBmbGFnICovCisjZGVmaW5lIFJUQ19GTEFHX1dVVFdGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwVSB8IFJUQ19JQ1NSX1dVVFdGX1BvcykgICAvKiE8IFdha2V1cCB0aW1lciB3cml0ZSBmbGFnICovCisjZGVmaW5lIFJUQ19GTEFHX0FMUkJXRiAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwVSB8IFJUQ19JQ1NSX0FMUkJXRl9Qb3MpICAvKiE8IEFsYXJtIEIgd3JpdGUgZmxhZyAqLworI2RlZmluZSBSVENfRkxBR19BTFJBV0YgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFUgfCBSVENfSUNTUl9BTFJBV0ZfUG9zKSAgLyohPCBBbGFybSBBIHdyaXRlIGZsYWcgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfSVRTRiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVIHwgUlRDX1NSX0lUU0ZfUG9zKSAgICAgIC8qITwgSW50ZXJuYWwgVGltZS1zdGFtcCBmbGFnICovCisjZGVmaW5lIFJUQ19GTEFHX1RTT1ZGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMjAwVSB8IFJUQ19TUl9UU09WRl9Qb3MpICAgICAvKiE8IFRpbWUtc3RhbXAgb3ZlcmZsb3cgZmxhZyAqLworI2RlZmluZSBSVENfRkxBR19UU0YgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMFUgfCBSVENfU1JfVFNGX1BvcykgICAgICAgLyohPCBUaW1lLXN0YW1wIGZsYWcgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfV1VURiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVIHwgUlRDX1NSX1dVVEZfUG9zKSAgICAgIC8qITwgV2FrZXVwIHRpbWVyIGZsYWcgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfQUxSQkYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVIHwgUlRDX1NSX0FMUkJGX1BvcykgICAgIC8qITwgQWxhcm0gQiBmbGFnICovCisjZGVmaW5lIFJUQ19GTEFHX0FMUkFGICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMjAwVSB8IFJUQ19TUl9BTFJBRl9Qb3MpICAgICAvKiE8IEFsYXJtIEEgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfQ2xlYXJfRmxhZ3NfRGVmaW5pdGlvbnMgUlRDIENsZWFyIEZsYWdzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0NMRUFSX0lUU0YgICAgICAgICAgICAgICAgICAgICAgUlRDX1NDUl9DSVRTRiAgICAvKiE8IENsZWFyIEludGVybmFsIFRpbWUtc3RhbXAgZmxhZyAqLworI2RlZmluZSBSVENfQ0xFQVJfVFNPVkYgICAgICAgICAgICAgICAgICAgICBSVENfU0NSX0NUU09WRiAgIC8qITwgQ2xlYXIgVGltZS1zdGFtcCBvdmVyZmxvdyBmbGFnICovCisjZGVmaW5lIFJUQ19DTEVBUl9UU0YgICAgICAgICAgICAgICAgICAgICAgIFJUQ19TQ1JfQ1RTRiAgICAgLyohPCBDbGVhciBUaW1lLXN0YW1wIGZsYWcgKi8KKyNkZWZpbmUgUlRDX0NMRUFSX1dVVEYgICAgICAgICAgICAgICAgICAgICAgUlRDX1NDUl9DV1VURiAgICAvKiE8IENsZWFyIFdha2V1cCB0aW1lciBmbGFnICovCisjZGVmaW5lIFJUQ19DTEVBUl9BTFJCRiAgICAgICAgICAgICAgICAgICAgIFJUQ19TQ1JfQ0FMUkJGICAgLyohPCBDbGVhciBBbGFybSBCIGZsYWcgKi8KKyNkZWZpbmUgUlRDX0NMRUFSX0FMUkFGICAgICAgICAgICAgICAgICAgICAgUlRDX1NDUl9DQUxSQUYgICAvKiE8IENsZWFyIEFsYXJtIEEgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX01hY3JvcyBSVEMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBSVEMgaGFuZGxlIHN0YXRlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9SVENfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pIGRve1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUlRDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVTRVQpCisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPldQUiA9IDB4Q0FVOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5XUFIgPSAweDUzVTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+V1BSID0gMHhGRlU7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEFkZCAxIGhvdXIgKHN1bW1lciB0aW1lIGNoYW5nZSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQktQX18gQmFja3VwCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX1NUT1JFT1BFUkFUSU9OX1JFU0VUCisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX1NUT1JFT1BFUkFUSU9OX1NFVAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfREFZTElHSFRfU0FWSU5HX1RJTUVfQUREMUgoX19IQU5ETEVfXywgX19CS1BfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIFJUQ19DUl9BREQxSCk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIFJUQ19DUl9CS1AgLCAoX19CS1BfXykpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApOworCisvKioKKyAgKiBAYnJpZWYgIFN1YnRyYWN0IDEgaG91ciAod2ludGVyIHRpbWUgY2hhbmdlKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19CS1BfXyBCYWNrdXAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfU1RPUkVPUEVSQVRJT05fUkVTRVQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfU1RPUkVPUEVSQVRJT05fU0VUCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19EQVlMSUdIVF9TQVZJTkdfVElNRV9TVUIxSChfX0hBTkRMRV9fLCBfX0JLUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgUlRDX0NSX1NVQjFIKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgUlRDX0NSX0JLUCAsIChfX0JLUF9fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCk7CisKKyAvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIEFMQVJNQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUFfRU5BQkxFKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9BTFJBRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIEFMQVJNQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX0FMUkFFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBTEFSTUIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1CX0VOQUJMRShfX0hBTkRMRV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX0FMUkJFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgQUxBUk1CIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfQUxSQkUpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIEFsYXJtIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9BTFJBIEFsYXJtIEEgaW50ZXJydXB0LCBAcmVmIFJUQ19JbnRlcnJ1cHRzX0RlZmluaXRpb25zCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9BTFJCIEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0lUX0FMUkEgQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfQUxSQiBBbGFybSBCIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9BTFJBIEFsYXJtIEEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0lUX0FMUkIgQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpJiAoKF9fSU5URVJSVVBUX18pPj4gMTJVKSkgIT0gMFUpPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0gaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9BTFJBIEFsYXJtIEEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0lUX0FMUkIgQWxhcm0gQiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgQWxhcm1zIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBGbGFnIHNvdXJjZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0ZMQUdfQUxSQUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19BTFJCRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0FMUkFXRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0FMUkJXRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgKF9fSEFMX1JUQ19HRVRfRkxBRygoX19IQU5ETEVfXyksIChfX0ZMQUdfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgQWxhcm1zIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIEZsYWcgc291cmNlcyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0FMUkFGCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0FMUkJGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICgoKF9fRkxBR19fKSA9PSBSVENfRkxBR19BTFJBRikgPyAoX19IQUxfUlRDX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBSVENfQ0xFQVJfQUxSQUYpKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTF9SVENfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFJUQ19DTEVBUl9BTFJCRikpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAoRVhUSS0+SU1SMSB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgKEVYVEktPklNUjEgJj0gfihSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXZlbnQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgKEVYVEktPkVNUjEgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICAoRVhUSS0+RU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFJUQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9ydGNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9ucyBSVEMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0luaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19EZUluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworCit2b2lkIEhBTF9SVENfTXNwSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkIEhBTF9SVENfTXNwRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIEhBTF9SVENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFJUQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfVW5SZWdpc3RlckNhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUlRDIFRpbWUgYW5kIERhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldERhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19EYXRlVHlwZURlZiAqc0RhdGUsIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldERhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19EYXRlVHlwZURlZiAqc0RhdGUsIHVpbnQzMl90IEZvcm1hdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFJUQyBBbGFybSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUlRDIEFsYXJtIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0QWxhcm0oUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19BbGFybVR5cGVEZWYgKnNBbGFybSwgdWludDMyX3QgRm9ybWF0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfU2V0QWxhcm1fSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19BbGFybVR5cGVEZWYgKnNBbGFybSwgdWludDMyX3QgRm9ybWF0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVhY3RpdmF0ZUFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBBbGFybSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEFsYXJtLCB1aW50MzJfdCBGb3JtYXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19Qb2xsRm9yQWxhcm1BRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfSGFuZGxlVHlwZURlZiogaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfUlRDU3RhdGVUeXBlRGVmIEhBTF9SVENfR2V0U3RhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9Db25zdGFudHMgUlRDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIE1hc2tzIERlZmluaXRpb24gKi8KKyNkZWZpbmUgUlRDX1RSX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgKFJUQ19UUl9QTSB8IFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RSX01OVCB8IFJUQ19UUl9NTlV8IFJUQ19UUl9TVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RSX1NVKQorI2RlZmluZSBSVENfRFJfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAoUlRDX0RSX1lUIHwgUlRDX0RSX1lVIHwgUlRDX0RSX1dEVSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0RSX01UIHwgUlRDX0RSX01VIHwgUlRDX0RSX0RUICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0RSX0RVKQorI2RlZmluZSBSVENfSU5JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGdQorI2RlZmluZSBSVENfUlNGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAofihSVENfSUNTUl9JTklUIHwgUlRDX0lDU1JfUlNGKSkKKworI2RlZmluZSBSVENfVElNRU9VVF9WQUxVRSAgICAgICAgICAgICAgICAgICAxMDAwdQorCisjZGVmaW5lIFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQgICAgICAgICAgIEVYVElfSU1SMV9JTTE5ICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE5IENvbm5lY3RlZCB0byB0aGUgUlRDIEFsYXJtIGV2ZW50ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX01hY3JvcyBSVEMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19JU19SVENfRGVmaW5pdGlvbnMgUlRDIFByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBJU19SVENfT1VUUFVUKE9VVFBVVCkgKCgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFJUQ19PVVRQVVRfQUxBUk1BKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9BTEFSTUIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX1dBS0VVUCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFJUQ19PVVRQVVRfVEFNUEVSKSkKKworI2RlZmluZSBJU19SVENfSE9VUl9GT1JNQVQoRk9STUFUKSAgICAgKCgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8yNCkpCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVF9QT0woUE9MKSAoKChQT0wpID09IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTCkgPT0gUlRDX09VVFBVVF9QT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfVFlQRShUWVBFKSAoKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfUFVTSFBVTEwpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfUFVMTFVQKFRZUEUpICgoKFRZUEUpID09IFJUQ19PVVRQVVRfUFVMTFVQX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gUlRDX09VVFBVVF9QVUxMVVBfT04pKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfUkVNQVAoUkVNQVApICAgKCgoUkVNQVApID09IFJUQ19PVVRQVVRfUkVNQVBfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQKSA9PSBSVENfT1VUUFVUX1JFTUFQX1BPUzEpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSRk9STUFUMTIoUE0pICAoKChQTSkgPT0gUlRDX0hPVVJGT1JNQVQxMl9BTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE0pID09IFJUQ19IT1VSRk9STUFUMTJfUE0pKQorCisjZGVmaW5lIElTX1JUQ19EQVlMSUdIVF9TQVZJTkcoU0FWRSkgKCgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX1NVQjFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX05PTkUpKQorCisjZGVmaW5lIElTX1JUQ19TVE9SRV9PUEVSQVRJT04oT1BFUkFUSU9OKSAoKChPUEVSQVRJT04pID09IFJUQ19TVE9SRU9QRVJBVElPTl9SRVNFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1BFUkFUSU9OKSA9PSBSVENfU1RPUkVPUEVSQVRJT05fU0VUKSkKKworI2RlZmluZSBJU19SVENfRk9STUFUKEZPUk1BVCkgKCgoRk9STUFUKSA9PSBSVENfRk9STUFUX0JJTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBSVENfRk9STUFUX0JDRCkpCisKKyNkZWZpbmUgSVNfUlRDX1lFQVIoWUVBUikgICAgICAgICAgICAgICgoWUVBUikgPD0gOTl1KQorCisjZGVmaW5lIElTX1JUQ19NT05USChNT05USCkgICAgICAgICAgICAoKChNT05USCkgPj0gMXUpICYmICgoTU9OVEgpIDw9IDEydSkpCisKKyNkZWZpbmUgSVNfUlRDX0RBVEUoREFURSkgICAgICAgICAgICAgICgoKERBVEUpID49IDF1KSAmJiAoKERBVEUpIDw9IDMxdSkpCisKKyNkZWZpbmUgSVNfUlRDX1dFRUtEQVkoV0VFS0RBWSkgKCgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfTU9OREFZKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RVRVNEQVkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9XRURORVNEQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfVEhVUlNEQVkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX0ZSSURBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TQVRVUkRBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfU1VOREFZKSkKKworI2RlZmluZSBJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoREFURSkgKCgoREFURSkgPjB1KSAmJiAoKERBVEUpIDw9IDMxdSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKFdFRUtEQVkpICgoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX01PTkRBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfVFVFU0RBWSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9XRURORVNEQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RIVVJTREFZKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfRlJJREFZKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TQVRVUkRBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoU0VMKSAoKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX1dFRUtEQVkpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9NQVNLKE1BU0spICAoKChNQVNLKSAmIH4oUlRDX0FMQVJNTUFTS19BTEwpKSA9PSAwVSkKKworI2RlZmluZSBJU19SVENfQUxBUk0oQUxBUk0pICAgICAgKCgoQUxBUk0pID09IFJUQ19BTEFSTV9BKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEFSTSkgPT0gUlRDX0FMQVJNX0IpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9TVUJfU0VDT05EX1ZBTFVFKFZBTFVFKSAoKFZBTFVFKSA8PSBSVENfQUxSTUFTU1JfU1MpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhNQVNLKSAgICgoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfQUxMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF85KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19OT05FKSkKKworI2RlZmluZSBJU19SVENfQVNZTkNIX1BSRURJVihQUkVESVYpICAgKChQUkVESVYpIDw9IDB4N0Z1KQorCisjZGVmaW5lIElTX1JUQ19TWU5DSF9QUkVESVYoUFJFRElWKSAgICAoKFBSRURJVikgPD0gMHg3RkZGdSkKKworI2RlZmluZSBJU19SVENfSE9VUjEyKEhPVVIpICAgICAgICAgICAgKCgoSE9VUikgPiAwdSkgJiYgKChIT1VSKSA8PSAxMnUpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSMjQoSE9VUikgICAgICAgICAgICAoKEhPVVIpIDw9IDIzdSkKKworI2RlZmluZSBJU19SVENfTUlOVVRFUyhNSU5VVEVTKSAgICAgICAgKChNSU5VVEVTKSA8PSA1OXUpCisKKyNkZWZpbmUgSVNfUlRDX1NFQ09ORFMoU0VDT05EUykgICAgICAgICgoU0VDT05EUykgPD0gNTl1KQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25zIFJUQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgIFJUQ19FeGl0SW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordWludDhfdCAgICAgICAgICAgIFJUQ19CeXRlVG9CY2QyKHVpbnQ4X3QgVmFsdWUpOwordWludDhfdCAgICAgICAgICAgIFJUQ19CY2QyVG9CeXRlKHVpbnQ4X3QgVmFsdWUpOworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9SVENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfcnRjX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9ydGNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY2YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfcnRjX2V4LmgKQEAgLTAsMCArMSwxMTMxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9ydGNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9SVENfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1JUQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeCBSVENFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX1R5cGVzIFJUQ0V4IEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfc3RydWN0dXJlX2RlZmluaXRpb24gUlRDRXggVGFtcGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRhbXBlcjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRhbXBlciBQaW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X1RhbXBlcl9QaW5zICovCisKKyAgdWludDMyX3QgVHJpZ2dlcjsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIFRyaWdnZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X1RhbXBlcl9UcmlnZ2VyICovCisKKyAgdWludDMyX3QgTm9FcmFzZTsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIG5vIGVyYXNlIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X1RhbXBlcl9FcmFzZUJhY2tVcCAqLworCisgIHVpbnQzMl90IE1hc2tGbGFnOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRhbXBlciBGbGFnIG1hc2tpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X1RhbXBlcl9NYXNrRmxhZyAqLworCisgIHVpbnQzMl90IEZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRBTVAgRmlsdGVyIFRhbXBlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX0ZpbHRlciAqLworCisgIHVpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1NhbXBsaW5nX0ZyZXF1ZW5jaWVzICovCisKKyAgdWludDMyX3QgUHJlY2hhcmdlRHVyYXRpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlY2hhcmdlIER1cmF0aW9uIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1Bpbl9QcmVjaGFyZ2VfRHVyYXRpb24gKi8KKworICB1aW50MzJfdCBUYW1wZXJQdWxsVXA7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUYW1wZXIgUHVsbFVwIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1B1bGxfVVAgKi8KKworICB1aW50MzJfdCBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1RpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uX0RlZmluaXRpb25zICovCit9UlRDX1RhbXBlclR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfSW50ZXJuYWxfVGFtcGVyX3N0cnVjdHVyZV9kZWZpbml0aW9uIFJUQ0V4IEludGVybmFsIFRhbXBlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBJbnRUYW1wZXI7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnRlcm5hbCBUYW1wZXIgUGluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9JbnRlcm5hbF9UYW1wZXJfUGlucyAqLworCisgIHVpbnQzMl90IFRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENFeF9UYW1wZXJfVGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb25fRGVmaW5pdGlvbnMgKi8KK30gUlRDX0ludGVybmFsVGFtcGVyVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBSVENFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RpbWVfU3RhbXBfRWRnZXNfZGVmaW5pdGlvbnMgUlRDRXggVGltZSBTdGFtcCBFZGdlcyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HICAgICAgIFJUQ19DUl9UU0VER0UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGltZVN0YW1wX1Bpbl9TZWxlY3Rpb25zIFJUQ0V4IFRpbWVTdGFtcCBQaW4gU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUICAgICAgICAgICAgICAweDAwMDAwMDAwdQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9XYWtldXBfVGltZXJfRGVmaW5pdGlvbnMgUlRDRXggV2FrZXVwIFRpbWVyIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYxNiAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVY4ICAgICAgICAgUlRDX0NSX1dVQ0tTRUxfMAorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjQgICAgICAgICBSVENfQ1JfV1VDS1NFTF8xCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMiAgICAgICAgIChSVENfQ1JfV1VDS1NFTF8wIHwgUlRDX0NSX1dVQ0tTRUxfMSkKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTZCSVRTICAgICAgUlRDX0NSX1dVQ0tTRUxfMgorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xN0JJVFMgICAgICAoUlRDX0NSX1dVQ0tTRUxfMSB8IFJUQ19DUl9XVUNLU0VMXzIpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1Ntb290aF9jYWxpYl9wZXJpb2RfRGVmaW5pdGlvbnMgUlRDRXggU21vb3RoIGNhbGliIHBlcmlvZCBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUMgICAweDAwMDAwMDAwdSAgICAgICAgICAgICAgLyohPCBJZiBSVENDTEsgPSAzMjc2OCBIeiwgU21vb3RoIGNhbGliYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCBpcyAzMnMsICBlbHNlIDJleHAyMCBSVENDTEsgcHVsc2VzICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUMgICBSVENfQ0FMUl9DQUxXMTYgICAgICAgICAgLyohPCBJZiBSVENDTEsgPSAzMjc2OCBIeiwgU21vb3RoIGNhbGliYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCBpcyAxNnMsIGVsc2UgMmV4cDE5IFJUQ0NMSyBwdWxzZXMgKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BFUklPRF84U0VDICAgIFJUQ19DQUxSX0NBTFc4ICAgICAgICAgICAvKiE8IElmIFJUQ0NMSyA9IDMyNzY4IEh6LCBTbW9vdGggY2FsaWJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIGlzIDhzLCBlbHNlIDJleHAxOCBSVENDTEsgcHVsc2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1Ntb290aF9jYWxpYl9QbHVzX3B1bHNlc19EZWZpbml0aW9ucyBSVENFeCBTbW9vdGggY2FsaWIgUGx1cyBwdWxzZXMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19TRVQgICAgUlRDX0NBTFJfQ0FMUCAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBSVENDTEsgcHVsc2VzIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBYIC1zZWNvbmQgd2luZG93ID0gWSAtIENBTE1bODowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBZID0gNTEyLCAyNTYsIDEyOCB3aGVuIFggPSAzMiwgMTYsIDggKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgUlRDQ0xLIHB1bHNlcyBzdWJic3RpdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSAzMi1zZWNvbmQgd2luZG93ID0gQ0FMTVs4OjBdICovCisKKy8qKgorICAqIEB9CisgICovCisgLyoqIEBkZWZncm91cCBSVENFeF9DYWxpYl9PdXRwdXRfc2VsZWN0aW9uX0RlZmluaXRpb25zIFJUQ0V4IENhbGliIE91dHB1dCBzZWxlY3Rpb24gRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfQ0FMSUJPVVRQVVRfNTEySFogICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfQ0FMSUJPVVRQVVRfMUhaICAgICAgICAgICAgICBSVENfQ1JfQ09TRUwKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0FkZF8xX1NlY29uZF9QYXJhbWV0ZXJfRGVmaW5pdGlvbiBSVENFeCBBZGQgMSBTZWNvbmQgUGFyYW1ldGVyIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1NISUZUQUREMVNfUkVTRVQgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfU0hJRlRBREQxU19TRVQgICAgICAgIFJUQ19TSElGVFJfQUREMVMKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1BpbnMgIFJUQ0V4IFRhbXBlciBQaW5zIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSXzEgICAgICAgICAgICAgICAgICAgICAgICBUQU1QX0NSMV9UQU1QMUUKKyNkZWZpbmUgUlRDX1RBTVBFUl8yICAgICAgICAgICAgICAgICAgICAgICAgVEFNUF9DUjFfVEFNUDJFCisjZGVmaW5lIFJUQ19UQU1QRVJfQUxMICAgICAgICAgICAgICAgICAgICAgIChUQU1QX0NSMV9UQU1QMUUgfCBUQU1QX0NSMV9UQU1QMkUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0ludGVybmFsX1RhbXBlcl9QaW5zICBSVENFeCBJbnRlcm5hbCBUYW1wZXIgUGlucyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0lOVF9UQU1QRVJfMyAgICAgICAgICAgICAgICAgICAgVEFNUF9DUjFfSVRBTVAzRQorI2RlZmluZSBSVENfSU5UX1RBTVBFUl80ICAgICAgICAgICAgICAgICAgICBUQU1QX0NSMV9JVEFNUDRFCisjZGVmaW5lIFJUQ19JTlRfVEFNUEVSXzUgICAgICAgICAgICAgICAgICAgIFRBTVBfQ1IxX0lUQU1QNUUKKyNkZWZpbmUgUlRDX0lOVF9UQU1QRVJfNiAgICAgICAgICAgICAgICAgICAgVEFNUF9DUjFfSVRBTVA2RQorI2RlZmluZSBSVENfSU5UX1RBTVBFUl9BTEwgICAgICAgICAgICAgICAgICAoVEFNUF9DUjFfSVRBTVAzRSB8IFRBTVBfQ1IxX0lUQU1QNEUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU1QX0NSMV9JVEFNUDVFIHwgVEFNUF9DUjFfSVRBTVA2RSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1RyaWdnZXIgIFJUQ0V4IFRhbXBlciBUcmlnZ2VyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRSAgICAgICAgMHgwMHUKKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfRkFMTElOR0VER0UgICAgICAgMHgwMXUKKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfTE9XTEVWRUwgICAgICAgICAgUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRQorI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9ISUdITEVWRUwgICAgICAgICBSVENfVEFNUEVSVFJJR0dFUl9GQUxMSU5HRURHRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfTWFza0ZsYWcgIFJUQ0V4IFRhbXBlciBNYXNrRmxhZworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRSAgICAgICAgIDB4MDB1CisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFICAgICAgICAgIDB4MDF1CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9FcmFzZUJhY2tVcCAgUlRDRXggVGFtcGVyIEVyYXNlQmFja1VwCisqIEB7CisqLworI2RlZmluZSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUgICAgICAweDAwdQorI2RlZmluZSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9ESVNBQkxFICAgICAweDAxdQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfRmlsdGVyICBSVENFeCBUYW1wZXIgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl9ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUYW1wZXIgZmlsdGVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIFJUQ19UQU1QRVJGSUxURVJfMlNBTVBMRSAgICAgICAgICAgVEFNUF9GTFRDUl9UQU1QRkxUXzAgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl80U0FNUExFICAgICAgICAgICBUQU1QX0ZMVENSX1RBTVBGTFRfMSAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlIHNhbXBsZXMgYXQgdGhlIGFjdGl2ZSBsZXZlbCAqLworI2RlZmluZSBSVENfVEFNUEVSRklMVEVSXzhTQU1QTEUgICAgICAgICAgIFRBTVBfRkxUQ1JfVEFNUEZMVCAgICAgIC8qITwgVGFtcGVyIGlzIGFjdGl2YXRlZCBhZnRlciA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9TYW1wbGluZ19GcmVxdWVuY2llcyAgUlRDRXggVGFtcGVyIFNhbXBsaW5nIEZyZXF1ZW5jaWVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMzI3NjggIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAzMjc2OCAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxNjM4NCAgVEFNUF9GTFRDUl9UQU1QRlJFUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDE2Mzg0ICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjgxOTIgICBUQU1QX0ZMVENSX1RBTVBGUkVRXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gODE5MiAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWNDA5NiAgIChUQU1QX0ZMVENSX1RBTVBGUkVRXzAgfCBUQU1QX0ZMVENSX1RBTVBGUkVRXzEpIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA0MDk2ICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyMDQ4ICAgVEFNUF9GTFRDUl9UQU1QRlJFUV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDIwNDggICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjEwMjQgICAoVEFNUF9GTFRDUl9UQU1QRlJFUV8wIHwgVEFNUF9GTFRDUl9UQU1QRlJFUV8yKSAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTAyNCAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWNTEyICAgIChUQU1QX0ZMVENSX1RBTVBGUkVRXzEgfCBUQU1QX0ZMVENSX1RBTVBGUkVRXzIpIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA1MTIgICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyNTYgICAgKFRBTVBfRkxUQ1JfVEFNUEZSRVFfMCB8IFRBTVBfRkxUQ1JfVEFNUEZSRVFfMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFNUF9GTFRDUl9UQU1QRlJFUV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjU2ICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1Bpbl9QcmVjaGFyZ2VfRHVyYXRpb24gIFJUQ0V4IFRhbXBlciBQaW4gUHJlY2hhcmdlIER1cmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzFSVENDTEsgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyAxIFJUQ0NMSyBjeWNsZSAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzJSVENDTEsgICAgIFRBTVBfRkxUQ1JfVEFNUFBSQ0hfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyAyIFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzRSVENDTEsgICAgIFRBTVBfRkxUQ1JfVEFNUFBSQ0hfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzhSVENDTEsgICAgIChUQU1QX0ZMVENSX1RBTVBQUkNIXzAgfCBUQU1QX0ZMVENSX1RBTVBQUkNIXzEpICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyA4IFJUQ0NMSyBjeWNsZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1B1bGxfVVAgIFJUQ0V4IFRhbXBlciBQdWxsIFVQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUl9QVUxMVVBfRU5BQkxFICAgICAgICAgICAweDAwMDAwMDAwdSAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nICovCisjZGVmaW5lIFJUQ19UQU1QRVJfUFVMTFVQX0RJU0FCTEUgICAgICAgICAgVEFNUF9GTFRDUl9UQU1QUFVESVMgIC8qITwgVGFtcGVyIHBpbnMgcHJlLWNoYXJnZSBpcyBkaXNhYmxlZCAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfVGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb25fRGVmaW5pdGlvbnMgUlRDRXggVGFtcGVyIFRpbWVTdGFtcCBPbiBUYW1wZXIgRGV0ZWN0aW9uIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RJTUVTVEFNUE9OVEFNUEVSREVURUNUSU9OX0RJU0FCTEUgIDB4MDAwMDAwMDB1ICAgIC8qITwgVGltZVN0YW1wIG9uIFRhbXBlciBEZXRlY3Rpb24gZXZlbnQgaXMgbm90IHNhdmVkICovCisjZGVmaW5lIFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9FTkFCTEUgICBSVENfQ1JfVEFNUFRTICAvKiE8IFRpbWVTdGFtcCBvbiBUYW1wZXIgRGV0ZWN0aW9uIGV2ZW50IHNhdmVkICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0ludGVybmFsX1RhbXBlcl9JbnRlcnJ1cHQgIFJUQ0V4IEludGVybmFsIFRhbXBlciBJbnRlcnJ1cHQKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfSVRfVEFNUDEgICAgICAgICAgICAgICAgICAgICAgIFRBTVBfSUVSX1RBTVAxSUUgICAgIC8qITwgVGFtcGVyIDEgSW50ZXJydXB0ICovCisjZGVmaW5lIFJUQ19JVF9UQU1QMiAgICAgICAgICAgICAgICAgICAgICAgVEFNUF9JRVJfVEFNUDJJRSAgICAgLyohPCBUYW1wZXIgMiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlRDX0lUX1RBTVBBTEwgICAgICAgICAgICAgICAgICAgICAoVEFNUF9JRVJfVEFNUDFJRSB8IFRBTVBfSUVSX1RBTVAySUUpCisKKyNkZWZpbmUgUlRDX0lUX0lOVF9UQU1QMyAgICAgICAgICAgICAgICAgICBUQU1QX0lFUl9JVEFNUDNJRQorI2RlZmluZSBSVENfSVRfSU5UX1RBTVA0ICAgICAgICAgICAgICAgICAgIFRBTVBfSUVSX0lUQU1QNElFCisjZGVmaW5lIFJUQ19JVF9JTlRfVEFNUDUgICAgICAgICAgICAgICAgICAgVEFNUF9JRVJfSVRBTVA1SUUKKyNkZWZpbmUgUlRDX0lUX0lOVF9UQU1QNiAgICAgICAgICAgICAgICAgICBUQU1QX0lFUl9JVEFNUDZJRQorI2RlZmluZSBSVENfSVRfSU5UX1RBTVBBTEwgICAgICAgICAgICAgICAgIChSVENfSVRfSU5UX1RBTVAzIHwgUlRDX0lUX0lOVF9UQU1QNCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0lUX0lOVF9UQU1QNSB8IFJUQ19JVF9JTlRfVEFNUDYpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0ZsYWdzICBSVENFeCBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAxICAgICAgICAgICAgICAgICAgICAgVEFNUF9TUl9UQU1QMUYKKyNkZWZpbmUgUlRDX0ZMQUdfVEFNUDIgICAgICAgICAgICAgICAgICAgICBUQU1QX1NSX1RBTVAyRgorI2RlZmluZSBSVENfRkxBR19UQU1QQUxMICAgICAgICAgICAgICAgICAgKFJUQ19GTEFHX1RBTVAxIHwgUlRDX0ZMQUdfVEFNUDIpCisjZGVmaW5lIFJUQ19GTEFHX0lOVF9UQU1QMyAgICAgICAgICAgICAgICAgVEFNUF9TUl9JVEFNUDNGCisjZGVmaW5lIFJUQ19GTEFHX0lOVF9UQU1QNCAgICAgICAgICAgICAgICAgVEFNUF9TUl9JVEFNUDRGCisjZGVmaW5lIFJUQ19GTEFHX0lOVF9UQU1QNSAgICAgICAgICAgICAgICAgVEFNUF9TUl9JVEFNUDVGCisjZGVmaW5lIFJUQ19GTEFHX0lOVF9UQU1QNiAgICAgICAgICAgICAgICAgVEFNUF9TUl9JVEFNUDZGCisjZGVmaW5lIFJUQ19GTEFHX0lOVF9UQU1QQUxMICAgICAgICAgICAgICAgKFJUQ19GTEFHX0lOVF9UQU1QMyB8IFJUQ19GTEFHX0lOVF9UQU1QNCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfSU5UX1RBTVA1IHwgUlRDX0ZMQUdfSU5UX1RBTVA2KQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0JhY2t1cF9SZWdpc3RlcnMgIFJUQ0V4IEJhY2t1cCBSZWdpc3RlcnMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19CS1BfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNXUKKyNkZWZpbmUgUlRDX0JLUF9EUjAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBSVENfQktQX0RSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDF1CisjZGVmaW5lIFJUQ19CS1BfRFIyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMnUKKyNkZWZpbmUgUlRDX0JLUF9EUjMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzdQorI2RlZmluZSBSVENfQktQX0RSNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDR1CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9NYWNyb3MgUlRDRXggRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBSVEMgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfQ0xFQVJfSVRTRiAgICAgICAgICAgICAgIENsZWFyIEludGVybmFsIFRpbWUtc3RhbXAgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19DTEVBUl9UU09WRiAgICAgICAgICAgICAgQ2xlYXIgVGltZS1zdGFtcCBvdmVyZmxvdyBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0NMRUFSX1RTRiAgICAgICAgICAgICAgICBDbGVhciBUaW1lLXN0YW1wIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfQ0xFQVJfV1VURiAgICAgICAgICAgICAgIENsZWFyIFdha2V1cCB0aW1lciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0NMRUFSX0FMUkJGICAgICAgICAgICAgICBDbGVhciBBbGFybSBCIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfQ0xFQVJfQUxSQUYgICAgICAgICAgICAgIENsZWFyIEFsYXJtIEEgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U0NSIHw9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1JFQ0FMUEYgICAgICAgICAgICAgUmVjYWxpYnJhdGlvbiBwZW5kaW5nIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19JTklURiAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19SU0YgICAgICAgICAgICAgICAgIFJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0lOSVRTICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gc3RhdHVzIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19TSFBGICAgICAgICAgICAgICAgIFNoaWZ0IG9wZXJhdGlvbiBwZW5kaW5nIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19XVVRXRiAgICAgICAgICAgICAgIFdha2V1cCB0aW1lciB3cml0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0ZMQUdfQUxSQldGICAgICAgICAgICAgICBBbGFybSBCIHdyaXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19BTFJBV0YgICAgICAgICAgICAgIEFsYXJtIEEgd3JpdGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0lUU0YgICAgICAgICAgICAgICAgSW50ZXJuYWwgVGltZS1zdGFtcCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0ZMQUdfVFNPVkYgICAgICAgICAgICAgICBUaW1lLXN0YW1wIG92ZXJmbG93IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19UU0YgICAgICAgICAgICAgICAgIFRpbWUtc3RhbXAgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1dVVEYgICAgICAgICAgICAgICAgV2FrZXVwIHRpbWVyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19BTFJCRiAgICAgICAgICAgICAgIEFsYXJtIEIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0FMUkFGICAgICAgICAgICAgICAgQWxhcm0gQSBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgKCgoKChfX0ZMQUdfXykpID4+IDhVKSA9PSAxVSkgPyAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1NSICYgKDFVIDw8ICgoKHVpbnQxNl90KShfX0ZMQUdfXykpICYgUlRDX0ZMQUdfTUFTSykpKSAhPSAwVSkgPyAxVSA6IDBVKSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19GTEFHX18pKSAmIFJUQ19GTEFHX01BU0spKSkgIT0gMFUpID8gMVUgOiAwVSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVdBS0VVUFRJTUVSLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfV2FrZVVwX1RpbWVyIFJUQyBXYWtlVXAgVGltZXIKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBXYWtlVXAgVGltZXIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX1dVVEUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBXYWtlVXAgVGltZXIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9XVVRFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfV1VUIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfV1VUIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9XVVQgIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoKF9fSU5URVJSVVBUX18pPj4gMTJVKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFdha2UgVXAgdGltZXIgaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFdha2UgVXAgdGltZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUlRDX0lUX1dVVCAgV2FrZVVwVGltZXIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBXYWtlVXBUaW1lcnMgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19XVVRGCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1dVVFdGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoX19IQUxfUlRDX0dFVF9GTEFHKChfX0hBTkRMRV9fKSwgKF9fRkxBR19fKSkpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJUQyBXYWtlIFVwIHRpbWVycyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1dVVEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAoX19IQUxfUlRDX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBSVENfQ0xFQVJfV1VURikpCisKKy8qIFdBS0UtVVAgVElNRVIgRVhUSSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIxIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIChFWFRJLT5JTVIxICY9IH4oUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV2ZW50IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0VWRU5UKCkgICAgKEVYVEktPkVNUjEgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUjEgJj0gfihSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVElNRVNUQU1QLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGltZXN0YW1wIFJUQyBUaW1lc3RhbXAKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBUaW1lU3RhbXAgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfVFNFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9UU0UpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCBzb3VyY2UgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfVFMgVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfVFMgVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfSVRfVFMgVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiAxMlUpKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGltZSBTdGFtcCBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZSBTdGFtcCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19JVF9UUyBUaW1lU3RhbXAgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBUaW1lU3RhbXBzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19UU0YKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19UU09WRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgKF9fSEFMX1JUQ19HRVRfRkxBRygoX19IQU5ETEVfXyksKF9fRkxBR19fKSkpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFJUQyBUaW1lIFN0YW1wcyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1RTRgorICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSVENfRkxBR19UU09WRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgKF9fSEFMX1JUQ19DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgKF9fRkxBR19fKSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAoRVhUSS0+SU1SMSB8PSBSVENfRVhUSV9MSU5FX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAoRVhUSS0+SU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfVElNRVNUQU1QX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXZlbnQgb24gdGhlIFJUQyBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SMSB8PSBSVENfRVhUSV9MSU5FX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUjEgJj0gfihSVENfRVhUSV9MSU5FX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgaW50ZXJuYWwgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfSVRTRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIGludGVybmFsIFRpbWVTdGFtcCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9JVFNFKSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBJbnRlcm5hbCBUaW1lIFN0YW1wcyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcCBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0lUU0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgIChfX0hBTF9SVENfR0VUX0ZMQUcoKF9fSEFORExFX18pLChfX0ZMQUdfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcHMgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcCBGbGFnIHNvdXJjZSB0byBjbGVhci4KKyAgKiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX0lUU0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgKF9fSEFMX1JUQ19DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgUlRDX0NMRUFSX0lUU0YpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCBvbiBUYW1wZXIgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QVFNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9UQU1QVFMpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUaW1lU3RhbXAgb24gVGFtcGVyIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUFRTX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX1RBTVBUUykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGRldGVjdGlvbiBvdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBPRV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX1RBTVBPRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRhbXBlciBkZXRlY3Rpb24gb3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QT0VfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfVEFNUE9FKSkKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNhbGlicmF0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0NhbGlicmF0aW9uIFJUQyBDYWxpYnJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgY2FsaWJyYXRpb24gb3V0cHV0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQ09FKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjYWxpYnJhdGlvbiBvdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NBTElCUkFUSU9OX09VVFBVVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfQ09FKSkKKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgY2xvY2sgcmVmZXJlbmNlIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoUlRDX0NSX1JFRkNLT04pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGNsb2NrIHJlZmVyZW5jZSBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NMT0NLUkVGX0RFVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfUkVGQ0tPTikpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBzaGlmdCBvcGVyYXRpb25zIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBzaGlmdCBvcGVyYXRpb24gRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJUQ19GTEFHX1NIUEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1NISUZUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAoX19IQUxfUlRDX0dFVF9GTEFHKChfX0hBTkRMRV9fKSwgKF9fRkxBR19fKSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRhbXBlci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXIgUlRDRXggdGFtcGVyCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBUQU1QIFRhbXBlciBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fVEFNUEVSX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIHNvdXJjZSB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19BTExfVEFNUEVSOiBBbGwgdGFtcGVycworICAqICAgICAgICAgICAgQGFyZyAgUlRDX1RBTVBFUl8xOiBUYW1wZXIxCisgICogICAgICAgICAgICBAYXJnICBSVENfVEFNUEVSXzI6IFRhbXBlcjIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9FTkFCTEUoX19IQU5ETEVfXywgX19UQU1QRVJfXykgICAgICAgICAgICgoKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICsgKF9fSEFORExFX18pLT5UYW1wT2Zmc2V0KSktPkNSMSB8PSAoX19UQU1QRVJfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgVEFNUCBUYW1wZXIgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRBTVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19UQU1QRVJfXyBzcGVjaWZpZXMgdGhlIFRBTVAgVGFtcGVyIHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnICBSVENfQUxMX1RBTVBFUjogQWxsIHRhbXBlcnMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19UQU1QRVJfMTogVGFtcGVyMQorICAqICAgICAgICAgICAgQGFyZyAgUlRDX1RBTVBFUl8yOiBUYW1wZXIyCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRElTQUJMRShfX0hBTkRMRV9fLCBfX1RBTVBFUl9fKSAgICAgICAgICAgKCgoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgKyAoX19IQU5ETEVfXyktPlRhbXBPZmZzZXQpKS0+Q1IxICY9IH4oX19UQU1QRVJfXykpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFRBTVAgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUQU1QIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUQU1QIFRhbXBlciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVBBTEw6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0CisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgKCgoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgKyAoX19IQU5ETEVfXyktPlRhbXBPZmZzZXQpKS0+SUVSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUQU1QIFRhbXBlciBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVEFNUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVEFNUCBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVBBTEw6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICgoKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICsgKF9fSEFORExFX18pLT5UYW1wT2Zmc2V0KSktPklFUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRBTVAgVGFtcGVyIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRBTVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFRBTVAgVGFtcGVyIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QQUxMOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfSU5UX1RBTVAzOiBJbnRlcm5hbCBUYW1wZXIzIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX0lOVF9UQU1QNDogSW50ZXJuYWwgVGFtcGVyNCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9JTlRfVEFNUDU6IEludGVybmFsIFRhbXBlcjUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfSU5UX1RBTVA2OiBJbnRlcm5hbCBUYW1wZXI2IGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgKCgoKCgoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgKyAoX19IQU5ETEVfXyktPlRhbXBPZmZzZXQpKS0+U1IpICYgKF9fSU5URVJSVVBUX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRBTVAgVGFtcGVyIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUQU1QIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUQU1QIFRhbXBlciBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVBBTEw6IEFsbCB0YW1wZXJzIGludGVycnVwdHMKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9JTlRfVEFNUEFMTDogQWxsIGludGVybmFsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX0lOVF9UQU1QMzogSW50ZXJuYWwgVGFtcGVyMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9JTlRfVEFNUDQ6IEludGVybmFsIFRhbXBlcjQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfSU5UX1RBTVA1OiBJbnRlcm5hbCBUYW1wZXI1IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX0lOVF9UQU1QNjogSW50ZXJuYWwgVGFtcGVyNiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoKCgoKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpICsgKF9fSEFORExFX18pLT5UYW1wT2Zmc2V0KSktPklFUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFRBTVAgVGFtcGVycyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBUQU1QIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVEFNUCBUYW1wZXIgRmxhZyBpcyBwZW5kaW5nIG9yIG5vdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMTogVGFtcGVyMSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMjogVGFtcGVyMiBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19JTlRfVEFNUDM6IEludGVybmFsIFRhbXBlcjMgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfSU5UX1RBTVA0OiBJbnRlcm5hbCBUYW1wZXI0IGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0lOVF9UQU1QNTogSW50ZXJuYWwgVGFtcGVyNSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19JTlRfVEFNUDY6IEludGVybmFsIFRhbXBlcjYgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoKChUQU1QX1R5cGVEZWYgKikoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSArIChfX0hBTkRMRV9fKS0+VGFtcE9mZnNldCkpLT5TUikgJiAoX19GTEFHX18pKSAhPSAwVSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgVEFNUCBUYW1wZXJzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVEFNUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFRBTVAgVGFtcGVyIEZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUEFMTDogQWxsIFRhbXBlciBmbGFncworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDE6IFRhbXBlcjEgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDI6IFRhbXBlcjIgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfSU5UX1RBTVAzOiBJbnRlcm5hbCBUYW1wZXIzIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0lOVF9UQU1QNDogSW50ZXJuYWwgVGFtcGVyNCBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19JTlRfVEFNUDU6IEludGVybmFsIFRhbXBlcjUgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfSU5UX1RBTVA2OiBJbnRlcm5hbCBUYW1wZXI2IGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICgoKChUQU1QX1R5cGVEZWYgKikoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSArIChfX0hBTkRMRV9fKS0+VGFtcE9mZnNldCkpLT5TQ1IpIHw9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdCBvbiB0aGUgVEFNUCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAoRVhUSS0+SU1SMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgVEFNUCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAoRVhUSS0+SU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXZlbnQgb24gdGhlIFRBTVAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBUQU1QIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUjEgJj0gfihSVENfRVhUSV9MSU5FX1RBTVBFUl9FVkVOVCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSVENFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBSVEMgVGltZVN0YW1wIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBSVEMgVGltZVN0YW1wIGZ1bmN0aW9ucworICogQHsKKyAqLworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lU3RhbXBFZGdlLCB1aW50MzJfdCBSVENfVGltZVN0YW1wUGluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVTdGFtcEVkZ2UsIHVpbnQzMl90IFJUQ19UaW1lU3RhbXBQaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldEludGVybmFsVGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlSW50ZXJuYWxUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RpbWVUeXBlRGVmICpzVGltZVN0YW1wLCBSVENfRGF0ZVR5cGVEZWYgKnNUaW1lU3RhbXBEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGltZVN0YW1wSVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRpbWVTdGFtcEV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKworLyogUlRDIFdha2UtdXAgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBXYWtlVXBDb3VudGVyLCB1aW50MzJfdCBXYWtlVXBDbG9jayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXJfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFdha2VVcENvdW50ZXIsIHVpbnQzMl90IFdha2VVcENsb2NrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlV2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordWludDMyX3QgICAgICAgICAgSEFMX1JUQ0V4X0dldFdha2VVcFRpbWVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9XYWtlVXBUaW1lcklSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvcldha2VVcFRpbWVyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXh0ZW5kZWQgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBlcmlvZCwgdWludDMyX3QgU21vb3RoQ2FsaWJQbHVzUHVsc2VzLCB1aW50MzJfdCBTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFN5bmNocm9TaGlmdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgU2hpZnRBZGQxUywgdWludDMyX3QgU2hpZnRTdWJGUyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0Q2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IENhbGliT3V0cHV0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlQ2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFJlZkNsb2NrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlUmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0VuYWJsZUJ5cGFzc1NoYWRvdyhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGlzYWJsZUJ5cGFzc1NoYWRvdyhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHRlbmRlZCBSVEMgZmVhdHVyZXMgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKiBAeworICovCisKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yQWxhcm1CRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IEV4dGVuZGVkIFJUQyBUYW1wZXIgZnVuY3Rpb25zCisgKiBAeworICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGFtcGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRhbXBlciwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0SW50ZXJuYWxUYW1wZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19JbnRlcm5hbFRhbXBlclR5cGVEZWYqIHNJbnRUYW1wZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldEludGVybmFsVGFtcGVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfSW50ZXJuYWxUYW1wZXJUeXBlRGVmKiBzSW50VGFtcGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlSW50ZXJuYWxUYW1wZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEludFRhbXBlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckludGVybmFsVGFtcGVyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEludFRhbXBlciwgdWludDMyX3QgVGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVySVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVyMUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjVFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjZFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBFeHRlbmRlZCBSVEMgQmFja3VwIHJlZ2lzdGVyIGZ1bmN0aW9ucworICogQHsKKyAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X0JLVVBXcml0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpOwordWludDMyX3QgICAgICAgICAgSEFMX1JUQ0V4X0JLVVBSZWFkKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBCYWNrdXBSZWdpc3Rlcik7CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfUHJpdmF0ZV9Db25zdGFudHMgUlRDRXggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfRVhUSV9MSU5FX1RJTUVTVEFNUF9FVkVOVCAgICAgICAgIEVYVElfSU1SMV9JTTE5IC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTkgQ29ubmVjdGVkIHRvIHRoZSBSVEMgVGltZSBTdGFtcCBldmVudHMgKi8KKyNkZWZpbmUgUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCAgICAgICBFWFRJX0lNUjFfSU0xOSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE5IENvbm5lY3RlZCB0byB0aGUgUlRDIFdha2V1cCBldmVudCAqLworI2RlZmluZSBSVENfRVhUSV9MSU5FX1RBTVBFUl9FVkVOVCAgICAgICAgICAgIEVYVElfSU1SMV9JTTIxIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTkgQ29ubmVjdGVkIHRvIHRoZSBSVEMgdGFtcGVyIGV2ZW50cyovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1ByaXZhdGVfTWFjcm9zIFJUQ0V4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9JU19SVENfRGVmaW5pdGlvbnMgUHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovCisjZGVmaW5lIElTX1RJTUVTVEFNUF9FREdFKEVER0UpICgoKEVER0UpID09IFJUQ19USU1FU1RBTVBFREdFX1JJU0lORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HKSkKKworCisjZGVmaW5lIElTX1JUQ19USU1FU1RBTVBfUElOKFBJTikgICgoKFBJTikgPT0gUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUKSkKKworCisKKyNkZWZpbmUgSVNfUlRDX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihERVRFQ1RJT04pICgoKERFVEVDVElPTikgPT0gUlRDX1RJTUVTVEFNUE9OVEFNUEVSREVURUNUSU9OX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFVEVDVElPTikgPT0gUlRDX1RJTUVTVEFNUE9OVEFNUEVSREVURUNUSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfVEFNUEVSREVURUNUSU9OT1VUUFVUKE1PREUpICAgICgoKE1PREUpID09IFJUQ19UQU1QRVJERVRFQ1RJT05PVVRQVVRfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFJUQ19UQU1QRVJERVRFQ1RJT05PVVRQVVRfRElTQUJMRSkpCisKKworI2RlZmluZSBJU19SVENfV0FLRVVQX0NMT0NLKENMT0NLKSAoKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYxNikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjgpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVYyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE3QklUUykpCisKKyNkZWZpbmUgSVNfUlRDX1dBS0VVUF9DT1VOVEVSKENPVU5URVIpICAoKENPVU5URVIpIDw9IFJUQ19XVVRSX1dVVCkKKworI2RlZmluZSBJU19SVENfU01PT1RIX0NBTElCX1BFUklPRChQRVJJT0QpICgoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF8zMlNFQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF8xNlNFQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFUklPRCkgPT0gUlRDX1NNT09USENBTElCX1BFUklPRF84U0VDKSkKKworI2RlZmluZSBJU19SVENfU01PT1RIX0NBTElCX1BMVVMoUExVUykgKCgoUExVUykgPT0gUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQTFVTKSA9PSBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19SRVNFVCkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUihfX1RBTVBFUl9fKSAgICAgICAgICAgICAgICAoKCgoX19UQU1QRVJfXykgJiBSVENfVEFNUEVSX0FMTCkgIT0gMHgwMFUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVEFNUEVSX18pICYgflJUQ19UQU1QRVJfQUxMKSA9PSAweDAwVSkpCisKKyNkZWZpbmUgSVNfUlRDX0lOVEVSTkFMX1RBTVBFUihfX0lOVF9UQU1QRVJfXykgICAoKCgoX19JTlRfVEFNUEVSX18pICYgUlRDX0lOVF9UQU1QRVJfQUxMKSAhPSAweDAwVSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19JTlRfVEFNUEVSX18pICYgflJUQ19JTlRfVEFNUEVSX0FMTCkgPT0gMHgwMFUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfVFJJR0dFUihfX1RSSUdHRVJfXykgICAgICAgKCgoX19UUklHR0VSX18pID09IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR0dFUl9fKSA9PSBSVENfVEFNUEVSVFJJR0dFUl9GQUxMSU5HRURHRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdHRVJfXykgPT0gUlRDX1RBTVBFUlRSSUdHRVJfTE9XTEVWRUwpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHR0VSX18pID09IFJUQ19UQU1QRVJUUklHR0VSX0hJR0hMRVZFTCkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9FUkFTRV9NT0RFKF9fTU9ERV9fKSAgICAgICAoKChfX01PREVfXykgPT0gUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFKF9fU1RBVEVfXykgICgoKF9fU1RBVEVfXykgPT0gUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfRklMVEVSKF9fRklMVEVSX18pICAgICAgICAgKCgoX19GSUxURVJfXykgPT0gUlRDX1RBTVBFUkZJTFRFUl9ESVNBQkxFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZJTFRFUl9fKSA9PSBSVENfVEFNUEVSRklMVEVSXzJTQU1QTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GSUxURVJfXykgPT0gUlRDX1RBTVBFUkZJTFRFUl80U0FNUExFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRklMVEVSX18pID09IFJUQ19UQU1QRVJGSUxURVJfOFNBTVBMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9TQU1QTElOR19GUkVRKF9fRlJFUV9fKSAgICAoKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMzI3NjgpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMTYzODQpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWODE5MikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWNDA5NikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjA0OCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMTAyNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWNTEyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFfXykgPT0gUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMjU2KSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihfX0RVUkFUSU9OX18pICAgKCgoX19EVVJBVElPTl9fKSA9PSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fMVJUQ0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzJSVENDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RVUkFUSU9OX18pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl80UlRDQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVJBVElPTl9fKSA9PSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fOFJUQ0NMSykpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoX19TVEFURV9fKSAgICAoKChfX1NUQVRFX18pID09IFJUQ19UQU1QRVJfUFVMTFVQX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFJUQ19UQU1QRVJfUFVMTFVQX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OKERFVEVDVElPTikgKCgoREVURUNUSU9OKSA9PSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREVURUNUSU9OKSA9PSBSVENfVElNRVNUQU1QT05UQU1QRVJERVRFQ1RJT05fRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfUlRDX0JLUChfX0JLUF9fKSAgICAgICAgICAgICAgICAgICAgICAoKF9fQktQX18pIDwgUlRDX0JLUF9OVU1CRVIpCisKKworLyoqIEBkZWZncm91cCBSVENFeF9TbW9vdGhfY2FsaWJfTWludXNfcHVsc2VzX0RlZmluaXRpb25zIFJUQ0V4IFNtb290aCBjYWxpYiBNaW51cyBwdWxzZXMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSAgSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhWQUxVRSkgKChWQUxVRSkgPD0gUlRDX0NBTFJfQ0FMTSkKKy8qKgorICAqIEB9CisgICovCisKKworI2RlZmluZSBJU19SVENfU0hJRlRfQUREMVMoU0VMKSAoKChTRUwpID09IFJUQ19TSElGVEFERDFTX1JFU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTCkgPT0gUlRDX1NISUZUQUREMVNfU0VUKSkKKworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfU3Vic3RyYWN0X0ZyYWN0aW9uX09mX1NlY29uZF9WYWx1ZSBSVENFeCBTdWJzdHJhY3QgRnJhY3Rpb24gT2YgU2Vjb25kIFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUlRDX1NISUZUX1NVQkZTKEZTKSAoKEZTKSA8PSBSVENfU0hJRlRSX1NVQkZTKQorLyoqCisgICogQH0KKyAgKi8KKyNkZWZpbmUgSVNfUlRDX0NBTElCX09VVFBVVChPVVRQVVQpICAoKChPVVRQVVQpID09IFJUQ19DQUxJQk9VVFBVVF81MTJIWikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX0NBTElCT1VUUFVUXzFIWikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9SVENfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9zbWFydGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGIxZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkLmgKQEAgLTAsMCArMSwxMTgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9zbWFydGNhcmQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01BUlRDQVJEIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9TTUFSVENBUkRfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1NNQVJUQ0FSRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJECisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX1R5cGVzIFNNQVJUQ0FSRCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTTUFSVENBUkQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBTbWFydENhcmQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1c2FydF9rZXJfY2twcmVzKSAvICgoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVzYXJ0X2tlcl9ja3ByZXMgaXMgdGhlIFVTQVJUIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIEByZWYgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIGNhbiBvbmx5IGJlIHNldCB0byA5ICg4IGRhdGEgKyAxIHBhcml0eSBiaXRzKS4gKi8KKworICB1aW50MzJfdCBTdG9wQml0czsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9TdG9wX0JpdHMuICovCisKKyAgdWludDE2X3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1Bhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBwYXJpdHkgaXMgZW5hYmxlZCBieSBkZWZhdWx0IChQQ0UgaXMgZm9yY2VkIHRvIDEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSBXb3JkTGVuZ3RoIGlzIGZvcmNlZCB0byA4IGJpdHMgKyBwYXJpdHksIE0gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWQgdG8gMSBhbmQgdGhlIHBhcml0eSBiaXQgaXMgdGhlIDl0aCBiaXQuICovCisKKyAgdWludDE2X3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTW9kZSAqLworCisgIHVpbnQxNl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQxNl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDE2X3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTGFzdF9CaXQgKi8KKworICB1aW50MTZfdCBPbmVCaXRTYW1wbGluZzsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGEgc2luZ2xlIHNhbXBsZSBvciB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSB2b3RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGluZyB0aGUgc2luZ2xlIHNhbXBsZSBtZXRob2QgaW5jcmVhc2VzIHRoZSByZWNlaXZlciB0b2xlcmFuY2UgdG8gY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9PbmVCaXRfU2FtcGxpbmcuICovCisKKyAgdWludDhfdCAgUHJlc2NhbGVyOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MDEgdG8gMHgxRi4gUHJlc2NhbGVyIHZhbHVlIGlzIG11bHRpcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAyIHRvIGdpdmUgdGhlIGRpdmlzaW9uIGZhY3RvciBvZiB0aGUgc291cmNlIGNsb2NrIGZyZXF1ZW5jeSAqLworCisgIHVpbnQ4X3QgIEd1YXJkVGltZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTbWFydENhcmQgR3VhcmQgVGltZSBhcHBsaWVkIGFmdGVyIHN0b3AgYml0cy4gKi8KKworICB1aW50MTZfdCBOQUNLRW5hYmxlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBTbWFydENhcmQgTkFDSyB0cmFuc21pc3Npb24gaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgcGFyaXR5IGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX05BQ0tfRW5hYmxlICovCisKKyAgdWludDMyX3QgVGltZU91dEVuYWJsZTsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZWl2ZXIgdGltZW91dCBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9UaW1lb3V0X0VuYWJsZSovCisKKyAgdWludDMyX3QgVGltZU91dFZhbHVlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlY2VpdmVyIHRpbWUgb3V0IHZhbHVlIGluIG51bWJlciBvZiBiYXVkIGJsb2NrczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgQ2hhcmFjdGVyIFdhaXQgVGltZSAoQ1dUKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBXYWl0IFRpbWUgKEJXVCkuIEl0IGlzIGNvZGVkIG92ZXIgMjQgYml0cy4gKi8KKworICB1aW50OF90IEJsb2NrTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIEJsb2NrIExlbmd0aCBpbiBUPTEgUmVjZXB0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MCB0byAweEZGICovCisKKyAgdWludDhfdCBBdXRvUmV0cnlDb3VudDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBhdXRvLXJldHJ5IGNvdW50IChudW1iZXIgb2YgcmV0cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGFuZCB0cmFuc21pdCBtb2RlKS4gV2hlbiBzZXQgdG8gMCwgcmV0cmFuc21pc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuIE90aGVyd2lzZSwgaXRzIG1heGltdW0gdmFsdWUgaXMgNyAoYmVmb3JlIHNpZ25hbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3IpICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVVNBUlQgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IFNNQVJUQ0FSRF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGFsaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQWR2RmVhdHVyZUluaXQ7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggYWR2YW5jZWQgU01BUlRDQVJEIGZlYXR1cmVzIGlzIGluaXRpYWxpemVkLiBTZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWQgZmVhdHVyZXMgbWF5IGJlIGluaXRpYWxpemVkIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRFeF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlICovCisKKyAgdWludDMyX3QgVHhQaW5MZXZlbEludmVydDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVFggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9UeF9JbnYgICovCisKKyAgdWludDMyX3QgUnhQaW5MZXZlbEludmVydDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUlggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9SeF9JbnYgICovCisKKyAgdWludDMyX3QgRGF0YUludmVydDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBkYXRhIGFyZSBpbnZlcnRlZCAocG9zaXRpdmUvZGlyZWN0IGxvZ2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0RhdGFfSW52ICovCisKKyAgdWludDMyX3QgU3dhcDsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9SeF9UeF9Td2FwICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bkRpc2FibGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX092ZXJydW5fRGlzYWJsZSAqLworCisgIHVpbnQzMl90IERNQURpc2FibGVvblJ4RXJyb3I7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvciAqLworCisgIHVpbnQzMl90IE1TQkZpcnN0OyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgTVNCIGlzIHNlbnQgZmlyc3Qgb24gVUFSVCBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX01TQl9GaXJzdCAqLworCisgIHVpbnQxNl90IFR4Q29tcGxldGlvbkluZGljYXRpb247ICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCB0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIGlzIHVzZWQ6IGJlZm9yZSAod2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmbGFnIGlzIGF2YWlsYWJsZSkgb3Igb25jZSBndWFyZCB0aW1lIHBlcmlvZCBoYXMgZWxhcHNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSREV4X1RyYW5zbWlzc2lvbl9Db21wbGV0aW9uX0luZGljYXRpb24uICovCit9IFNNQVJUQ0FSRF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgU01BUlRDQVJEIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFNNQVJUQ0FSRCBTdGF0ZSB2YWx1ZSBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZGlmZmVyZW50IHN1YnN0YXRlczogZ1N0YXRlIGFuZCBSeFN0YXRlIChzZWUgQHJlZiBTTUFSVENBUkRfU3RhdGVfRGVmaW5pdGlvbikuCisgICogICAgICAgIC0gZ1N0YXRlIGNvbnRhaW5zIFNNQVJUQ0FSRCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZC4gSEFMIFNNQVJUQ0FSRCBJbml0IGZ1bmN0aW9uIGFscmVhZHkgY2FsbGVkKQorICAqICAgICAgICAgIGI0LWIzICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUGVyaXBoZXJhbCBidXN5IHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpCisgICogICAgICAgICAgYjEgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGIwICAgICBUeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgUnhTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjUgICAgIFBlcmlwaGVyYWwgaW5pdGlhbGl6YXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgIGI0LWIyICAobm90IHVzZWQpCisgICogICAgICAgICAgICB4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMAorICAqICAgICAgICAgIGIxICAgICBSeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgYjAgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMC4KKyAgKi8KK3R5cGVkZWYgdWludDMyX3QgSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZgoreworICBVU0FSVF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAvKiE8IFVTQVJUIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgU01BUlRDQVJEX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLworCisgIFNNQVJUQ0FSRF9BZHZGZWF0dXJlSW5pdFR5cGVEZWYgICBBZHZhbmNlZEluaXQ7ICAgICAgICAgIC8qITwgU21hcnRDYXJkIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gU21hcnRDYXJkIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgICAgICAgLyohPCBTbWFydENhcmQgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAgICAgIC8qITwgU21hcnRDYXJkIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gU21hcnRDYXJkIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgICAgICAgLyohPCBTbWFydENhcmQgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAgICAgIC8qITwgU21hcnRDYXJkIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgTmJSeERhdGFUb1Byb2Nlc3M7ICAgICAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYIElTUiBleGVjdXRpb24gICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIE5iVHhEYXRhVG9Qcm9jZXNzOyAgICAgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBUWCBJU1IgZXhlY3V0aW9uICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBGaWZvTW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBGSUZPIG1vZGUgd2lsbCBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJERXhfRklGT19tb2RlLiAqLworCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBSeCBJUlEgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqVHhJU1IpKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVJRIGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1hdHg7ICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgVHggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAgICAgIC8qITwgU21hcnRDYXJkIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiAgIGdTdGF0ZTsgICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnbG9iYWwgSGFuZGxlIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxzbyByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgICBSeFN0YXRlOyAgICAgICAgICAgICAgIC8qITwgU21hcnRDYXJkIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIFR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgVHggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgUnggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAgLyohPCBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgKi8KKworICB2b2lkICgqIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgLyohPCBTTUFSVENBUkQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKworICB2b2lkICgqIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgLyohPCBTTUFSVENBUkQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAgKi8KKworICB2b2lkICgqIFJ4Rmlmb0Z1bGxDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAgLyohPCBTTUFSVENBUkQgUnggRmlmbyBGdWxsIENhbGxiYWNrICAgICAgICAgICAgKi8KKworICB2b2lkICgqIFR4Rmlmb0VtcHR5Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgLyohPCBTTUFSVENBUkQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAgICAgLyohPCBTTUFSVENBUkQgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAgLyohPCBTTUFSVENBUkQgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gU01BUlRDQVJEX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUFSVENBUkQgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9TTUFSVENBUkRfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBTTUFSVENBUkQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFNNQVJUQ0FSRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfU01BUlRDQVJEX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgU01BUlRDQVJEIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCA9IDB4MDRVLCAgICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRCAqLworICBIQUxfU01BUlRDQVJEX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgID0gMHgwNVUsICAgIC8qITwgU01BUlRDQVJEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICovCisgIEhBTF9TTUFSVENBUkRfUlhfRklGT19GVUxMX0NCX0lEICAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBTTUFSVENBUkQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElEICAgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9UWF9GSUZPX0VNUFRZX0NCX0lEICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IFNNQVJUQ0FSRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElEICAgICAgICAgICAqLworCisgIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA4VSwgICAgLyohPCBTTUFSVENBUkQgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDlVICAgICAvKiE8IFNNQVJUQ0FSRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworCit9IEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFNNQVJUQ0FSRCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwU01BUlRDQVJEX0NhbGxiYWNrVHlwZURlZikoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgLyohPCBwb2ludGVyIHRvIGFuIFNNQVJUQ0FSRCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGNsb2NrIHNvdXJjZXMKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzEgICAgID0gMHgwMFUsIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSSAgICAgICA9IDB4MDJVLCAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgICAgICAgICovCisgIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgPSAweDA0VSwgLyohPCBTWVNDTEsgY2xvY2sgc291cmNlICAgICAgICAqLworICBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfTFNFICAgICAgID0gMHgwOFUsIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRCA9IDB4MTBVICAvKiE8IHVuZGVmaW5lZCBjbG9jayBzb3VyY2UgICAgICovCit9IFNNQVJUQ0FSRF9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9Db25zdGFudHMgIFNNQVJUQ0FSRCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9TdGF0ZV9EZWZpbml0aW9uIFNNQVJUQ0FSRCBTdGF0ZSBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkgICAgICAgICAgICAweDAwMDAwMDIwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1kgICAgICAgICAgICAgMHgwMDAwMDAyNFUgICAgICAgICAgICAgICAgICAgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCAgICAgICAgICAweDAwMDAwMDIxVSAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYICAgICAgICAgIDB4MDAwMDAwMjJVICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBSeFN0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYX1JYICAgICAgIDB4MDAwMDAwMjNVICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB0byBiZSB1c2VkIGZvciBuZWl0aGVyIGdTdGF0ZSBub3IgUnhTdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyByZXN1bHQgb2YgY29tYmluYXRpb24gKE9yKSBiZXR3ZWVuIGdTdGF0ZSBhbmQgUnhTdGF0ZSB2YWx1ZXMgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9USU1FT1VUICAgICAgICAgIDB4MDAwMDAwQTBVICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9FUlJPUiAgICAgICAgICAgIDB4MDAwMDAwRTBVICAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FcnJvcl9EZWZpbml0aW9uIFNNQVJUQ0FSRCBFcnJvciBDb2RlIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfUEUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9ORSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAgICAgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX0ZFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgICAgICAgICAvKiE8IGZyYW1lIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfT1JFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpICAgICAgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX1JUTyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgICAgICAgICAvKiE8IFJlY2VpdmVyIFRpbWVPdXQgZXJyb3IgICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKCh1aW50MzJfdCkweDAwMDAwMDQwVSkgICAgICAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Xb3JkX0xlbmd0aCBTTUFSVENBUkQgV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfV09SRExFTkdUSF85QiAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxlbmd0aCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfU3RvcF9CaXRzIFNNQVJUQ0FSRCBOdW1iZXIgb2YgU3RvcCBCaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMCAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1NUT1BCSVRTXzFfNSAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1AgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSB3aXRoIDEuNSBzdG9wIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1Bhcml0eSBTTUFSVENBUkQgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBldmVuIHBhcml0eSAqLworI2RlZmluZSBTTUFSVENBUkRfUEFSSVRZX09ERCAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgIC8qITwgU01BUlRDQVJEIGZyYW1lIG9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Nb2RlIFNNQVJUQ0FSRCBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfUlggICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfTU9ERV9UWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIFRYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9NT0RFX1RYX1JYICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfVEUgfFVTQVJUX0NSMV9SRSkgICAgLyohPCBTTUFSVENBUkQgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Nsb2NrX1BvbGFyaXR5IFNNQVJUQ0FSRCBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QT0xBUklUWV9MT1cgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgbG93IHBvbGFyaXR5ICAqLworI2RlZmluZSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BPTCAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGhpZ2ggcG9sYXJpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Nsb2NrX1BoYXNlIFNNQVJUQ0FSRCBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QSEFTRV8xRURHRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgcGhhc2Ugb24gZmlyc3QgY2xvY2sgdHJhbnNpdGlvbiAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBvbiBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfTGFzdF9CaXQgU01BUlRDQVJEIExhc3QgQml0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG5vdCBvdXRwdXQgdG8gU0NMSyBwaW4gKi8KKyNkZWZpbmUgU01BUlRDQVJEX0xBU1RCSVRfRU5BQkxFICAgICAgICAgICAgVVNBUlRfQ1IyX0xCQ0wgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG91dHB1dCB0byBTQ0xLIHBpbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX09uZUJpdF9TYW1wbGluZyBTTUFSVENBUkQgT25lIEJpdCBTYW1wbGluZyBNZXRob2QKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIG9uZS1iaXQgc2FtcGxlIGRpc2FibGVkICovCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUgICAgIFVTQVJUX0NSM19PTkVCSVQgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgb25lLWJpdCBzYW1wbGUgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX05BQ0tfRW5hYmxlIFNNQVJUQ0FSRCBOQUNLIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gZGlzYWJsZWQgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9OQUNLX0VOQUJMRSAgICAgICAgICAgICAgIFVTQVJUX0NSM19OQUNLICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfVGltZW91dF9FbmFibGUgU01BUlRDQVJEIFRpbWVvdXQgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RJTUVPVVRfRElTQUJMRSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGRpc2FibGVkICovCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0VOQUJMRSAgICAgICAgICAgIFVTQVJUX0NSMl9SVE9FTiAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfQ2xvY2tQcmVzY2FsZXIgIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMSAgICAweDAwMDAwMDAwVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjIgICAgMHgwMDAwMDAwMVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8yICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVY0ICAgIDB4MDAwMDAwMDJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNCAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNiAgICAweDAwMDAwMDAzVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzYgICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjggICAgMHgwMDAwMDAwNFUgIC8qITwgZmNsa19wcmVzID0gZmNsay84ICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxMCAgIDB4MDAwMDAwMDVVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMTIgICAweDAwMDAwMDA2VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjE2ICAgMHgwMDAwMDAwN1UgIC8qITwgZmNsa19wcmVzID0gZmNsay8xNiAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYzMiAgIDB4MDAwMDAwMDhVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMzIgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNjQgICAweDAwMDAwMDA5VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzY0ICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjEyOCAgMHgwMDAwMDAwQVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMjggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYyNTYgIDB4MDAwMDAwMEJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9UeF9JbnYgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUgICBVU0FSVF9DUjJfVFhJTlYgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUnhfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFICAgVVNBUlRfQ1IyX1JYSU5WICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0RhdGFfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIEJpbmFyeSBEYXRhIGludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1J4X1R4X1N3YXAgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgUlggVFggcGlucyBzd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFICAgIFVTQVJUX0NSMl9TV0FQICAgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfT3ZlcnJ1bl9EaXNhYmxlIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE92ZXJydW4gRGlzYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGVuYWJsZSAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFICBVU0FSVF9DUjNfT1ZSRElTICAgICAgICAgICAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgRE1BIERpc2FibGUgb24gUnggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgRE1BIGVuYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SICBVU0FSVF9DUjNfRERSRSAgICAgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX01TQl9GaXJzdCAgIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE1TQiBmaXJzdAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUmVxdWVzdF9QYXJhbWV0ZXJzIFNNQVJUQ0FSRCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIGZsdXNoIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgVVNBUlRfUlFSX1RYRlJRICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggcmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfSW50ZXJydXB0aW9uX01hc2sgU01BUlRDQVJEIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRlUgICAvKiE8IFNNQVJUQ0FSRCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBFMFUgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIG1hc2sgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9QT1MgICAgICAgICAgICAgICAgICAgIDVVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUYwMFUgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgbWFzayAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfUE9TICAgICAgICAgICAgICAgICAgIDhVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgcG9zaXRpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfTWFjcm9zICBTTUFSVENBUkQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgU01BUlRDQVJEIGhhbmRsZSBzdGF0ZXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2VuZGlmIC8qVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICAqLworCisvKiogQGJyaWVmICBGbHVzaCB0aGUgU21hcnRjYXJkIERhdGEgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUEVGICAgIFBhcml0eSBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0ZFRiAgICBGcmFtaW5nIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfTkVGICAgIE5vaXNlIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfT1JFRiAgIE92ZXJSdW4gZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDQkdURiBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0VPQkYgICBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfUEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfRkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfTkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfTkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX09SRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIElETEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgU01BUlRDQVJEX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU21hcnRjYXJkIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RDQkdUIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBmbGFnICh3aGVuIGZsYWcgYXZhaWxhYmxlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0VPQkYgIEVuZCBvZiBibG9jayBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlRPRiAgUmVjZWl2ZXIgdGltZW91dCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19PUkUgICBPdmVycnVuIGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19ORSAgICBOb2lzZSBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfRkUgICAgRnJhbWluZyBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUEUgICAgUGFyaXR5IGVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UWEZORiBUWEZJRk8gbm90IGZ1bGwgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RYRkUgIFRYRklGTyBFbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlhGRiAgUlhGSUZPIEZ1bGwgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1JYRlQgIFNNQVJUQ0FSRCBSWEZJRk8gdGhyZXNob2xkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UWEZUICBTTUFSVENBUkQgVFhGSUZPIHRocmVzaG9sZCBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgaW50ZXJydXB0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FT0IgICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICAgUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEUgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9QRSAgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGTkYgIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZGICAgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRkUgICBUWEZJRk8gZW1wdHkgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRlQgICBSWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRlQgICBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU21hcnRDYXJkIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FT0IgICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICAgUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEUgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9QRSAgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGTkYgIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZGICAgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRkUgICBUWEZJRk8gZW1wdHkgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRlQgICBSWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRlQgICBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU21hcnRDYXJkIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FT0IgICAgRW5kIG9mIGJsb2NrIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SVE8gICAgUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEUgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9QRSAgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGTkYgIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZGICAgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRkUgICBUWEZJRk8gZW1wdHkgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRlQgICBSWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRlQgICBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JU1JfTUFTSyk+PiBTTUFSVENBUkRfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRU9CICAgIEVuZCBvZiBibG9jayBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlRPICAgIFJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhFICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDICAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RDQkdUICBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgaW50ZXJydXB0ICh3aGVuIGludGVycnVwdGlvbiBhdmFpbGFibGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYTkUgICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgIEVycm9yIGludGVycnVwdChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRk5GICBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZORSAgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGRiAgIFJYRklGTyBmdWxsIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZFICAgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZUICAgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZUICAgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDB4MDFVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDB4MDJVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgodWludDMyX3QpMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpICAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9DTEVBUl9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1BFRiAgICBQYXJpdHkgZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX05FRiAgICBOb2lzZSBkZXRlY3RlZCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX09SRUYgICBPdmVyUnVuIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfSURMRUYgIElkbGUgbGluZSBkZXRlY3Rpb24gY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDQkdURiBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY2xlYXIgZmxhZyAod2hlbiBmbGFnIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUlRPRiAgIFJlY2VpdmVyIHRpbWVvdXQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9FT0JGICAgRW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiB8PSAodWludDMyX3QpKF9fSVRfQ0xFQVJfXykpCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIFNNQVJUQ0FSRCByZXF1ZXN0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBkYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9TRU5EX1JFUShfX0hBTkRMRV9fLCBfX1JFUV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSIHw9ICh1aW50MTZfdCkoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgU01BUlRDQVJEIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjN8PSBVU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBTTUFSVENBUkQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVVTQVJUX0NSM19PTkVCSVQpKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIFVTQVJUIGFzc29jaWF0ZWQgdG8gdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gIFVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgVVNBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIEhhbmRsZQorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICB+VVNBUlRfQ1IxX1VFKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfTWFjcm9zIFNNQVJUQ0FSRCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgU01BUlRDQVJEIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAgKiBAcmV0dmFsIHRoZSBTTUFSVENBUkQgY2xvY2tpbmcgc291cmNlLCB3cml0dGVuIGluIF9fQ0xPQ0tTT1VSQ0VfXy4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MHh4KQorI2RlZmluZSBTTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkKKyNkZWZpbmUgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbmRpZgorCisvKiogQGJyaWVmICBDaGVjayB0aGUgQmF1ZCByYXRlIHJhbmdlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBHMCAoNjQgTUh6KQorICAqICAgICAgICAgZGl2aWRlZCBieSB0aGUgb3ZlcnNhbXBsaW5nIHVzZWQgb24gdGhlIFNNQVJUQ0FSRCAoaS5lLiAxNikuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHNldCBieSB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbi4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA0MDAwMDAxVSkKKworLyoqIEBicmllZiAgQ2hlY2sgdGhlIGJsb2NrIGxlbmd0aCByYW5nZS4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFNNQVJUQ0FSRCBibG9jayBsZW5ndGggaXMgMHhGRi4KKyAgKiBAcGFyYW0gIF9fTEVOR1RIX18gYmxvY2sgbGVuZ3RoLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9CTE9DS0xFTkdUSChfX0xFTkdUSF9fKSAoKF9fTEVOR1RIX18pIDw9IDB4RkZVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZS4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IHZhbHVlIGlzIDB4RkZGRkZGLgorICAqIEBwYXJhbSAgX19USU1FT1VUVkFMVUVfXyByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKF9fVElNRU9VVFZBTFVFX18pICAgICgoX19USU1FT1VUVkFMVUVfXykgPD0gMHhGRkZGRkZVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgU01BUlRDQVJEIGF1dG9yZXRyeSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBpcyAweDcuCisgICogQHBhcmFtICBfX0NPVU5UX18gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucy4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQVVUT1JFVFJZX0NPVU5UKF9fQ09VTlRfXykgICAgICAgICAoKF9fQ09VTlRfXykgPD0gMHg3VSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFNNQVJUQ0FSRCBmcmFtZSBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKF9fTEVOR1RIX18pID09IFNNQVJUQ0FSRF9XT1JETEVOR1RIXzlCKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUT1BCSVRTX18gU01BUlRDQVJEIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMuCisgICogQHJldHZhbCBTRVQgKF9fU1RPUEJJVFNfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RPUEJJVFNfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFNNQVJUQ0FSRF9TVE9QQklUU18wXzUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFNNQVJUQ0FSRF9TVE9QQklUU18xXzUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBwYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSSVRZX18gU01BUlRDQVJEIGZyYW1lIHBhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBTTUFSVENBUkRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBTTUFSVENBUkRfUEFSSVRZX09ERCkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gU01BUlRDQVJEIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTU9ERShfX01PREVfXykgKCgoKF9fTU9ERV9fKSAmIDB4RkZGM1UpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBvbGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NQT0xfXyBTTUFSVENBUkQgZnJhbWUgcG9sYXJpdHkuCisgICogQHJldHZhbCBTRVQgKF9fQ1BPTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUE9MX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1BPTEFSSVRZKF9fQ1BPTF9fKSAoKChfX0NQT0xfXykgPT0gU01BUlRDQVJEX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gU01BUlRDQVJEX1BPTEFSSVRZX0hJR0gpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUEhBX18gU01BUlRDQVJEIGZyYW1lIHBoYXNlLgorICAqIEByZXR2YWwgU0VUIChfX0NQSEFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BIQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9QSEFTRShfX0NQSEFfXykgKCgoX19DUEhBX18pID09IFNNQVJUQ0FSRF9QSEFTRV8xRURHRSkgfHwgKChfX0NQSEFfXykgPT0gU01BUlRDQVJEX1BIQVNFXzJFREdFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MQVNUQklUX18gU01BUlRDQVJEIGZyYW1lIGxhc3QgYml0IGNsb2NrIHB1bHNlIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fTEFTVEJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MQVNUQklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0xBU1RCSVQoX19MQVNUQklUX18pICgoKF9fTEFTVEJJVF9fKSA9PSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xBU1RCSVRfXykgPT0gU01BUlRDQVJEX0xBU1RCSVRfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fT05FQklUX18gU01BUlRDQVJEIGZyYW1lIHNhbXBsaW5nLgorICAqIEByZXR2YWwgU0VUIChfX09ORUJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PTkVCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUoX19PTkVCSVRfXykgKCgoX19PTkVCSVRfXykgPT0gU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT05FQklUX18pID09IFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBOQUNLIHRyYW5zbWlzc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX05BQ0tfXyBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19OQUNLX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX05BQ0tfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTkFDSyhfX05BQ0tfXykgKCgoX19OQUNLX18pID09IFNNQVJUQ0FSRF9OQUNLX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OQUNLX18pID09IFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVElNRU9VVF9fIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1RJTUVPVVQoX19USU1FT1VUX18pICgoKF9fVElNRU9VVF9fKSA9PSBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgY2xvY2sgUHJlc2NhbGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NMT0NLUFJFU0NBTEVSX18gU01BUlRDQVJEIGNsb2NrIFByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DTE9DS1BSRVNDQUxFUl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9DTE9DS1BSRVNDQUxFUihfX0NMT0NLUFJFU0NBTEVSX18pICgoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjIpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVY0KSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNikgICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjgpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxMCkgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMTIpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjE2KSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYzMikgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNjQpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjEyOCkgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYyNTYpKQorCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0aWFsaXphdGlvbiBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19JTklUX18gU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICgoX19JTklUX18pIDw9IChTTUFSVENBUkRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RYSU5WX18gU01BUlRDQVJEIGZyYW1lIFRYIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1RYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAoKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1JYSU5WX18gU01BUlRDQVJEIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1JYSU5WX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1JYSU5WX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlYoX19SWElOVl9fKSAoKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JYSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fREFUQUlOVl9fIFNNQVJUQ0FSRCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICgoKF9fREFUQUlOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgUlgvVFggcGlucyBzd2FwIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1dBUF9fIFNNQVJUQ0FSRCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TV0FQX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NXQVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAoKChfX1NXQVBfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1dBUF9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIG92ZXJydW4gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PVkVSUlVOX18gU01BUlRDQVJEIGZyYW1lIG92ZXJydW4gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19PVkVSUlVOX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09WRVJSVU5fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfT1ZFUlJVTihfX09WRVJSVU5fXykgKCgoX19PVkVSUlVOX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WRVJSVU5fXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFKSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQV9fIFNNQVJUQ0FSRCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAoKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01TQkZJUlNUX18gU01BUlRDQVJEIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01TQkZJUlNUX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIHJlcXVlc3QgcGFyYW1ldGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUkFNX18gU01BUlRDQVJEIHJlcXVlc3QgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgKCgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFNNQVJUQ0FSRCBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9zbWFydGNhcmRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0RlSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworCitIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9TTUFSVENBUkRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF9zbWFydGNhcmRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ0Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkX2V4LmgKQEAgLTAsMCArMSwzMzggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3NtYXJ0Y2FyZF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTTUFSVENBUkQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1NNQVJUQ0FSRF9FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfU01BUlRDQVJEX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfQ29uc3RhbnRzICBTTUFSVENBUkQgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9UcmFuc21pc3Npb25fQ29tcGxldGlvbl9JbmRpY2F0aW9uIFNNQVJUQ0FSRCBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBJbmRpY2F0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RDQkdUICAgICAgU01BUlRDQVJEX0lUX1RDQkdUIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSAqLworI2RlZmluZSBTTUFSVENBUkRfVEMgICAgICAgICBTTUFSVENBUkRfSVRfVEMgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIChmbGFnIHJhaXNlZCB3aGVuIGd1YXJkIHRpbWUgaGFzIGVsYXBzZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gdHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX05PX0lOSVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgTm8gYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDFVICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDJVICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCAgICAgICAgIDB4MDAwMDAwMDRVICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfSU5JVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgIC8qITwgVFgvUlggcGlucyBzd2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgIDB4MDAwMDAwMTBVICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQURJU0FCTEVPTkVSUk9SX0lOSVQgIDB4MDAwMDAwMjBVICAgIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwODBVICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYQ09NUExFVElPTiAgICAgICAgICAgIDB4MDAwMDAxMDBVICAgIC8qITwgVFggY29tcGxldGlvbiBpbmRpY2F0aW9uIGJlZm9yZSBvZiBhZnRlciBndWFyZCB0aW1lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0ZJRk9fbW9kZSBTTUFSVENBUkRFeCBGSUZPIG1vZGUKKyAgKiBAYnJpZWYgICAgU01BUlRDQVJEIEZJRk8gbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GSUZPTU9ERV9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEUgICAgICAgICBVU0FSVF9DUjFfRklGT0VOICAgICAgICAgICAgICAvKiE8IEZJRk8gbW9kZSBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgU01BUlRDQVJERXggVFhGSUZPIHRocmVzaG9sZCBsZXZlbAorICAqIEBicmllZiAgICBTTUFSVENBUkQgVFhGSUZPIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV84ICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF8xXzQgICBVU0FSVF9DUjNfVFhGVENGR18wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19UWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfM180ICAgKFVTQVJUX0NSM19UWEZUQ0ZHXzB8VVNBUlRfQ1IzX1RYRlRDRkdfMSkgIC8qITwgVFhGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF83XzggICBVU0FSVF9DUjNfVFhGVENGR18yICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfVFhGVENGR18yfFVTQVJUX0NSM19UWEZUQ0ZHXzApICAvKiE8IFRYRklGTyBiZWNvbWVzIGVtcHR5ICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUlhGSUZPX3RocmVzaG9sZF9sZXZlbCBTTUFSVENBUkRFeCBSWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQGJyaWVmICAgIFNNQVJUQ0FSRCBSWEZJRk8gbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8xXzggICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV80ICAgVVNBUlRfQ1IzX1JYRlRDRkdfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19SWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS8yIG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8zXzQgICAoVVNBUlRfQ1IzX1JYRlRDRkdfMHxVU0FSVF9DUjNfUlhGVENGR18xKSAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfN184ICAgVVNBUlRfQ1IzX1JYRlRDRkdfMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfUlhGVENGR18yfFVTQVJUX0NSM19SWEZUQ0ZHXzApICAvKiE8IFJYRklGTyBGSUZPIGJlY29tZXMgZnVsbCAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9GbGFncyBTTUFSVENBUkQgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RDQkdUICAgICAgICAgIFVTQVJUX0lTUl9UQ0JHVCAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JFQUNLICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RFQUNLICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0JVU1kgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgIC8qITwgU01BUlRDQVJEIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0VPQkYgICAgICAgICAgIFVTQVJUX0lTUl9FT0JGICAgICAgICAgIC8qITwgU01BUlRDQVJEIGVuZCBvZiBibG9jayBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JUT0YgICAgICAgICAgIFVTQVJUX0lTUl9SVE9GICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRSAgICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRk5GICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RDICAgICAgICAgICAgIFVTQVJUX0lTUl9UQyAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYTkUgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgU01BUlRDQVJEIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRk5FICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0lETEUgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3Rpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX09SRSAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX05FICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0ZFICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1BFICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRkUgICAgICAgICAgIFVTQVJUX0lTUl9UWEZFICAgICAgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyBFbXB0eSBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRkYgICAgICAgICAgIFVTQVJUX0lTUl9SWEZGICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyBGdWxsIGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRlQgICAgICAgICAgIFVTQVJUX0lTUl9SWEZUICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRlQgICAgICAgICAgIFVTQVJUX0lTUl9UWEZUICAgICAgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0ludGVycnVwdF9kZWZpbml0aW9uIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMFpaWlpaMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDUgYml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyIGJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDUgYml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVFhFICAgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVFhGTkYgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVEMgICAgICAgICAgICAgICAgICAgICAweDA2MjZVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlhGTkUgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfSURMRSAgICAgICAgICAgICAgICAgICAweDA0MjRVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBpZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdGlvbiAgICAgICAgICAqLworCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9FUlIgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9PUkUgICAgICAgICAgICAgICAgICAgIDB4MDMwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9ORSAgICAgICAgICAgICAgICAgICAgIDB4MDIwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9GRSAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX0VPQiAgICAgICAgICAgICAgICAgICAgMHgwQzNCVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JUTyAgICAgICAgICAgICAgICAgICAgMHgwQjNBVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RDQkdUICAgICAgICAgICAgICAgICAgMHgxOTc4VSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gaW50ZXJydXB0aW9uICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JYRkYgICAgICAgICAgICAgICAgICAgIDB4MTgzRlUgICAgICAgICAgLyohPCBTTUFSVENBUkQgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RYRkUgICAgICAgICAgICAgICAgICAgIDB4MTczRVUgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JYRlQgICAgICAgICAgICAgICAgICAgIDB4MUE3Q1UgICAgICAgICAgLyohPCBTTUFSVENBUkQgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RYRlQgICAgICAgICAgICAgICAgICAgIDB4MUI3N1UgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfSVRfQ0xFQVJfRmxhZ3MgU01BUlRDQVJEIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciBjbGVhciBmbGFnICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgIC8qITwgU01BUlRDQVJEIGZyYW1pbmcgZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9ORUNGICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yIGRldGVjdGVkIGNsZWFyIGZsYWcgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3RlZCBjbGVhciBmbGFnICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgICAgICAgICAgICAgIFVTQVJUX0lDUl9UWEZFQ0YgIC8qITwgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UQ0JHVEYgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0JHVENGIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX1JUT0YgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1JUT0NGICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZSBvdXQgY2xlYXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX0VPQkYgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUHJpdmF0ZV9NYWNyb3MgU01BUlRDQVJEIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgU2V0IHRoZSBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgSWYgVENCR1QgKFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSkgZmxhZyBpcyBub3QgYXZhaWxhYmxlIG9yIGlmCisgICogICAgICAgIEFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uIGlzIG5vdCBhbHJlYWR5IGZpbGxlZCwgdGhlIGxhdHRlciBpcyBmb3JjZWQKKyAgKiAgICAgICAgdG8gU01BUlRDQVJEX1RDICh0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIHdoZW4gZ3VhcmQgdGltZSBoYXMgZWxhcHNlZCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UUkFOU01JU1NJT05fQ09NUExFVElPTl9TRVRUSU5HKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYQ09NUExFVElPTikpICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID0gU01BUlRDQVJEX1RDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT04oKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbikpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBSZXR1cm4gdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgQmFzZWQgb24gQWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24gc2V0dGluZywgcmV0dXJuIFRDIG9yIFRDQkdUIGZsYWcuCisgICogICAgICAgIFdoZW4gVENCR1QgZmxhZyAoVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lKSBpcyBub3QgYXZhaWxhYmxlLCBUQyBmbGFnIGlzCisgICogICAgICAgIHJlcG9ydGVkLgorICAqIEByZXR2YWwgVHJhbnNtaXNzaW9uIGNvbXBsZXRpb24gZmxhZworICAqLworI2RlZmluZSBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fRkxBRyhfX0hBTkRMRV9fKSAgXAorICAoKChfX0hBTkRMRV9fKS0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24gPT0gU01BUlRDQVJEX1RDKSA/IChTTUFSVENBUkRfRkxBR19UQykgOiAgKFNNQVJUQ0FSRF9GTEFHX1RDQkdUKSkKKworCisvKiogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSB0cmFuc21pc3Npb24gY29tcGxldGlvbiB1c2VkIGZsYWcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVFhDT01QTEVURV9fIFNNQVJUQ0FSRCBmcmFtZSB0cmFuc21pc3Npb24gY29tcGxldGlvbiB1c2VkIGZsYWcuCisgICogQHJldHZhbCBTRVQgKF9fVFhDT01QTEVURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19UWENPTVBMRVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OKF9fVFhDT01QTEVURV9fKSAoKChfX1RYQ09NUExFVEVfXykgPT0gU01BUlRDQVJEX1RDQkdUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UWENPTVBMRVRFX18pID09IFNNQVJUQ0FSRF9UQykpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIEZJRk8gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVEFURV9fIFNNQVJUQ0FSRCBGSUZPIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fU1RBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RBVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfRklGT01PREVfU1RBVEUoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IFNNQVJUQ0FSRF9GSUZPTU9ERV9ESVNBQkxFICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gU01BUlRDQVJEX0ZJRk9NT0RFX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVEhSRVNIT0xEX18gU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwuCisgICogQHJldHZhbCBTRVQgKF9fVEhSRVNIT0xEX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RIUkVTSE9MRF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICgoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF8xXzQpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV8yKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzNfNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF83XzgpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfOF84KSkKKworLyoqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgUlhGSUZPIHRocmVzaG9sZCBsZXZlbCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USFJFU0hPTERfXyBTTUFSVENBUkQgUlhGSUZPIHRocmVzaG9sZCBsZXZlbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1JYRklGT19USFJFU0hPTEQoX19USFJFU0hPTERfXykgKCgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV84KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8xXzIpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfM180KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzdfOCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF84XzgpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJTyBvcGVyYXRpb24gbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90IEJsb2NrTGVuZ3RoKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRFeF9UaW1lT3V0X0NvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGltZU91dFZhbHVlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9FbmFibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfU01BUlRDQVJERXhfUnhGaWZvRnVsbENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRW5hYmxlRmlmb01vZGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVGaWZvTW9kZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfU2V0VHhGaWZvVGhyZXNob2xkKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaHJlc2hvbGQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X1NldFJ4Rmlmb1RocmVzaG9sZChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGhyZXNob2xkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9IQUxfU01BUlRDQVJEX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3NtYnVzLmggYi9JbmMvc3RtMzJnMHh4X2hhbF9zbWJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9zbWJ1cy5oCkBAIC0wLDAgKzEsNzQzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9zbWJ1cy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTTUJVUyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfU01CVVNfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1NNQlVTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVUworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX1R5cGVzIFNNQlVTIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19Db25maWd1cmF0aW9uX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNNQlVTIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFNNQlVTIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNNQlVTX1RJTUlOR1JfcmVnaXN0ZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FsY3VsYXRlZCBieSByZWZlcnJpbmcgdG8gU01CVVMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBSZWZlcmVuY2UgbWFudWFsICovCisgIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcjsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIEFuYWxvZyBGaWx0ZXIgaXMgZW5hYmxlIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX0FuYWxvZ19GaWx0ZXIgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlyc3QgZGV2aWNlIG93biBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUgZm9yIG1hc3RlciBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2FkZHJlc3NpbmdfbW9kZSAqLworCisgIHVpbnQzMl90IER1YWxBZGRyZXNzTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfZHVhbF9hZGRyZXNzaW5nX21vZGUgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMjsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczJNYXNrczsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFja25vbGVkZ2UgbWFzayBhZGRyZXNzIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX293bl9hZGRyZXNzMl9tYXNrcy4gKi8KKworICB1aW50MzJfdCBHZW5lcmFsQ2FsbE1vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBnZW5lcmFsIGNhbGwgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2dlbmVyYWxfY2FsbF9hZGRyZXNzaW5nX21vZGUuICovCisKKyAgdWludDMyX3QgTm9TdHJldGNoTW9kZTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgbm9zdHJldGNoIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19ub3N0cmV0Y2hfbW9kZSAqLworCisgIHVpbnQzMl90IFBhY2tldEVycm9yQ2hlY2tNb2RlOyAgIC8qITwgU3BlY2lmaWVzIGlmIFBhY2tldCBFcnJvciBDaGVjayBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfcGFja2V0X2Vycm9yX2NoZWNrX21vZGUgKi8KKworICB1aW50MzJfdCBQZXJpcGhlcmFsTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBtb2RlIG9mIFBlcmlwaGFsIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfcGVyaXBoZXJhbF9tb2RlICovCisKKyAgdWludDMyX3QgU01CdXNUaW1lb3V0OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIDMyIEJpdHMgU01CVVNfVElNRU9VVF9yZWdpc3RlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVuYWJsZSBiaXRzIGFuZCBkaWZmZXJlbnQgdGltZW91dCB2YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FsY3VsYXRlZCBieSByZWZlcnJpbmcgdG8gU01CVVMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBSZWZlcmVuY2UgbWFudWFsICovCit9IFNNQlVTX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfc3RhdGVfZGVmaW5pdGlvbiBIQUwgc3RhdGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfUkVTRVQgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgU01CVVMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9SRUFEWSAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBTTUJVUyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0JVU1kgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IFNNQlVTIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICgweDAwMDAwMDEyVSkgIC8qITwgTWFzdGVyIERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCAgKDB4MDAwMDAwMjJVKSAgLyohPCBNYXN0ZXIgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFggICAoMHgwMDAwMDAzMlUpICAvKiE8IFNsYXZlIERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICgweDAwMDAwMDQyVSkgIC8qITwgU2xhdmUgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9USU1FT1VUICAgICAgICAgKDB4MDAwMDAwMDNVKSAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0VSUk9SICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAvKiE8IFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTElTVEVOICAgICAgICAgICgweDAwMDAwMDA4VSkgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgaXMgb25nb2luZyAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FcnJvcl9Db2RlX2RlZmluaXRpb24gU01CVVMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBTTUJVUyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfTk9ORSAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQkVSUiAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBCRVJSIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQVJMTyAgICAgICAgICAgICgweDAwMDAwMDAyVSkgICAgLyohPCBBUkxPIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQUNLRiAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAgLyohPCBBQ0tGIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfT1ZSICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSEFMVElNRU9VVCAgICAgICgweDAwMDAwMDEwVSkgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQlVTVElNRU9VVCAgICAgICgweDAwMDAwMDIwVSkgICAgLyohPCBCdXMgVGltZW91dCBlcnJvciAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfQUxFUlQgICAgICAgICAgICgweDAwMDAwMDQwVSkgICAgLyohPCBBbGVydCBlcnJvciAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfUEVDRVJSICAgICAgICAgICgweDAwMDAwMDgwVSkgICAgLyohPCBQRUMgZXJyb3IgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgKDB4MDAwMDAxMDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2RlZmluZSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9QQVJBTSAgICAoMHgwMDAwMDIwMFUpICAgLyohPCBJbnZhbGlkIFBhcmFtZXRlcnMgZXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfaGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNNQlVTIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU01CVVMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZgoreworICBJMkNfVHlwZURlZiAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgLyohPCBTTUJVUyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICovCisKKyAgU01CVVNfSW5pdFR5cGVEZWYgICAgICAgICAgICBJbml0OyAgICAgICAgICAgIC8qITwgU01CVVMgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgKnBCdWZmUHRyOyAgICAgICAvKiE8IFBvaW50ZXIgdG8gU01CVVMgdHJhbnNmZXIgYnVmZmVyICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFhmZXJTaXplOyAgICAgICAgLyohPCBTTUJVUyB0cmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICBYZmVyQ291bnQ7ICAgICAgIC8qITwgU01CVVMgdHJhbnNmZXIgY291bnRlciAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgWGZlck9wdGlvbnM7ICAgICAvKiE8IFNNQlVTIHRyYW5zZmVyIG9wdGlvbnMgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIFByZXZpb3VzU3RhdGU7ICAgLyohPCBTTUJVUyBjb21tdW5pY2F0aW9uIFByZXZpb3VzIHN0YXRlICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgIC8qITwgU01CVVMgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgICAvKiE8IFNNQlVTIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgLyohPCBTTUJVUyBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBNYXN0ZXJUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgIC8qITwgU01CVVMgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIE1hc3RlclJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgLyohPCBTTUJVUyBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogU2xhdmVUeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAvKiE8IFNNQlVTIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBTbGF2ZVJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgIC8qITwgU01CVVMgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqIExpc3RlbkNwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgLyohPCBTTUJVUyBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgICAgICAgICAgICAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgICAgICAvKiE8IFNNQlVTIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICgqIEFkZHJDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgIC8qITwgU01CVVMgU2xhdmUgQWRkcmVzcyBNYXRjaCBjYWxsYmFjayAqLworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAgICAgICAgICAgICAgICAvKiE8IFNNQlVTIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgIC8qITwgU01CVVMgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFNNQlVTX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFNNQlVTIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAwVSwgICAgLyohPCBTTUJVUyBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAxVSwgICAgLyohPCBTTUJVUyBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgPSAweDAyVSwgICAgLyohPCBTTUJVUyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgPSAweDAzVSwgICAgLyohPCBTTUJVUyBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAqLworICBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDA0VSwgICAgLyohPCBTTUJVUyBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworICBIQUxfU01CVVNfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA1VSwgICAgLyohPCBTTUJVUyBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFNNQlVTIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDdVICAgICAvKiE8IFNNQlVTIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUJVUyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwU01CVVNfQ2FsbGJhY2tUeXBlRGVmKShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOyAvKiE8IHBvaW50ZXIgdG8gYW4gU01CVVMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZikoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgLyohPCBwb2ludGVyIHRvIGFuIFNNQlVTIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9Db25zdGFudHMgU01CVVMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19BbmFsb2dfRmlsdGVyIFNNQlVTIEFuYWxvZyBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRSAgICAgICAgICAgICAgSTJDX0NSMV9BTkZPRkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX2R1YWxfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGR1YWwgYWRkcmVzc2luZyBtb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEUgICAgICAgICAgICAgICAgSTJDX09BUjJfT0EyRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfb3duX2FkZHJlc3MyX21hc2tzIFNNQlVTIG93bmFkZHJlc3MyIG1hc2tzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBTTUJVU19PQTJfTk9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAxICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAyICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzAzICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA0ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA1ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA2ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSBTTUJVU19PQTJfTUFTSzA3ICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFNNQlVTX2dlbmVyYWxfY2FsbF9hZGRyZXNzaW5nX21vZGUgU01CVVMgZ2VuZXJhbCBjYWxsIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRSAgICAgICAgICAgICAgICBJMkNfQ1IxX0dDRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfbm9zdHJldGNoX21vZGUgU01CVVMgbm9zdHJldGNoIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRU5BQkxFICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OT1NUUkVUQ0gKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfcGFja2V0X2Vycm9yX2NoZWNrX21vZGUgU01CVVMgcGFja2V0IGVycm9yIGNoZWNrIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19QRUNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19QRUNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9QRUNFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19wZXJpcGhlcmFsX21vZGUgU01CVVMgcGVyaXBoZXJhbCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX0hPU1QgICAgICAgIEkyQ19DUjFfU01CSEVOCisjZGVmaW5lIFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRSAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRV9BUlAgICBJMkNfQ1IxX1NNQkRFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19SZWxvYWRFbmRNb2RlX2RlZmluaXRpb24gU01CVVMgUmVsb2FkRW5kTW9kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSAgU01CVVNfU09GVEVORF9NT0RFICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgU01CVVNfUkVMT0FEX01PREUgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9SRUxPQUQKKyNkZWZpbmUgIFNNQlVTX0FVVE9FTkRfTU9ERSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjJfQVVUT0VORAorI2RlZmluZSAgU01CVVNfU0VORFBFQ19NT0RFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9QRUNCWVRFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX1N0YXJ0U3RvcE1vZGVfZGVmaW5pdGlvbiBTTUJVUyBTdGFydFN0b3BNb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lICBTTUJVU19OT19TVEFSVFNUT1AgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lICBTTUJVU19HRU5FUkFURV9TVE9QICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVE9QKQorI2RlZmluZSAgU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikKKyNkZWZpbmUgIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uIFNNQlVTIFhmZXJPcHRpb25zIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIHdoZW4gZGlyZWN0aW9uIGNoYW5nZQorICogMi0gTm8gUmVzdGFydCBjb25kaXRpb24gaW4gb3RoZXIgdXNlIGNhc2VzCisgKi8KKyNkZWZpbmUgIFNNQlVTX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgIFNNQlVTX1NPRlRFTkRfTU9ERQorI2RlZmluZSAgU01CVVNfTkVYVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoU01CVVNfUkVMT0FEX01PREUgfCBTTUJVU19TT0ZURU5EX01PREUpKQorI2RlZmluZSAgU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgU01CVVNfQVVUT0VORF9NT0RFCisjZGVmaW5lICBTTUJVU19MQVNUX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgICBTTUJVU19BVVRPRU5EX01PREUKKyNkZWZpbmUgIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICgodWludDMyX3QpKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpCisjZGVmaW5lICBTTUJVU19MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICAoKHVpbnQzMl90KShTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUpKQorCisvKiBMaXN0IG9mIFhmZXJPcHRpb25zIGluIHVzYWdlIG9mIDoKKyAqIDEtIFJlc3RhcnQgY29uZGl0aW9uIGluIGFsbCB1c2UgY2FzZXMgKGRpcmVjdGlvbiBjaGFuZ2Ugb3Igbm90KQorICovCisjZGVmaW5lICBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMgICAgICAgICAgICAgICAoMHgwMDAwMDBBQVUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQyAgICAgICAgICAgICAoMHgwMDAwQUEwMFUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMgICAgICAoMHgwMEFBMDAwMFUpCisjZGVmaW5lICBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAoMHhBQTAwMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24gU01CVVMgSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgorICAqIEBicmllZiBTTUJVUyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWFhYWAorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEludGVycnVwdCBjb250cm9sIG1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19JVF9FUlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9FUlJJRQorI2RlZmluZSBTTUJVU19JVF9UQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UQ0lFCisjZGVmaW5lIFNNQlVTX0lUX1NUT1BJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRQorI2RlZmluZSBTTUJVU19JVF9OQUNLSSAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OQUNLSUUKKyNkZWZpbmUgU01CVVNfSVRfQUREUkkgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfQUREUklFCisjZGVmaW5lIFNNQlVTX0lUX1JYSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUKKyNkZWZpbmUgU01CVVNfSVRfVFhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRQorI2RlZmluZSBTTUJVU19JVF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfVFhJKQorI2RlZmluZSBTTUJVU19JVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1JYSSkKKyNkZWZpbmUgU01CVVNfSVRfQUxFUlQgICAgICAgICAgICAgICAgICAgICAgICAgIChTTUJVU19JVF9FUlJJKQorI2RlZmluZSBTTUJVU19JVF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNNQlVTX0lUX0FERFJJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRmxhZ19kZWZpbml0aW9uIFNNQlVTIEZsYWcgZGVmaW5pdGlvbgorICAqIEBicmllZiBGbGFnIGRlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWFlZWVkKKyAgKiAgICAgICAgICAgLSBYWFhYWFhYWCAgOiBGbGFnIG1hc2sKKyAgKiBAeworICAqLworCisjZGVmaW5lICBTTUJVU19GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYRQorI2RlZmluZSAgU01CVVNfRkxBR19UWElTICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWElTCisjZGVmaW5lICBTTUJVU19GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1JYTkUKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUREUgorI2RlZmluZSAgU01CVVNfRkxBR19BRiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9OQUNLRgorI2RlZmluZSAgU01CVVNfRkxBR19TVE9QRiAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9TVE9QRgorI2RlZmluZSAgU01CVVNfRkxBR19UQyAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQworI2RlZmluZSAgU01CVVNfRkxBR19UQ1IgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQ1IKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQkVSUiAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQkVSUgorI2RlZmluZSAgU01CVVNfRkxBR19BUkxPICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPCisjZGVmaW5lICBTTUJVU19GTEFHX09WUiAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUgorI2RlZmluZSAgU01CVVNfRkxBR19QRUNFUlIgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9QRUNFUlIKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVElNRU9VVAorI2RlZmluZSAgU01CVVNfRkxBR19BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BTEVSVAorI2RlZmluZSAgU01CVVNfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CVVNZCisjZGVmaW5lICBTTUJVU19GTEFHX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0RJUgorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX01hY3JvcyBTTUJVUyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBTTUJVUyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9TTUJVU19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1NNQlVTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH4oX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01CVVMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVENJICAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9BRERSSSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNQlVTIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19UWEUgICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RYSVMgICAgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUlhORSAgICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FGICAgICAgTkFDSyByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RDICAgICAgVHJhbnNmZXIgY29tcGxldGUgKG1hc3RlciBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVENSICAgICBUcmFuc2ZlciBjb21wbGV0ZSByZWxvYWQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQlVTWSAgICBCdXMgYnVzeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfRElSICAgICBUcmFuc2ZlciBkaXJlY3Rpb24gKHNsYXZlIG1vZGUpCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIFNNQlVTX0ZMQUdfTUFTSyAgKDB4MDAwMUZGRkZVKQorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU01CVVNfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNNQlVTIHBlbmRpbmcgZmxhZ3Mgd2hpY2ggYXJlIGNsZWFyZWQgYnkgd3JpdGluZyAxIGluIGEgc3BlY2lmaWMgYml0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUREUiAgICBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRiAgICAgIE5BQ0sgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19CRVJSICAgIEJ1cyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQVJMTyAgICBBcmJpdHJhdGlvbiBsb3N0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1BFQ0VSUiAgUEVDIGVycm9yIGluIHJlY2VwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVElNRU9VVCBUaW1lb3V0IG9yIFRsb3cgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgKENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBHZW5lcmF0ZSBhIE5vbi1BY2tub3dsZWRnZSBTTUJVUyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19HRU5FUkFURV9OQUNLKF9fSEFORExFX18pICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIEkyQ19DUjJfTkFDSykpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01CVVNfUHJpdmF0ZV9NYWNybyBTTUJVUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfU01CVVNfQU5BTE9HX0ZJTFRFUihGSUxURVIpICAgICAgICAgICAgICAgICAgKCgoRklMVEVSKSA9PSBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSUxURVIpID09IFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19ESUdJVEFMX0ZJTFRFUihGSUxURVIpICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPD0gMHgwMDAwMDAwRlUpCisKKyNkZWZpbmUgSVNfU01CVVNfQUREUkVTU0lOR19NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gU01CVVNfQUREUkVTU0lOR01PREVfN0JJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUKSkKKworI2RlZmluZSBJU19TTUJVU19EVUFMX0FERFJFU1MoQUREUkVTUykgICAgICAgICAgICAgICAgICAoKChBRERSRVNTKSA9PSBTTUJVU19EVUFMQUREUkVTU19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTKSA9PSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX09XTl9BRERSRVNTMl9NQVNLKE1BU0spICAgICAgICAgICAgICAgICgoKE1BU0spID09IFNNQlVTX09BMl9OT01BU0spICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzAyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDMpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzA1KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDYpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNykpCisKKyNkZWZpbmUgSVNfU01CVVNfR0VORVJBTF9DQUxMKENBTEwpICAgICAgICAgICAgICAgICAgICAgKCgoQ0FMTCkgPT0gU01CVVNfR0VORVJBTENBTExfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDQUxMKSA9PSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX05PX1NUUkVUQ0goU1RSRVRDSCkgICAgICAgICAgICAgICAgICAgICgoKFNUUkVUQ0gpID09IFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUUkVUQ0gpID09IFNNQlVTX05PU1RSRVRDSF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX1BFQyhQRUMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBFQykgPT0gU01CVVNfUEVDX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBFQykgPT0gU01CVVNfUEVDX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfUEVSSVBIRVJBTF9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX0hPU1QpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRV9BUlApKQorCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAgICgoKE1PREUpID09IFNNQlVTX1JFTE9BRF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX0FVVE9FTkRfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfU09GVEVORF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19TRU5EUEVDX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19SRUxPQURfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1NFTkRQRUNfTU9ERSkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfUkVMT0FEX01PREUpKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUgfCBTTUJVU19SRUxPQURfTU9ERSApKSkKKworCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX1JFUVVFU1QoUkVRVUVTVCkgICAgICAgICAgICAgICgoKFJFUVVFU1QpID09IFNNQlVTX0dFTkVSQVRFX1NUT1ApICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19OT19TVEFSVFNUT1ApKQorCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICAgICAgKElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19GSVJTVF9GUkFNRSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX05FWFRfRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19MQVNUX0ZSQU1FX05PX1BFQykgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfTEFTVF9GUkFNRV9XSVRIX1BFQykpCisKKyNkZWZpbmUgSVNfU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICgoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQykgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfTk9fUEVDKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQykgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKSkKKworI2RlZmluZSBTTUJVU19SRVNFVF9DUjEoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IxX1NNQkhFTiB8IEkyQ19DUjFfU01CREVOIHwgSTJDX0NSMV9QRUNFTikpKQorI2RlZmluZSBTTUJVU19SRVNFVF9DUjIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX0hFQUQxMFIgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBTTUJVU19HRU5FUkFURV9TVEFSVChfX0FERE1PREVfXyxfX0FERFJFU1NfXykgICAgICgoKF9fQURETU9ERV9fKSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKSA/ICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX1NUQVJUKSB8IChJMkNfQ1IyX0FVVE9FTkQpKSAmICh+STJDX0NSMl9SRF9XUk4pKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgodWludDMyX3QpKF9fQUREUkVTU19fKSAmIChJMkNfQ1IyX1NBREQpKSB8IChJMkNfQ1IyX0FERDEwKSB8IChJMkNfQ1IyX1NUQVJUKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgU01CVVNfR0VUX0FERFJfTUFUQ0goX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfQUREQ09ERSkgPj4gMTdVKQorI2RlZmluZSBTTUJVU19HRVRfRElSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9ESVIpID4+IDE2VSkKKyNkZWZpbmUgU01CVVNfR0VUX1NUT1BfTU9ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9BVVRPRU5EKQorI2RlZmluZSBTTUJVU19HRVRfUEVDX01PREUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1BFQ0JZVEUpCisjZGVmaW5lIFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX0FMRVJURU4pCisKKyNkZWZpbmUgU01CVVNfQ0hFQ0tfRkxBRyhfX0lTUl9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgKCgoKF9fSVNSX18pICYgKChfX0ZMQUdfXykgJiBTTUJVU19GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIFNNQlVTX0NIRUNLX0lUX1NPVVJDRShfX0NSMV9fLCBfX0lUX18pICAgICAgICAgICgoKChfX0NSMV9fKSAmIChfX0lUX18pKSA9PSAoX19JVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworI2RlZmluZSBJU19TTUJVU19PV05fQUREUkVTUzEoQUREUkVTUzEpICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUzEpIDw9IDB4MDAwMDAzRkZVKQorI2RlZmluZSBJU19TTUJVU19PV05fQUREUkVTUzIoQUREUkVTUzIpICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUzIpIDw9ICh1aW50MTZfdCkweDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9ucyBTTUJVUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0RlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTXNwSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTXNwRGVJbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgQW5hbG9nRmlsdGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRGlnaXRhbEZpbHRlcik7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU01CVVNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBwU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEJsb2NraW5nX21vZGVfUG9sbGluZyBCbG9ja2luZyBtb2RlIFBvbGxpbmcKKyAqIEB7CisgKi8KKy8qKioqKioqIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Jc0RldmljZVJlYWR5KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDMyX3QgVHJpYWxzLCB1aW50MzJfdCBUaW1lb3V0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBOb24tQmxvY2tpbmdfbW9kZV9JbnRlcnJ1cHQgTm9uLUJsb2NraW5nIG1vZGUgSW50ZXJydXB0CisgKiBAeworICovCisvKioqKioqKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX0Fib3J0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1NsYXZlX1JlY2VpdmVfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisvKioqKioqKiBTTUJVUyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCkgKi8KK3ZvaWQgSEFMX1NNQlVTX0VWX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX0VSX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7Cit2b2lkIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEB7CisgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfU01CVVNfR2V0U3RhdGUoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3VpbnQzMl90IEhBTF9TTUJVU19HZXRFcnJvcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMmcweHhfaGFsX3NtYnVzLmMgZmlsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9TTUJVU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9zcGkuaCBiL0luYy9zdG0zMmcweHhfaGFsX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9zcGkuaApAQCAtMCwwICsxLDg0NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfc3BpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfU1BJX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9UeXBlcyBTUEkgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNQSSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIG9wZXJhdGluZyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01vZGUgKi8KKworICB1aW50MzJfdCBEaXJlY3Rpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGJpZGlyZWN0aW9uYWwgbW9kZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EaXJlY3Rpb24gKi8KKworICB1aW50MzJfdCBEYXRhU2l6ZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EYXRhX1NpemUgKi8KKworICB1aW50MzJfdCBDTEtQb2xhcml0eTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IENMS1BoYXNlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDMyX3QgTlNTOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTIHNpZ25hbCBpcyBtYW5hZ2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgKE5TUyBwaW4pIG9yIGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBTU0kgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50ICovCisKKyAgdWludDMyX3QgQmF1ZFJhdGVQcmVzY2FsZXI7ICAgLyohPCBTcGVjaWZpZXMgdGhlIEJhdWQgUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBTQ0sgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay4gVGhlIHNsYXZlIGNsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LiAqLworCisgIHVpbnQzMl90IEZpcnN0Qml0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9NU0JfTFNCX3RyYW5zbWlzc2lvbiAqLworCisgIHVpbnQzMl90IFRJTW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBUSSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1RJX21vZGUgKi8KKworICB1aW50MzJfdCBDUkNDYWxjdWxhdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0NSQ19DYWxjdWxhdGlvbiAqLworCisgIHVpbnQzMl90IENSQ1BvbHlub21pYWw7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2x5bm9taWFsIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBvZGQgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDY1NTM1ICovCisKKyAgdWludDMyX3QgQ1JDTGVuZ3RoOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIENSQyBMZW5ndGggdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMgTGVuZ3RoIGlzIG9ubHkgdXNlZCB3aXRoIERhdGE4IGFuZCBEYXRhMTYsIG5vdCBvdGhlciBkYXRhIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfbGVuZ3RoICovCisKKyAgdWludDMyX3QgTlNTUE1vZGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTUCBzaWduYWwgaXMgZW5hYmxlZCBvciBub3QgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX05TU1BfTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgdGhlIE5TU1AgYml0IGluIHRoZSBTUEl4X0NSMiByZWdpc3RlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB0YWtlcyBlZmZlY3Qgb25seSBpZiB0aGUgU1BJIGludGVyZmFjZSBpcyBjb25maWd1cmVkIGFzIE1vdG9yb2xhIFNQSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciAoRlJGPTApIHdpdGggY2FwdHVyZSBvbiB0aGUgZmlyc3QgZWRnZSAoU1BJeF9DUjEgQ1BIQSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BPTCBzZXR0aW5nIGlzIGlnbm9yZWQpLi4gKi8KK30gU1BJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTUEkgU3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU1BJX1NUQVRFX1JFU0VUICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIG5vdCBJbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX1JFQURZICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX0JVU1kgICAgICAgPSAweDAyVSwgICAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX0JVU1lfVFggICAgPSAweDAzVSwgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX0JVU1lfUlggICAgPSAweDA0VSwgICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlggPSAweDA1VSwgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAqLworICBIQUxfU1BJX1NUQVRFX0VSUk9SICAgICAgPSAweDA2VSwgICAgLyohPCBTUEkgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX1NUQVRFX0FCT1JUICAgICAgPSAweDA3VSAgICAgLyohPCBTUEkgYWJvcnQgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfU1BJX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTUEkgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmCit7CisgIFNQSV9UeXBlRGVmICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAvKiE8IFNQSSByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgKi8KKworICBTUElfSW5pdFR5cGVEZWYgICAgICAgICAgICBJbml0OyAgICAgICAgICAgLyohPCBTUEkgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgIC8qITwgUG9pbnRlciB0byBTUEkgVHggdHJhbnNmZXIgQnVmZmVyICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAvKiE8IFNQSSBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgLyohPCBTUEkgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgIC8qITwgUG9pbnRlciB0byBTUEkgUnggdHJhbnNmZXIgQnVmZmVyICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAvKiE8IFNQSSBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgLyohPCBTUEkgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgQ1JDU2l6ZTsgICAgICAgIC8qITwgU1BJIENSQyBzaXplIHVzZWQgZm9yIHRoZSB0cmFuc2ZlciAgICAgICAqLworCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgIC8qITwgZnVuY3Rpb24gcG9pbnRlciBvbiBSeCBJU1IgICAgICAgKi8KKworICB2b2lkICgqVHhJU1IpKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAvKiE8IGZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVNSICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWF0eDsgICAgICAgIC8qITwgU1BJIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hcng7ICAgICAgICAvKiE8IFNQSSBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfU1BJX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgIC8qITwgU1BJIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAvKiE8IFNQSSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgICAgLyohPCBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgICAgLyohPCBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogVHhSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgICAgLyohPCBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgLyohPCBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgLyohPCBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogVHhSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgLyohPCBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgICAgICAgLyohPCBTUEkgRXJyb3IgY2FsbGJhY2sgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgLyohPCBTUEkgQWJvcnQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgICAgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgLyohPCBTUEkgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFNQSV9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgSEFMIFNQSSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX1NQSV9UWF9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgICAgID0gMHgwNFUsICAgIC8qITwgU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICovCisgIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgPSAweDA1VSwgICAgLyohPCBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1NQSV9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFNQSSBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX0FCT1JUX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwN1UsICAgIC8qITwgU1BJIEFib3J0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICovCisgIEhBTF9TUElfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA4VSwgICAgLyohPCBTUEkgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDlVICAgICAvKiE8IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAqLworCit9IEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFNQSSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwU1BJX0NhbGxiYWNrVHlwZURlZikoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAvKiE8IHBvaW50ZXIgdG8gYW4gU1BJIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9Db25zdGFudHMgU1BJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0Vycm9yX0NvZGUgU1BJIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX05PTkUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfTU9ERiAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgIC8qITwgTU9ERiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9DUkMgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgLyohPCBDUkMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX09WUiAgICAgICAgICAgICAgICgweDAwMDAwMDA0VSkgICAvKiE8IE9WUiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfRlJFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgIC8qITwgRlJFIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9ETUEgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX0ZMQUcgICAgICAgICAgICAgICgweDAwMDAwMDIwVSkgICAvKiE8IEVycm9yIG9uIFJYTkUvVFhFL0JTWS9GVExWTC9GUkxWTCBGbGFnICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfQUJPUlQgICAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgIC8qITwgRXJyb3IgZHVyaW5nIFNQSSBBYm9ydCBwcm9jZWR1cmUgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICgweDAwMDAwMDgwVSkgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9Nb2RlIFNQSSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX01PREVfU0xBVkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9NT0RFX01BU1RFUiAgICAgICAgICAgICAgICAgKFNQSV9DUjFfTVNUUiB8IFNQSV9DUjFfU1NJKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRGlyZWN0aW9uIFNQSSBEaXJlY3Rpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMkxJTkVTICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkgICAgIFNQSV9DUjFfUlhPTkxZCisjZGVmaW5lIFNQSV9ESVJFQ1RJT05fMUxJTkUgICAgICAgICAgICAgU1BJX0NSMV9CSURJTU9ERQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRGF0YV9TaXplIFNQSSBEYXRhIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfREFUQVNJWkVfNEJJVCAgICAgICAgICAgICAgICgweDAwMDAwMzAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzVCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDQwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV82QklUICAgICAgICAgICAgICAgKDB4MDAwMDA1MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfN0JJVCAgICAgICAgICAgICAgICgweDAwMDAwNjAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzhCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDcwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV85QklUICAgICAgICAgICAgICAgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTBCSVQgICAgICAgICAgICAgICgweDAwMDAwOTAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzExQklUICAgICAgICAgICAgICAoMHgwMDAwMEEwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMkJJVCAgICAgICAgICAgICAgKDB4MDAwMDBCMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTNCSVQgICAgICAgICAgICAgICgweDAwMDAwQzAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzE0QklUICAgICAgICAgICAgICAoMHgwMDAwMEQwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNUJJVCAgICAgICAgICAgICAgKDB4MDAwMDBFMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTZCSVQgICAgICAgICAgICAgICgweDAwMDAwRjAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0Nsb2NrX1BvbGFyaXR5IFNQSSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9QT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIFNQSV9DUjFfQ1BPTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ2xvY2tfUGhhc2UgU1BJIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgU1BJX0NSMV9DUEhBCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCBTUEkgU2xhdmUgU2VsZWN0IE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfTlNTX1NPRlQgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfU1NNCisjZGVmaW5lIFNQSV9OU1NfSEFSRF9JTlBVVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfTlNTX0hBUkRfT1VUUFVUICAgICAgICAgICAgIChTUElfQ1IyX1NTT0UgPDwgMTZVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTlNTUF9Nb2RlIFNQSSBOU1MgUHVsc2UgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9OU1NfUFVMU0VfRU5BQkxFICAgICAgICAgICAgU1BJX0NSMl9OU1NQCisjZGVmaW5lIFNQSV9OU1NfUFVMU0VfRElTQUJMRSAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyIFNQSSBCYXVkUmF0ZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMiAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQgICAgICAgICAoU1BJX0NSMV9CUl8wKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfOCAgICAgICAgIChTUElfQ1IxX0JSXzEpCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8xNiAgICAgICAgKFNQSV9DUjFfQlJfMSB8IFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzMyICAgICAgICAoU1BJX0NSMV9CUl8yKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNjQgICAgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzApCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8xMjggICAgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMSkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzI1NiAgICAgICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8xIHwgU1BJX0NSMV9CUl8wKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gU1BJIE1TQiBMU0IgVHJhbnNtaXNzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZJUlNUQklUX01TQiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9GSVJTVEJJVF9MU0IgICAgICAgICAgICAgICAgU1BJX0NSMV9MU0JGSVJTVAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfVElfbW9kZSBTUEkgVEkgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9USU1PREVfRElTQUJMRSAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfVElNT0RFX0VOQUJMRSAgICAgICAgICAgICAgIFNQSV9DUjJfRlJGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DUkNfQ2FsY3VsYXRpb24gU1BJIENSQyBDYWxjdWxhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFICAgICAgIFNQSV9DUjFfQ1JDRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0NSQ19sZW5ndGggU1BJIENSQyBMZW5ndGgKKyAgKiBAeworICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIFNQSV9DUkNfTEVOR1RIX0RBVEFTSVpFOiBhbGlnbmVkIHdpdGggdGhlIGRhdGEgc2l6ZQorICAqICAgICBTUElfQ1JDX0xFTkdUSF84QklUICAgIDogQ1JDIDhiaXQKKyAgKiAgICAgU1BJX0NSQ19MRU5HVEhfMTZCSVQgICA6IENSQyAxNmJpdAorICAqLworI2RlZmluZSBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfOEJJVCAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisjZGVmaW5lIFNQSV9DUkNfTEVOR1RIXzE2QklUICAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRklGT19yZWNlcHRpb25fdGhyZXNob2xkIFNQSSBGSUZPIFJlY2VwdGlvbiBUaHJlc2hvbGQKKyAgKiBAeworICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIFNQSV9SWEZJRk9fVEhSRVNIT0xEIG9yIFNQSV9SWEZJRk9fVEhSRVNIT0xEX1FGIDoKKyAgKiAgICAgICAgICBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiB0aGUgRklGTworICAqICAgICAgICAgIGxldmVsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMS80KDgtYml0cykuCisgICogICAgIFNQSV9SWEZJRk9fVEhSRVNIT0xEX0hGOiBSWE5FIGV2ZW50IGlzIGdlbmVyYXRlZCBpZiB0aGUgRklGTworICAqICAgICAgICAgIGxldmVsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMS8yKDE2IGJpdHMpLiAqLworI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRCAgICAgICAgICAgIFNQSV9DUjJfRlJYVEgKKyNkZWZpbmUgU1BJX1JYRklGT19USFJFU0hPTERfUUYgICAgICAgICBTUElfQ1IyX0ZSWFRICisjZGVmaW5lIFNQSV9SWEZJRk9fVEhSRVNIT0xEX0hGICAgICAgICAgKDB4MDAwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfSW50ZXJydXB0X2RlZmluaXRpb24gU1BJIEludGVycnVwdCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IyX1RYRUlFCisjZGVmaW5lIFNQSV9JVF9SWE5FICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9SWE5FSUUKKyNkZWZpbmUgU1BJX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IyX0VSUklFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9GbGFnc19kZWZpbml0aW9uIFNQSSBGbGFncyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICBTUElfU1JfUlhORSAgIC8qIFNQSSBzdGF0dXMgZmxhZzogUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX1RYRSAgICAvKiBTUEkgc3RhdHVzIGZsYWc6IFR4IGJ1ZmZlciBlbXB0eSBmbGFnICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19CU1kgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kgICAgLyogU1BJIHN0YXR1cyBmbGFnOiBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfQ1JDRVJSICAgICAgICAgICAgICAgICBTUElfU1JfQ1JDRVJSIC8qIFNQSSBFcnJvciBmbGFnOiBDUkMgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX01PREYgICAgICAgICAgICAgICAgICAgU1BJX1NSX01PREYgICAvKiBTUEkgRXJyb3IgZmxhZzogTW9kZSBmYXVsdCBmbGFnICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIgICAgLyogU1BJIEVycm9yIGZsYWc6IE92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfRlJFICAgICAgICAgICAgICAgICAgICBTUElfU1JfRlJFICAgIC8qIFNQSSBFcnJvciBmbGFnOiBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICovCisjZGVmaW5lIFNQSV9GTEFHX0ZUTFZMICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZUTFZMICAvKiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19GUkxWTCAgICAgICAgICAgICAgICAgIFNQSV9TUl9GUkxWTCAgLyogU1BJIGZpZm8gcmVjZXB0aW9uIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfTUFTSyAgICAgICAgICAgICAgICAgICAoU1BJX1NSX1JYTkUgfCBTUElfU1JfVFhFIHwgU1BJX1NSX0JTWSB8IFNQSV9TUl9DUkNFUlIgfCBTUElfU1JfTU9ERiB8IFNQSV9TUl9PVlIgfCBTUElfU1JfRlJFIHwgU1BJX1NSX0ZUTFZMIHwgU1BJX1NSX0ZSTFZMKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfdHJhbnNtaXNzaW9uX2ZpZm9fc3RhdHVzX2xldmVsIFNQSSBUcmFuc21pc3Npb24gRklGTyBTdGF0dXMgTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfRlRMVkxfRU1QVFkgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0ZUTFZMX1FVQVJURVJfRlVMTCAgICAgICAgICAoMHgwMDAwMDgwMFUpCisjZGVmaW5lIFNQSV9GVExWTF9IQUxGX0ZVTEwgICAgICAgICAgICAgKDB4MDAwMDEwMDBVKQorI2RlZmluZSBTUElfRlRMVkxfRlVMTCAgICAgICAgICAgICAgICAgICgweDAwMDAxODAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfcmVjZXB0aW9uX2ZpZm9fc3RhdHVzX2xldmVsIFNQSSBSZWNlcHRpb24gRklGTyBTdGF0dXMgTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfRlJMVkxfRU1QVFkgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0ZSTFZMX1FVQVJURVJfRlVMTCAgICAgICAgICAoMHgwMDAwMDIwMFUpCisjZGVmaW5lIFNQSV9GUkxWTF9IQUxGX0ZVTEwgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKQorI2RlZmluZSBTUElfRlJMVkxfRlVMTCAgICAgICAgICAgICAgICAgICgweDAwMDAwNjAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFNQSSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgaGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSXggd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19PVlI6IE92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZUTFZMOiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJMVkw6IFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBDUkNFUlIgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gKHVpbnQxNl90KSh+U1BJX0ZMQUdfQ1JDRVJSKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFNQSSBNT0RGIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9NT0RGRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWdfbW9kZiA9IDB4MDBVOyAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wcmVnX21vZGYgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpOyBcCisgICAgVU5VU0VEKHRtcHJlZ19tb2RmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgT1ZSIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19JTyB1aW50MzJfdCB0bXByZWdfb3ZyID0gMHgwMFU7ICAgICAgICAgICAgICBcCisgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRSOyAgICAgICBcCisgICAgdG1wcmVnX292ciA9IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSOyAgICAgICBcCisgICAgVU5VU0VEKHRtcHJlZ19vdnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgRlJFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fSU8gdWludDMyX3QgdG1wcmVnX2ZyZSA9IDB4MDBVOyAgICAgICAgICAgICAgICBcCisgIHRtcHJlZ19mcmUgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgICBcCisgIFVOVVNFRCh0bXByZWdfZnJlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH13aGlsZSgwVSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9FTkFCTEUoX19IQU5ETEVfXykgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRElTQUJMRShfX0hBTkRMRV9fKSBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NQRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfTWFjcm9zIFNQSSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFNldCB0aGUgU1BJIHRyYW5zbWl0LW9ubHkgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV8xTElORV9UWChfX0hBTkRMRV9fKSAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQklESU9FKQorCisvKiogQGJyaWVmICBTZXQgdGhlIFNQSSByZWNlaXZlLW9ubHkgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV8xTElORV9SWChfX0hBTkRMRV9fKSAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9CSURJT0UpCisKKy8qKiBAYnJpZWYgIFJlc2V0IHRoZSBDUkMgY2FsY3VsYXRpb24gb2YgdGhlIFNQSS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNQSV9SRVNFVF9DUkMoX19IQU5ETEVfXykgZG97Q0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNFTik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDRU4pO313aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX1NSX18gIGNvcHkgb2YgU1BJIFNSIHJlZ3NpdGVyLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19DUkNFUlI6IENSQyBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX01PREY6IE1vZGUgZmF1bHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19PVlI6IE92ZXJydW4gZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GUkU6IEZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZUTFZMOiBTUEkgZmlmbyB0cmFuc21pc3Npb24gbGV2ZWwKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJMVkw6IFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbAorICAqIEByZXR2YWwgU0VUIG9yIFJFU0VULgorICAqLworI2RlZmluZSBTUElfQ0hFQ0tfRkxBRyhfX1NSX18sIF9fRkxBR19fKSAgICAgICAgICgoKChfX1NSX18pICYgKChfX0ZMQUdfXykgJiBTUElfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBTUElfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBJbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fQ1IyX18gIGNvcHkgb2YgU1BJIENSMiByZWdzaXRlci4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9UWEU6IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9SWE5FOiBSWCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgU0VUIG9yIFJFU0VULgorICAqLworI2RlZmluZSBTUElfQ0hFQ0tfSVRfU09VUkNFKF9fQ1IyX18sIF9fSU5URVJSVVBUX18pICAgICAgKCgoKF9fQ1IyX18pICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIE1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9Nb2RlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gU1BJX01PREVfU0xBVkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBTUElfTU9ERV9NQVNURVIpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERpcmVjdGlvbiBNb2RlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19NT0RFX18gc3BlY2lmaWVzIHRoZSBTUEkgRGlyZWN0aW9uIE1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EaXJlY3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTihfX01PREVfXykgKCgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzFMSU5FKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEaXJlY3Rpb24gTW9kZSBwYXJhbWV0ZXIgaXMgMiBsaW5lcy4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfRElSRUNUSU9OXzJMSU5FUyhfX01PREVfXykgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8yTElORVMpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGlyZWN0aW9uIE1vZGUgcGFyYW1ldGVyIGlzIDEgb3IgMiBsaW5lcy4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShfX01PREVfXykgKCgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGF0YSBTaXplIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19EQVRBU0laRV9fIHNwZWNpZmllcyB0aGUgU1BJIERhdGEgU2l6ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0RhdGFfU2l6ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfREFUQVNJWkUoX19EQVRBU0laRV9fKSAoKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xNkJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xNUJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xNEJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xM0JJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xMkJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xMUJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV8xMEJJVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV85QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV84QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV83QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV82QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV81QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RBVEFTSVpFX18pID09IFNQSV9EQVRBU0laRV80QklUKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBTZXJpYWwgY2xvY2sgc3RlYWR5IHN0YXRlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19DUE9MX18gc3BlY2lmaWVzIHRoZSBTUEkgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BvbGFyaXR5CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9DUE9MKF9fQ1BPTF9fKSAoKChfX0NQT0xfXykgPT0gU1BJX1BPTEFSSVRZX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DUE9MX18pID09IFNQSV9QT0xBUklUWV9ISUdIKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDbG9jayBQaGFzZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fQ1BIQV9fIHNwZWNpZmllcyB0aGUgU1BJIENsb2NrIFBoYXNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUGhhc2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0NQSEEoX19DUEhBX18pICgoKF9fQ1BIQV9fKSA9PSBTUElfUEhBU0VfMUVER0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ1BIQV9fKSA9PSBTUElfUEhBU0VfMkVER0UpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIFNsYXZlIFNlbGVjdCBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTlNTX18gc3BlY2lmaWVzIHRoZSBTUEkgU2xhdmUgU2VsZWN0IG1hbmFnZW1lbnQgcGFyYW1ldGVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfU2xhdmVfU2VsZWN0X21hbmFnZW1lbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX05TUyhfX05TU19fKSAoKChfX05TU19fKSA9PSBTUElfTlNTX1NPRlQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX05TU19fKSA9PSBTUElfTlNTX0hBUkRfSU5QVVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX05TU19fKSA9PSBTUElfTlNTX0hBUkRfT1VUUFVUKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBOU1MgUHVsc2UgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX05TU1BfXyBzcGVjaWZpZXMgdGhlIFNQSSBOU1MgUHVsc2UgTW9kZSBwYXJhbWV0ZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9OU1NQX01vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX05TU1AoX19OU1NQX18pICgoKF9fTlNTUF9fKSA9PSBTUElfTlNTX1BVTFNFX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NQX18pID09IFNQSV9OU1NfUFVMU0VfRElTQUJMRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQmF1ZHJhdGUgcHJlc2NhbGVyIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBzcGVjaWZpZXMgdGhlIFNQSSBCYXVkcmF0ZSBwcmVzY2FsZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9CYXVkUmF0ZV9QcmVzY2FsZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0JBVURSQVRFX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAoKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl84KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzMyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl82NCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzI1NikpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTVNCIExTQiB0cmFuc21pc3Npb24gcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX0JJVF9fIHNwZWNpZmllcyB0aGUgU1BJIE1TQiBMU0IgdHJhbnNtaXNzaW9uICh3aGV0aGVyIGRhdGEgdHJhbnNmZXIgc3RhcnRzIGZyb20gTVNCIG9yIExTQiBiaXQpLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTVNCX0xTQl90cmFuc21pc3Npb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0ZJUlNUX0JJVChfX0JJVF9fKSAoKChfX0JJVF9fKSA9PSBTUElfRklSU1RCSVRfTVNCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSVRfXykgPT0gU1BJX0ZJUlNUQklUX0xTQikpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgVEkgbW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIFRJIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9USU1PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfVElNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9USU1PREVfRU5BQkxFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCBzdGF0ZSBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19DQUxDVUxBVElPTl9fIHNwZWNpZmllcyB0aGUgU1BJIENSQyBjYWxjdWxhdGlvbiBlbmFibGUgc3RhdGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfQ2FsY3VsYXRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0NSQ19DQUxDVUxBVElPTihfX0NBTENVTEFUSU9OX18pICgoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0FMQ1VMQVRJT05fXykgPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQ1JDIGxlbmd0aCBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19MRU5HVEhfXyBzcGVjaWZpZXMgdGhlIFNQSSBDUkMgbGVuZ3RoLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX2xlbmd0aAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfQ1JDX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFNQSV9DUkNfTEVOR1RIXzhCSVQpICB8fCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIHBvbHlub21pYWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbiwgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fUE9MWU5PTUlBTF9fIHNwZWNpZmllcyB0aGUgU1BJIHBvbHlub21pYWwgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0NSQ19QT0xZTk9NSUFMKF9fUE9MWU5PTUlBTF9fKSAoKChfX1BPTFlOT01JQUxfXykgPj0gMHgxVSkgJiYgKChfX1BPTFlOT01JQUxfXykgPD0gMHhGRkZGVSkgJiYgKCgoX19QT0xZTk9NSUFMX18pJjB4MVUpICE9IDBVKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIERNQSBoYW5kbGUgaXMgdmFsaWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyBhIERNQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9ETUFfSEFORExFKF9fSEFORExFX18pICgoX19IQU5ETEVfXykgIT0gTlVMTCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBTUEkgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfc3BpX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9Nc3BEZUluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNQSV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFQYXVzZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVJlc3VtZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVN0b3AoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworLyogVHJhbnNmZXIgQWJvcnQgZnVuY3Rpb25zICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworCit2b2lkIEhBTF9TUElfSVJRSGFuZGxlcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1NQSV9TdGF0ZVR5cGVEZWYgSEFMX1NQSV9HZXRTdGF0ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfU1BJX0dldEVycm9yKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX1NQSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF9zcGlfZXguaCBiL0luYy9zdG0zMmcweHhfaGFsX3NwaV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmE2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF9zcGlfZXguaApAQCAtMCwwICsxLDc1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9zcGlfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU1BJIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0hBTF9TUElfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1NQSV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX1NQSV9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF90aW0uaCBiL0luYy9zdG0zMmcweHhfaGFsX3RpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmVlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF90aW0uaApAQCAtMCwwICsxLDIxODggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfVElNX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9USU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU0KKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfVHlwZXMgVElNIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUSU0gVGltZSBiYXNlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAqLworCisgIHVpbnQzMl90IENvdW50ZXJNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9Db3VudGVyX01vZGUgKi8KKworICB1aW50MzJfdCBQZXJpb2Q7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlvZCB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG8tUmVsb2FkIFJlZ2lzdGVyIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAgKi8KKworICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja0RpdmlzaW9uICovCisKKyAgdWludDMyX3QgUmVwZXRpdGlvbkNvdW50ZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoIHRpbWUgdGhlIFJDUiBkb3duY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlcyB6ZXJvLCBhbiB1cGRhdGUgZXZlbnQgaXMgZ2VuZXJhdGVkIGFuZCBjb3VudGluZyByZXN0YXJ0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUkNSIHZhbHVlIChOKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgaW4gUFdNIG1vZGUgdGhhdCAoTisxKSBjb3JyZXNwb25kcyB0bzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgaGFsZiBQV00gcGVyaW9kIGluIGNlbnRlci1hbGlnbmVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUCB0aW1lcnM6IHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZhbmNlZCB0aW1lcnM6IHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuICovCisKKyAgdWludDMyX3QgQXV0b1JlbG9hZFByZWxvYWQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgYXV0by1yZWxvYWQgcHJlbG9hZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQXV0b1JlbG9hZFByZWxvYWQgKi8KK30gVElNX0Jhc2VfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIE91dHB1dCBDb21wYXJlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9DTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzICovCisKKyAgdWludDMyX3QgUHVsc2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHB1bHNlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGICovCisKKyAgdWludDMyX3QgT0NQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1BvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXIgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KKworICB1aW50MzJfdCBPQ0Zhc3RNb2RlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBGYXN0IG1vZGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0Zhc3RfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGluIFBXTTEgYW5kIFBXTTIgbW9kZS4gKi8KKworCisgIHVpbnQzMl90IE9DSWRsZVN0YXRlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lciBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBmZWF0dXJlLiAqLworCisgIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCit9IFRJTV9PQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gT25lIFB1bHNlIE1vZGUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT0NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX2FuZF9QV01fbW9kZXMgKi8KKworICB1aW50MzJfdCBQdWxzZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHVsc2UgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYgKi8KKworICB1aW50MzJfdCBPQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgT0NOUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lciBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBmZWF0dXJlLiAqLworCisgIHVpbnQzMl90IE9DSWRsZVN0YXRlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciB0aW1lciBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBmZWF0dXJlLiAqLworCisgIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgSUNQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDU2VsZWN0aW9uOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gSW5wdXQgQ2FwdHVyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCAgSUNQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNTZWxlY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQ0ZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fSUNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIEVuY29kZXIgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fRW5jb2Rlcl9Nb2RlICovCisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDMVNlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDMVByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKworICB1aW50MzJfdCBJQzJQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMyU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQzJQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQzJGaWx0ZXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIENsb2NrIENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9ja1NvdXJjZTsgICAgIC8qITwgVElNIGNsb2NrIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0Nsb2NrX1NvdXJjZSAqLworICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAgIC8qITwgVElNIGNsb2NrIHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja19Qb2xhcml0eSAqLworICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgIC8qITwgVElNIGNsb2NrIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCisgIHVpbnQzMl90IENsb2NrRmlsdGVyOyAgICAvKiE8IFRJTSBjbG9jayBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIENsZWFyIElucHV0IENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbGVhcklucHV0U3RhdGU7ICAgICAgLyohPCBUSU0gY2xlYXIgSW5wdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIEVOQUJMRSBvciBESVNBQkxFICovCisgIHVpbnQzMl90IENsZWFySW5wdXRTb3VyY2U7ICAgICAvKiE8IFRJTSBjbGVhciBJbnB1dCBzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NsZWFySW5wdXRfU291cmNlICovCisgIHVpbnQzMl90IENsZWFySW5wdXRQb2xhcml0eTsgICAvKiE8IFRJTSBDbGVhciBJbnB1dCBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbGVhcklucHV0X1BvbGFyaXR5ICovCisgIHVpbnQzMl90IENsZWFySW5wdXRQcmVzY2FsZXI7ICAvKiE8IFRJTSBDbGVhciBJbnB1dCBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSAwOiBXaGVuIE9DUmVmIGNsZWFyIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUiBwcmVzY2FsZXIgbXVzdCBiZSBvZmYgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dEZpbHRlcjsgICAgLyohPCBUSU0gQ2xlYXIgSW5wdXQgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gTWFzdGVyIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgIEFkdmFuY2VkIHRpbWVycyBwcm92aWRlIFRSR08yIGludGVybmFsIGxpbmUgd2hpY2ggaXMgcmVkaXJlY3RlZAorICAqICAgICAgICAgdG8gdGhlIEFEQworICAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIHVpbnQzMl90ICBNYXN0ZXJPdXRwdXRUcmlnZ2VyOyAgIC8qITwgVHJpZ2dlciBvdXRwdXQgKFRSR08pIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9NYXN0ZXJfTW9kZV9TZWxlY3Rpb24gKi8KKyAgdWludDMyX3QgIE1hc3Rlck91dHB1dFRyaWdnZXIyOyAgLyohPCBUcmlnZ2VyIG91dHB1dDIgKFRSR08yKSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uXzIgKi8KKyAgdWludDMyX3QgIE1hc3RlclNsYXZlTW9kZTsgICAgICAgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX1NsYXZlX01vZGUgKi8KK30gVElNX01hc3RlckNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIFNsYXZlIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBTbGF2ZU1vZGU7ICAgICAgICAgLyohPCBTbGF2ZSBtb2RlIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1NsYXZlX01vZGUgKi8KKyAgdWludDMyX3QgIElucHV0VHJpZ2dlcjsgICAgICAvKiE8IElucHV0IFRyaWdnZXIgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fVHJpZ2dlcl9TZWxlY3Rpb24gKi8KKyAgdWludDMyX3QgIFRyaWdnZXJQb2xhcml0eTsgICAvKiE8IElucHV0IFRyaWdnZXIgcG9sYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9UcmlnZ2VyX1BvbGFyaXR5ICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUHJlc2NhbGVyOyAgLyohPCBJbnB1dCB0cmlnZ2VyIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfUHJlc2NhbGVyICovCisgIHVpbnQzMl90ICBUcmlnZ2VyRmlsdGVyOyAgICAgLyohPCBJbnB1dCB0cmlnZ2VyIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAgKi8KKworfSBUSU1fU2xhdmVDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBCcmVhayBpbnB1dChzKSBhbmQgRGVhZCB0aW1lIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgIDIgYnJlYWsgaW5wdXRzIGNhbiBiZSBjb25maWd1cmVkIChCS0lOIGFuZCBCS0lOMikgd2l0aCBjb25maWd1cmFibGUKKyAgKiAgICAgICAgZmlsdGVyIGFuZCBwb2xhcml0eS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9mZlN0YXRlUnVuTW9kZTsgICAgICAgICAgIC8qITwgVElNIG9mZiBzdGF0ZSBpbiBydW4gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PU1NSX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX1J1bl9tb2RlX3N0YXRlICovCisgIHVpbnQzMl90IE9mZlN0YXRlSURMRU1vZGU7ICAgICAgICAgIC8qITwgVElNIG9mZiBzdGF0ZSBpbiBJRExFIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT1NTSV9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9JZGxlX21vZGVfc3RhdGUgKi8KKyAgdWludDMyX3QgTG9ja0xldmVsOyAgICAgICAgICAgICAgICAgLyohPCBUSU0gTG9jayBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9Mb2NrX2xldmVsICovCisgIHVpbnQzMl90IERlYWRUaW1lOyAgICAgICAgICAgICAgICAgIC8qITwgVElNIGRlYWQgVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRiAqLworICB1aW50MzJfdCBCcmVha1N0YXRlOyAgICAgICAgICAgICAgICAvKiE8IFRJTSBCcmVhayBTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSAqLworICB1aW50MzJfdCBCcmVha1BvbGFyaXR5OyAgICAgICAgICAgICAvKiE8IFRJTSBCcmVhayBpbnB1dCBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19Qb2xhcml0eSAqLworICB1aW50MzJfdCBCcmVha0ZpbHRlcjsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYnJlYWsgaW5wdXQgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKyAgdWludDMyX3QgQnJlYWtBRk1vZGU7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9mIHRoZSBicmVhayBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQnJlYWtfSW5wdXRfQUZfTW9kZSAqLworICB1aW50MzJfdCBCcmVhazJTdGF0ZTsgICAgICAgICAgICAgICAvKiE8IFRJTSBCcmVhazIgU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQnJlYWsyX0lucHV0X2VuYWJsZV9kaXNhYmxlICovCisgIHVpbnQzMl90IEJyZWFrMlBvbGFyaXR5OyAgICAgICAgICAgIC8qITwgVElNIEJyZWFrMiBpbnB1dCBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVhazJfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQnJlYWsyRmlsdGVyOyAgICAgICAgICAgICAgLyohPCBUSU0gYnJlYWsyIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCisgIHVpbnQzMl90IEJyZWFrMkFGTW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBvZiB0aGUgYnJlYWsyIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVhazJfSW5wdXRfQUZfTW9kZSAqLworICB1aW50MzJfdCBBdXRvbWF0aWNPdXRwdXQ7ICAgICAgICAgICAvKiE8IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9BT0VfQml0X1NldF9SZXNldCAqLworfSBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9USU1fU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9USU1fU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9USU1fU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9USU1fU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9USU1fU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICovCit9IEhBTF9USU1fU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBY3RpdmUgY2hhbm5lbCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzEgICAgICAgID0gMHgwMVUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDEgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMiAgICAgICAgPSAweDAyVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgMiAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAzICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQgICAgICAgID0gMHgwOFUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDQgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNSAgICAgICAgPSAweDEwVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgNSAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF82ICAgICAgICA9IDB4MjBVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA2ICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQgID0gMHgwMFUgICAgLyohPCBBbGwgYWN0aXZlIGNoYW5uZWxzIGNsZWFyZWQgKi8KK30gSEFMX1RJTV9BY3RpdmVDaGFubmVsOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBUaW1lIEJhc2UgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgVElNX1R5cGVEZWYgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisgIFRJTV9CYXNlX0luaXRUeXBlRGVmICAgICBJbml0OyAgICAgICAgICAvKiE8IFRJTSBUaW1lIEJhc2UgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworICBIQUxfVElNX0FjdGl2ZUNoYW5uZWwgICAgQ2hhbm5lbDsgICAgICAgLyohPCBBY3RpdmUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hWzddOyAgICAgIC8qITwgRE1BIEhhbmRsZXJzIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFycmF5IGlzIGFjY2Vzc2VkIGJ5IGEgQHJlZiBETUFfSGFuZGxlX2luZGV4ICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICBMb2NrOyAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAqLworICBfX0lPIEhBTF9USU1fU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgLyohPCBUSU0gb3BlcmF0aW9uIHN0YXRlICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAgKCogQmFzZV9Nc3BJbml0Q2FsbGJhY2spICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAgKCogQmFzZV9Nc3BEZUluaXRDYWxsYmFjaykgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAgKCogSUNfTXNwSW5pdENhbGxiYWNrKSAgICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIElDIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogSUNfTXNwRGVJbml0Q2FsbGJhY2spICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAgKCogT0NfTXNwSW5pdENhbGxiYWNrKSAgICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIE9DIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogT0NfTXNwRGVJbml0Q2FsbGJhY2spICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAgKCogUFdNX01zcEluaXRDYWxsYmFjaykgICAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIFBXTSBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogUFdNX01zcERlSW5pdENhbGxiYWNrKSAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgKi8KKyAgdm9pZCAgKCogT25lUHVsc2VfTXNwSW5pdENhbGxiYWNrKSAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAgICAgKi8KKyAgdm9pZCAgKCogT25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2spICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICAgKi8KKyAgdm9pZCAgKCogRW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2spICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgKi8KKyAgdm9pZCAgKCogRW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjaykgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEVuY29kZXIgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgKi8KKyAgdm9pZCAgKCogSGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2spICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcCBJbml0IENhbGxiYWNrICAgKi8KKyAgdm9pZCAgKCogSGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjaykgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAgKCogUGVyaW9kRWxhcHNlZENhbGxiYWNrKSAgICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAgICovCisgIHZvaWQgICgqIFRyaWdnZXJDYWxsYmFjaykgICAgICAgICAgICAgIChzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAvKiE8IFRJTSBUcmlnZ2VyIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgIC8qITwgVElNIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICAoKiBJQ19DYXB0dXJlQ2FsbGJhY2spICAgICAgICAgICAoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgLyohPCBUSU0gSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIElDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAgKCogT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2spICAgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgdm9pZCAgKCogUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjaykgICAgKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgIC8qITwgVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICovCisgIHZvaWQgICgqIEVycm9yQ2FsbGJhY2spICAgICAgICAgICAgICAgIChzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAvKiE8IFRJTSBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgICgqIENvbW11dGF0aW9uQ2FsbGJhY2spICAgICAgICAgIChzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAvKiE8IFRJTSBDb21tdXRhdGlvbiBDYWxsYmFjayAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQ29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgIC8qITwgVElNIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAqLworICB2b2lkICAoKiBCcmVha0NhbGxiYWNrKSAgICAgICAgICAgICAgICAoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgLyohPCBUSU0gQnJlYWsgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEJyZWFrMkNhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBCcmVhazIgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK31USU1fSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEICAgICAgICAgICAgPSAweDAwVSAgICAvKiE8IFRJTSBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCAgICAgICAgICA9IDB4MDFVICAgIC8qITwgVElNIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgID0gMHgwMlUgICAgLyohPCBUSU0gSUMgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgPSAweDAzVSAgICAvKiE8IFRJTSBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICA9IDB4MDRVICAgIC8qITwgVElNIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgID0gMHgwNVUgICAgLyohPCBUSU0gT0MgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgPSAweDA2VSAgICAvKiE8IFRJTSBQV00gTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEICAgICAgICAgICA9IDB4MDdVICAgIC8qITwgVElNIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEICAgICAgID0gMHgwOFUgICAgLyohPCBUSU0gT25lIFB1bHNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCAgICAgPSAweDA5VSAgICAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgICAgICAgICA9IDB4MEFVICAgIC8qITwgVElNIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEICAgICAgID0gMHgwQlUgICAgLyohPCBUSU0gRW5jb2RlciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCAgICAgPSAweDBDVSAgICAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgICA9IDB4MERVICAgIC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEICAgICAgICAgID0gMHgwRVUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgICAgID0gMHgwRlUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgxMFUgICAgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCAgICAgICAgICAgID0gMHgxMVUgICAgLyohPCBUSU0gVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCAgICAgICAgICAgICAgPSAweDEyVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEICAgICAgICAgPSAweDEzVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCAgICAgICAgPSAweDE0VSAgICAvKiE8IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEICAgICAgPSAweDE1VSAgICAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEID0gMHgxNlUgICAgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgxN1UgICAgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEICAgICAgICAgICAgID0gMHgxOFUgICAgLyohPCBUSU0gQ29tbXV0YXRpb24gQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgICAgICAgID0gMHgxOVUgICAgLyohPCBUSU0gQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0JSRUFLX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgxQVUgICAgLyohPCBUSU0gQnJlYWsgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0JSRUFLMl9DQl9JRCAgICAgICAgICAgICAgICAgID0gMHgxQlUgICAgLyohPCBUSU0gQnJlYWsyIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9SEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgVElNIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBUSU1fQ2FsbGJhY2tUeXBlRGVmKShUSU1fSGFuZGxlVHlwZURlZiAqIGh0aW0pOyAvKiE8IHBvaW50ZXIgdG8gdGhlIFRJTSBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfQ29uc3RhbnRzIFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9DbGVhcklucHV0X1NvdXJjZSBUSU0gQ2xlYXIgSW5wdXQgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfTk9ORSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAvKiE8IE9DUkVGX0NMUiBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9FVFIgICAgICAgICAgICAweDAwMDAwMDAxVSAgIC8qITwgT0NSRUZfQ0xSIGlzIGNvbm5lY3RlZCB0byBFVFJGIGlucHV0ICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDEgICAgICAgICAgMHgwMDAwMDAwMlUgICAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMiAgICAgICAgICAweDAwMDAwMDA0VSAgIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0ICovCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0RNQV9CYXNlX2FkZHJlc3MgVElNIERNQSBCYXNlIEFkZHJlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BQkFTRV9DUjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NSMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfU01DUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBUSU1fRE1BQkFTRV9ESUVSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNVCisjZGVmaW5lIFRJTV9ETUFCQVNFX1NSICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfRUdSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDZVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIyICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NFUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDlVCisjZGVmaW5lIFRJTV9ETUFCQVNFX1BTQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQVJSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBCVQorI2RlZmluZSBUSU1fRE1BQkFTRV9SQ1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFVQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IzICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEZVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQkRUUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExVQorI2RlZmluZSBUSU1fRE1BQkFTRV9EQ1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTJVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RNQVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxM1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfT1IxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTVVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSNiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3VQorI2RlZmluZSBUSU1fRE1BQkFTRV9BRjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMThVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0FGMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfVElTRUwgICAgICAgICAgICAgICAgICAweDAwMDAwMDFBVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXZlbnRfU291cmNlIFRJTSBFdmVudCBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfVVBEQVRFICAgICAgICAgICAgICBUSU1fRUdSX1VHICAgICAvKiE8IFJlaW5pdGlhbGl6ZSB0aGUgY291bnRlciBhbmQgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzEgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0MxRyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgMSAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MyICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDMkcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDIgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMyAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzNHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAzICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzQgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0M0RyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgNCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ09NICAgICAgICAgICAgICAgICBUSU1fRUdSX0NPTUcgICAvKiE8IEEgY29tbXV0YXRpb24gZXZlbnQgaXMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSICAgICAgICAgICAgIFRJTV9FR1JfVEcgICAgIC8qITwgQSB0cmlnZ2VyIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsgICAgICAgICAgICAgICBUSU1fRUdSX0JHICAgICAvKiE8IEEgYnJlYWsgZXZlbnQgaXMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIgICAgICAgICAgICAgIFRJTV9FR1JfQjJHICAgIC8qITwgQSBicmVhayAyIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2hhbm5lbF9Qb2xhcml0eSBUSU0gSW5wdXQgQ2hhbm5lbCBwb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8KKyNkZWZpbmUgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICBUSU1fQ0NFUl9DQzFQICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAqLworI2RlZmluZSAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFICAgIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApICAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FVFJfUG9sYXJpdHkgVElNIEVUUiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUiBzb3VyY2UgKi8KKyNkZWZpbmUgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRVRSX1ByZXNjYWxlciBUSU0gRVRSIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgKi8KKyNkZWZpbmUgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTXzAgICAgICAgICAgICAgICAgICAgLyohPCBFVFIgaW5wdXQgc291cmNlIGlzIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFNfMSAgICAgICAgICAgICAgICAgICAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQUyAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NvdW50ZXJfTW9kZSBUSU0gQ291bnRlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX1VQICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHVzZWQgYXMgdXAtY291bnRlciAgICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9ET1dOICAgICAgICAgICAgICAgVElNX0NSMV9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB1c2VkIGFzIGRvd24tY291bnRlciAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDEgICAgIFRJTV9DUjFfQ01TXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMSAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQyICAgICBUSU1fQ1IxX0NNU18xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDZW50ZXItYWxpZ25lZCBtb2RlIDIgICAgICAgICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMyAgICAgVElNX0NSMV9DTVMgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2VudGVyLWFsaWduZWQgbW9kZSAzICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tEaXZpc2lvbiBUSU0gQ2xvY2sgRGl2aXNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENsb2NrIGRpdmlzaW9uOiB0RFRTPXRDS19JTlQgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENsb2NrIGRpdmlzaW9uOiB0RFRTPTIqdENLX0lOVCAqLworI2RlZmluZSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0ICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENsb2NrIGRpdmlzaW9uOiB0RFRTPTQqdENLX0lOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfU3RhdGUgVElNIE91dHB1dCBDb21wYXJlIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09VVFBVVFNUQVRFX0RJU0FCTEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdXRwdXQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX09VVFBVVFNUQVRFX0VOQUJMRSAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFFICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdXRwdXQgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQXV0b1JlbG9hZFByZWxvYWQgVElNIEF1dG8tUmVsb2FkIFByZWxvYWQKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0RJU0FCTEUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IFRJTXhfQVJSIHJlZ2lzdGVyIGlzIG5vdCBidWZmZXJlZCAqLworI2RlZmluZSBUSU1fQVVUT1JFTE9BRF9QUkVMT0FEX0VOQUJMRSAgICAgICAgICAgICAgICAgVElNX0NSMV9BUlBFICAgICAgICAgICAgICAvKiE8IFRJTXhfQVJSIHJlZ2lzdGVyIGlzIGJ1ZmZlcmVkICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9GYXN0X1N0YXRlIFRJTSBPdXRwdXQgRmFzdCBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ0ZBU1RfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IENvbXBhcmUgZmFzdCBkaXNhYmxlICovCisjZGVmaW5lIFRJTV9PQ0ZBU1RfRU5BQkxFICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMUZFICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IENvbXBhcmUgZmFzdCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1N0YXRlIFRJTSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09VVFBVVE5TVEFURV9ESVNBQkxFICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQ3hOIGlzIGRpc2FibGVkICAqLworI2RlZmluZSBUSU1fT1VUUFVUTlNUQVRFX0VOQUJMRSAgICAgICAgICAgIFRJTV9DQ0VSX0NDMU5FICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DeE4gaXMgZW5hYmxlZCAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9Qb2xhcml0eSBUSU0gT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NQT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSBvdXRwdXQgcG9sYXJpdHkgICovCisjZGVmaW5lIFRJTV9PQ1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MxUCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIG91dHB1dCBwb2xhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fUG9sYXJpdHkgVElNIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NOUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eSAqLworI2RlZmluZSBUSU1fT0NOUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMU5QICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZSBUSU0gT3V0cHV0IENvbXBhcmUgSWRsZSBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ0lETEVTVEFURV9TRVQgICAgICAgICAgICAgICAgVElNX0NSMl9PSVMxICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IElkbGUgc3RhdGU6IE9DeD0xIHdoZW4gTU9FPTAgKi8KKyNkZWZpbmUgVElNX09DSURMRVNUQVRFX1JFU0VUICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgSWRsZSBzdGF0ZTogT0N4PTAgd2hlbiBNT0U9MCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlIFRJTSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIElkbGUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1NFVCAgICAgICAgICAgICAgIFRJTV9DUjJfT0lTMU4gICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBsZW1lbnRhcnkgb3V0cHV0IElkbGUgc3RhdGU6IE9DeE49MSB3aGVuIE1PRT0wICovCisjZGVmaW5lIFRJTV9PQ05JRExFU1RBVEVfUkVTRVQgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGxlbWVudGFyeSBvdXRwdXQgSWRsZSBzdGF0ZTogT0N4Tj0wIHdoZW4gTU9FPTAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgVElNIElucHV0IENhcHR1cmUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSAgVElNX0lDUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgICAvKiE8IENhcHR1cmUgdHJpZ2dlcmVkIGJ5IHJpc2luZyBlZGdlIG9uIHRpbWVyIGlucHV0ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAgICAgLyohPCBDYXB0dXJlIHRyaWdnZXJlZCBieSBmYWxsaW5nIGVkZ2Ugb24gdGltZXIgaW5wdXQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBUSU1fSUNQT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFICAgIC8qITwgQ2FwdHVyZSB0cmlnZ2VyZWQgYnkgYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgb24gdGltZXIgaW5wdXQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gVElNIElucHV0IENhcHR1cmUgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJICAgICAgICAgICBUSU1fQ0NNUjFfQ0MxU18wICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0gSW5wdXQgMSwgMiwgMyBvciA0IGlzIHNlbGVjdGVkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIElDMSwgSUMyLCBJQzMgb3IgSUM0LCByZXNwZWN0aXZlbHkgKi8KKyNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkgICAgICAgICBUSU1fQ0NNUjFfQ0MxU18xICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0gSW5wdXQgMSwgMiwgMyBvciA0IGlzIHNlbGVjdGVkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIElDMiwgSUMxLCBJQzQgb3IgSUMzLCByZXNwZWN0aXZlbHkgKi8KKyNkZWZpbmUgVElNX0lDU0VMRUNUSU9OX1RSQyAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfQ0MxUyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0gSW5wdXQgMSwgMiwgMyBvciA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfUHJlc2NhbGVyIFRJTSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYxICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgZWFjaCB0aW1lIGFuIGVkZ2UgaXMgZGV0ZWN0ZWQgb24gdGhlIGNhcHR1cmUgaW5wdXQgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjIgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfSUMxUFNDXzAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWNCAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9JQzFQU0NfMSAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgNCBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVY4ICAgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX0lDMVBTQyAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX09uZV9QdWxzZV9Nb2RlIFRJTSBPbmUgUHVsc2UgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PUE1PREVfU0lOR0xFICAgICAgICAgICAgICAgICAgVElNX0NSMV9PUE0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBzdG9wcyBjb3VudGluZyBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKyNkZWZpbmUgVElNX09QTU9ERV9SRVBFVElUSVZFICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIGlzIG5vdCBzdG9wcGVkIGF0IHVwZGF0ZSBldmVudCAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRW5jb2Rlcl9Nb2RlIFRJTSBFbmNvZGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkxICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAxLCB4MiBtb2RlLCBjb3VudHMgdXAvZG93biBvbiBUSTFGUDEgZWRnZSBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsICAqLworI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkyICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAyLCB4MiBtb2RlLCBjb3VudHMgdXAvZG93biBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLiAqLworI2RlZmluZSBUSU1fRU5DT0RFUk1PREVfVEkxMiAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAzLCB4NCBtb2RlLCBjb3VudHMgdXAvZG93biBvbiBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0LiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fSW50ZXJydXB0X2RlZmluaXRpb24gVElNIGludGVycnVwdCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0lUX1VQREFURSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9VSUUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lUX0NDMSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzFJRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElNX0lUX0NDMiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzJJRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElNX0lUX0NDMyAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzNJRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElNX0lUX0NDNCAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzRJRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElNX0lUX0NPTSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DT01JRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21tdXRhdGlvbiBpbnRlcnJ1cHQgICAgICAgKi8KKyNkZWZpbmUgVElNX0lUX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9USUUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lUX0JSRUFLICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9CSUUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NvbW11dGF0aW9uX1NvdXJjZSAgVElNIENvbW11dGF0aW9uIFNvdXJjZSAKKyAgKiBAeworICAqLyAgCisjZGVmaW5lIFRJTV9DT01NVVRBVElPTl9UUkdJICAgICAgICAgICAgICBUSU1fQ1IyX0NDVVMgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2hlbiBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSBwcmVsb2FkZWQsIHRoZXkgYXJlIHVwZGF0ZWQgYnkgc2V0dGluZyB0aGUgQ09NRyBiaXQgb3Igd2hlbiBhbiByaXNpbmcgZWRnZSBvY2N1cnMgb24gdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBUSU1fQ09NTVVUQVRJT05fU09GVFdBUkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdoZW4gQ2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyBhcmUgcHJlbG9hZGVkLCB0aGV5IGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9ETUFfc291cmNlcyBUSU0gRE1BIFNvdXJjZXMKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BX1VQREFURSAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1VERSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgdXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIFRJTV9ETUFfQ0MxICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MxREUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMSBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMkRFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDIgZXZlbnQgZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9DQzMgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzNERSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIGNhcHR1cmUvY29tcGFyZSBtYWN0aCAzIGV2ZW50IGV2ZW50ICovCisjZGVmaW5lIFRJTV9ETUFfQ0M0ICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0M0REUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggNCBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NPTSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NPTURFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY29tbXV0YXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9UUklHR0VSICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9UREUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHRyaWdnZXIgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ZsYWdfZGVmaW5pdGlvbiBUSU0gRmxhZyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfVVBEQVRFICAgICAgICAgICAgICAgICAgICBUSU1fU1JfVUlGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzEgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzFJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMiAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMklGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MzICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MzSUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DQzQgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzRJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNSAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNUlGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0M2ICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M2SUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DT00gICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DT01JRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgVElNX1NSX1RJRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQlJFQUsgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQklGICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19CUkVBSzIgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9CMklGICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIDIgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX1NZU1RFTV9CUkVBSyAgICAgICAgICAgICAgVElNX1NSX1NCSUYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3lzdGVtIEJyZWFrIGludGVycnVwdCBmbGFnICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MxT0YgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MxT0YgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIDEgb3ZlcmNhcHR1cmUgZmxhZyAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzJPRiAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJPRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgMiBvdmVyY2FwdHVyZSBmbGFnICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0NDM09GICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM09GICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSAzIG92ZXJjYXB0dXJlIGZsYWcgICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0M0T0YgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M0T0YgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIDQgb3ZlcmNhcHR1cmUgZmxhZyAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2hhbm5lbCBUSU0gQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMSBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCAyIGlkZW50aWZpZXIgICAgICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjaGFubmVsIDMgaWRlbnRpZmllciAgICAgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ1UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgNCBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJlIGNoYW5uZWwgNSBpZGVudGlmaWVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTRVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmUgY2hhbm5lbCA2IGlkZW50aWZpZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMX0FMTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzQ1UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2xvYmFsIENhcHR1cmUvY29tcGFyZSBjaGFubmVsIGlkZW50aWZpZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9DbG9ja19Tb3VyY2UgVElNIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMiAgICBUSU1fU01DUl9FVFBTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgICAgVElNX1NNQ1JfRVRQU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgY2xvY2sgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjAgICAgICAgIFRJTV9UU19JVFIwICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMCkgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjEgICAgICAgIFRJTV9UU19JVFIxICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMSkgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjIgICAgICAgIFRJTV9UU19JVFIyICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMikgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0lUUjMgICAgICAgIFRJTV9UU19JVFIzICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoSVRSMykgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMUVEICAgICAgIFRJTV9UU19USTFGX0VEICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMUZQMSArIGVkZ2UgZGV0ZWN0LikgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMSAgICAgICAgIFRJTV9UU19USTFGUDEgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMUZQMSkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX1RJMiAgICAgICAgIFRJTV9UU19USTJGUDIgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoVFRJMkZQMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxICAgIFRJTV9UU19FVFJGICAgICAgICAgIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIG1vZGUgMSAoRVRSRikgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1BvbGFyaXR5IFRJTSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgLyohPCBQb2xhcml0eSBmb3IgVEl4IGNsb2NrIHNvdXJjZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrX1ByZXNjYWxlciBUSU0gQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMT0NLUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBDbG9jazogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgVElNIENsZWFyIElucHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgVElNX0VUUlBPTEFSSVRZX0lOVkVSVEVEICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NsZWFySW5wdXRfUHJlc2NhbGVyIFRJTSBDbGVhciBJbnB1dCBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWNCAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgcGluOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA4IGV2ZW50cy4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX09TU1JfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfUnVuX21vZGVfc3RhdGUgVElNIE9TU1IgT2ZmU3RhdGUgU2VsZWN0aW9uIGZvciBSdW4gbW9kZSBzdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PU1NSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfT1NTUiAgICAgICAgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGVuYWJsZWQgKHN0aWxsIGNvbnRyb2xsZWQgYnkgdGhlIHRpbWVyKSAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09TU1JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKG5vdCBjb250cm9sbGVkIGFueSBsb25nZXIgYnkgdGhlIHRpbWVyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT1NTSV9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9JZGxlX21vZGVfc3RhdGUgVElNIE9TU0kgT2ZmU3RhdGUgU2VsZWN0aW9uIGZvciBJZGxlIG1vZGUgc3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT1NTSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX09TU0kgICAgICAgICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DL09DTiBvdXRwdXRzIGFyZSBlbmFibGVkIChzdGlsbCBjb250cm9sbGVkIGJ5IHRoZSB0aW1lcikgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PU1NJX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGRpc2FibGVkIChub3QgY29udHJvbGxlZCBhbnkgbG9uZ2VyIGJ5IHRoZSB0aW1lcikgKi8KKy8qKgorICAqIEB9CisgICovCisvKiogQGRlZmdyb3VwIFRJTV9Mb2NrX2xldmVsICBUSU0gTG9jayBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfT0ZGICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTE9DSyBPRkYgICAgICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMSAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18wICAgICAgICAgICAgICAgICAgICAgIC8qITwgTE9DSyBMZXZlbCAxICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMiAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18xICAgICAgICAgICAgICAgICAgICAgIC8qITwgTE9DSyBMZXZlbCAyICovCisjZGVmaW5lIFRJTV9MT0NLTEVWRUxfMyAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTE9DSyBMZXZlbCAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSBUSU0gQnJlYWsgSW5wdXQgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLX0VOQUJMRSAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9CS0UgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgZW5hYmxlZCAgKi8KKyNkZWZpbmUgVElNX0JSRUFLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgZGlzYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrX1BvbGFyaXR5IFRJTSBCcmVhayBJbnB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBS1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGFjdGl2ZSBsb3cgICovCisjZGVmaW5lIFRJTV9CUkVBS1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgVElNX0JEVFJfQktQICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVha19JbnB1dF9BRl9Nb2RlIFRJTSBCcmVhayBJbnB1dCBBbHRlcm5hdGUgRnVuY3Rpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBS19BRk1PREVfSU5QVVQgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLIGluIGlucHV0IG1vZGUgKi8KKyNkZWZpbmUgVElNX0JSRUFLX0FGTU9ERV9CSURJUkVDVElPTkFMICAgICBUSU1fQkRUUl9CS0JJRCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaW4gYmlkaXJlY3Rpb25hbCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9CcmVhazJfSW5wdXRfZW5hYmxlX2Rpc2FibGUgVElNIEJyZWFrIGlucHV0IDIgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLMl9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGRpc2FibGVkICAqLworI2RlZmluZSBUSU1fQlJFQUsyX0VOQUJMRSAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX0JLMkUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrMl9Qb2xhcml0eSBUSU0gQnJlYWsgSW5wdXQgMiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBSzJQT0xBUklUWV9MT1cgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBhY3RpdmUgbG93ICAgKi8KKyNkZWZpbmUgVElNX0JSRUFLMlBPTEFSSVRZX0hJR0ggICAgICAgICAgICBUSU1fQkRUUl9CSzJQICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBoaWdoICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWsyX0lucHV0X0FGX01vZGUgVElNIEJyZWFrMiBJbnB1dCBBbHRlcm5hdGUgRnVuY3Rpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBSzJfQUZNT0RFX0lOUFVUICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsyIGlucHV0IEJSSzIgaW4gaW5wdXQgbW9kZSAqLworI2RlZmluZSBUSU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMICAgIFRJTV9CRFRSX0JLMkJJRCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrMiBpbnB1dCBCUksyIGluIGJpZGlyZWN0aW9uYWwgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQU9FX0JpdF9TZXRfUmVzZXQgVElNIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNT0UgY2FuIGJlIHNldCBvbmx5IGJ5IHNvZnR3YXJlICovCisjZGVmaW5lIFRJTV9BVVRPTUFUSUNPVVRQVVRfRU5BQkxFICAgICAgICAgVElNX0JEVFJfQU9FICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTU9FIGNhbiBiZSBzZXQgYnkgc29mdHdhcmUgb3IgYXV0b21hdGljYWxseSBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbm9uZSBvZiB0aGUgYnJlYWsgaW5wdXRzIEJSSyBhbmQgQlJLMiBpcyBhY3RpdmUpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Hcm91cF9DaGFubmVsNSBHcm91cCBDaGFubmVsIDUgYW5kIENoYW5uZWwgMSwgMiBvciAzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0dST1VQQ0g1X05PTkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDICovCisjZGVmaW5lIFRJTV9HUk9VUENINV9PQzFSRUZDICAgICAgICAgICAgICAgVElNX0NDUjVfR0M1QzEgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IE9DMVJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMVJFRkMgYW5kIE9DNVJFRiAgICAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfT0MyUkVGQyAgICAgICAgICAgICAgIFRJTV9DQ1I1X0dDNUMyICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBPQzJSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzJSRUZDIGFuZCBPQzVSRUYgICAgKi8KKyNkZWZpbmUgVElNX0dST1VQQ0g1X09DM1JFRkMgICAgICAgICAgICAgICBUSU1fQ0NSNV9HQzVDMyAgICAgICAgICAgICAgICAgICAgICAgLyogITwgT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9NYXN0ZXJfTW9kZV9TZWxlY3Rpb24gVElNIE1hc3RlciBNb2RlIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9UUkdPX1JFU0VUICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9FR1IuVUcgYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19FTkFCTEUgICAgICAgICAgIFRJTV9DUjJfTU1TXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ1IxLkNFTiBiaXQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fVVBEQVRFICAgICAgICAgICBUSU1fQ1IyX01NU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX09DMSAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggMSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLworI2RlZmluZSBUSU1fVFJHT19PQzFSRUYgICAgICAgICAgIFRJTV9DUjJfTU1TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MyUkVGICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX09DM1JFRiAgICAgICAgICAgKFRJTV9DUjJfTU1TXzIgfCBUSU1fQ1IyX01NU18xKSAgICAgICAgICAgICAgICAgIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19PQzRSRUYgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApICAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dChUUkdPKSAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbl8yIFRJTSBNYXN0ZXIgTW9kZSBTZWxlY3Rpb24gMiAoVFJHTzIpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RSR08yX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9FR1IuVUcgYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DUjEuQ0VOIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggMSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DMVJFRiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DMlJFRiAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DM1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNVJFRiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M1UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNlJFRiAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M2UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HICAgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBUUkdPMiAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNlJFRl9SSVNJTkdGQUxMSU5HICAgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M2UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBUUkdPMiAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORyAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHJpc2luZyBvciBPQzZSRUYgZmFsbGluZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORyAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8VElNX0NSMl9NTVMyXzEpICAgICAgICAgICAgICAgICAgIC8qITwgT0M1UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApIC8qITwgT0M1UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9TbGF2ZV9Nb2RlIFRJTSBNYXN0ZXIvU2xhdmUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9NQVNURVJTTEFWRU1PREVfRU5BQkxFICAgICAgICAgVElNX1NNQ1JfTVNNICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gYWN0aW9uICovCisjZGVmaW5lIFRJTV9NQVNURVJTTEFWRU1PREVfRElTQUJMRSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyL3NsYXZlIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1NsYXZlX01vZGUgVElNIFNsYXZlIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSBtb2RlIGRpc2FibGVkICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX1JFU0VUICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfU01TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXNldCBNb2RlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0dBVEVEICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzApICAgICAgICAgICAgICAgICAgLyohPCBHYXRlZCBNb2RlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX1RSSUdHRVIgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEpICAgICAgICAgICAgICAgICAgLyohPCBUcmlnZ2VyIE1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCBUSU1fU01DUl9TTVNfMCkgLyohPCBFeHRlcm5hbCBDbG9jayBNb2RlIDEgICAgICAgICAqLworI2RlZmluZSBUSU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUiAgVElNX1NNQ1JfU01TXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21iaW5lZCByZXNldCArIHRyaWdnZXIgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIFBXTSBNb2RlcworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PQ01PREVfVElNSU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRnJvemVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY2hhbm5lbCB0byBhY3RpdmUgbGV2ZWwgb24gbWF0Y2ggICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0lOQUNUSVZFICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjaGFubmVsIHRvIGluYWN0aXZlIGxldmVsIG9uIG1hdGNoICovCisjZGVmaW5lIFRJTV9PQ01PREVfVE9HR0xFICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITwgVG9nZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9QV00xICAgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8xKSAgICAgICAgICAgICAgICAgICAgLyohPCBQV00gbW9kZSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX1BXTTIgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8wKSAvKiE8IFBXTSBtb2RlIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yY2UgYWN0aXZlIGxldmVsICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUgICAgICAgICAgVElNX0NDTVIxX09DMU1fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGb3JjZSBpbmFjdGl2ZSBsZXZlbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX1JFVFJJR0VSUkFCTEVfT1BNMSAgICAgIFRJTV9DQ01SMV9PQzFNXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0yICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgIC8qITwgUmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9DT01CSU5FRF9QV00xICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21iaW5lZCBQV00gbW9kZSAxICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFRJTV9DQ01SMV9PQzFNXzIpICAvKiE8IENvbWJpbmVkIFBXTSBtb2RlIDIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMikgIC8qITwgQXN5bW1ldHJpYyBQV00gbW9kZSAxICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTIgICAgICAgICBUSU1fQ0NNUjFfT0MxTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBc3ltbWV0cmljIFBXTSBtb2RlIDIgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9TZWxlY3Rpb24gVElNIFRyaWdnZXIgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDAgKElUUjApICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfSVRSMSAgICAgICAgICBUSU1fU01DUl9UU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMSAoSVRSMSkgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19JVFIyICAgICAgICAgIFRJTV9TTUNSX1RTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAyIChJVFIyKSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjMgICAgICAgICAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDMgKElUUjMpICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfVEkxRl9FRCAgICAgICBUSU1fU01DUl9UU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJMSBFZGdlIERldGVjdG9yIChUSTFGX0VEKSAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19USTFGUDEgICAgICAgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgVGltZXIgSW5wdXQgMSAoVEkxRlAxKSAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX1RJMkZQMiAgICAgICAgKFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyIChUSTJGUDIpICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfRVRSRiAgICAgICAgICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18yKSAgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIEV4dGVybmFsIFRyaWdnZXIgaW5wdXQgKEVUUkYpICovCisjZGVmaW5lIFRJTV9UU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gdHJpZ2dlciBzZWxlY3RlZCAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX1RyaWdnZXJfUG9sYXJpdHkgVElNIFRyaWdnZXIgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHRyaWdnZXIgc291cmNlcyAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHRyaWdnZXIgc291cmNlcyAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgc291cmNlcyAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgc291cmNlcyAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfQk9USEVER0UgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXhGUHggb3IgVEkxX0VEIHRyaWdnZXIgc291cmNlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9QcmVzY2FsZXIgVElNIFRyaWdnZXIgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIgaXMgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIFRyaWdnZXI6IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgMiBldmVudHMuICovCisjZGVmaW5lIFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgVHJpZ2dlcjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSA0IGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVEkxX1NlbGVjdGlvbiBUSU0gVEkxIElucHV0IFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USTFTRUxFQ1RJT05fQ0gxICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFRJTXhfQ0gxIHBpbiBpcyBjb25uZWN0ZWQgdG8gVEkxIGlucHV0ICovCisjZGVmaW5lIFRJTV9USTFTRUxFQ1RJT05fWE9SQ09NQklOQVRJT04gICAgVElNX0NSMl9USTFTICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMyBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX0J1cnN0X0xlbmd0aCBUSU0gRE1BIEJ1cnN0IExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMSByZWdpc3RlciBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMgICAgICAweDAwMDAwMTAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAyIHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUyAgICAgIDB4MDAwMDAyMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDMgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF80VFJBTlNGRVJTICAgICAgMHgwMDAwMDMwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNCByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMgICAgICAweDAwMDAwNDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA1IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUyAgICAgIDB4MDAwMDA1MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDYgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF83VFJBTlNGRVJTICAgICAgMHgwMDAwMDYwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAweDAwMDAwNzAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA4IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUyAgICAgIDB4MDAwMDA4MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDkgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUyAgICAgMHgwMDAwMDkwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTICAgICAweDAwMDAwQTAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTJUUkFOU0ZFUlMgICAgIDB4MDAwMDBCMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUyAgICAgMHgwMDAwMEMwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTICAgICAweDAwMDAwRDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTVUUkFOU0ZFUlMgICAgIDB4MDAwMDBFMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUyAgICAgMHgwMDAwMEYwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTICAgICAweDAwMDAxMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMgICAgIDB4MDAwMDExMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9IYW5kbGVfaW5kZXggVElNIERNQSBIYW5kbGUgSW5kZXgKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BX0lEX1VQREFURSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDApICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgVXBkYXRlIERNQSByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX0NDMSAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDEpICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MyICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMikgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzMgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDAzKSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX0NDNCAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDQpICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ09NTVVUQVRJT04gICAgICAgICAgICgodWludDE2X3QpIDB4MDAwNSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDb21tdXRhdGlvbiBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9UUklHR0VSICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDA2KSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIFRyaWdnZXIgRE1BIHJlcXVlc3RzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENoYW5uZWxfQ0NfU3RhdGUgVElNIENhcHR1cmUvQ29tcGFyZSBDaGFubmVsIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NDeF9FTkFCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBvciBvdXRwdXQgY2hhbm5lbCBpcyBlbmFibGVkICovCisjZGVmaW5lIFRJTV9DQ3hfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgb3Igb3V0cHV0IGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDeE5fRU5BQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDeE5fRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrX1N5c3RlbSBUSU0gQnJlYWsgU3lzdGVtCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9FQ0MgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9FQ0NMICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgRUNDIGVycm9yIHNpZ25hbCB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvMTUvMTYvMTcgKi8KKyNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9QVkQgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9QVkRMICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgUFZEIGNvbm5lY3Rpb24gd2l0aCBUSU0xLzE1LzE2LzE3IEJyZWFrIElucHV0IGFuZCBhbHNvIHRoZSBQVkRFIGFuZCBQTFMgYml0cyBvZiB0aGUgUG93ZXIgQ29udHJvbCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9TUkFNX1BBUklUWV9FUlJPUiAgIFNZU0NGR19DRkdSMl9TUEwgICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS8xNS8xNi8xNyAqLworI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX0xPQ0tVUCAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0NMTCAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIExPQ0tVUCBvdXRwdXQgb2YgQ29ydGV4TTQgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzE1LzE2LzE3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1RJTV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSAgICAgICAgICAgICA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9USU1fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMXw9KFRJTV9DUjFfQ0VOKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fTU9FX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QkRUUnw9KFRJTV9CRFRSX01PRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeEVfTUFTSykgPT0gMFVMKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hORV9NQVNLKSA9PSAwVUwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+KFRJTV9DUjFfQ0VOKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUaGUgTWFpbiBPdXRwdXQgRW5hYmxlIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlIENDeCBhbmQgQ0N4TiBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX01PRV9ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hFX01BU0spID09IDBVTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeE5FX01BU0spID09IDBVTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QkRUUiAmPSB+KFRJTV9CRFRSX01PRSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUaGUgTWFpbiBPdXRwdXQgRW5hYmxlIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgdW5jb25kaXRpb25hbGx5CisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRElTQUJMRV9VTkNPTkRJVElPTkFMTFkoX19IQU5ETEVfXykgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgJj0gfihUSU1fQkRUUl9NT0UpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVVBEQVRFOiBVcGRhdGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQlJFQUs6IEJyZWFrIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX0RNQShfX0hBTkRMRV9fLCBfX0RNQV9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSIHw9IChfX0RNQV9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFVwZGF0ZSBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogICBDb21tdXRhdGlvbiBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRyaWdnZXIgRE1BIHJlcXVlc3QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfRE1BKF9fSEFORExFX18sIF9fRE1BX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmPSB+KF9fRE1BX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnICAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnICAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBUSU1fSVQgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiBDbGVhciB0aGUgVElNIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIFRJTSBDb3VudGVyIGlzIHVzZWQgYXMgZG93bmNvdW50ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCBGYWxzZSAoQ291bnRlciB1c2VkIGFzIHVwY291bnRlcikgb3IgVHJ1ZSAoQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyKQorICAqIEBub3RlIFRoaXMgbWFjcm8gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBnZXQgdGhlIGNvdW50aW5nIG1vZGUgd2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gQ2VudGVyLWFsaWduZWQgbW9kZSBvciBFbmNvZGVyCittb2RlLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fSVNfVElNX0NPVU5USU5HX0RPV04oX19IQU5ETEVfXykgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJihUSU1fQ1IxX0RJUikpID09IChUSU1fQ1IxX0RJUikpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gUHJlc2NhbGVyIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX1BSRVNDX18gc3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX1BSRVNDX18pICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5QU0MgPSAoX19QUkVTQ19fKSkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NPVU5URVJfXyBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NPVU5URVIoX19IQU5ETEVfXywgX19DT1VOVEVSX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q05UID0gKF9fQ09VTlRFUl9fKSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCAxNi1iaXQgb3IgMzItYml0IHZhbHVlIG9mIHRoZSB0aW1lciBjb3VudGVyIHJlZ2lzdGVyIChUSU14X0NOVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DT1VOVEVSKF9fSEFORExFX18pIFwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTlQpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0FVVE9SRUxPQURfXyBzcGVjaWZpZXMgdGhlIENvdW50ZXIgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXywgX19BVVRPUkVMT0FEX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIgPSAoX19BVVRPUkVMT0FEX18pOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Jbml0LlBlcmlvZCA9IChfX0FVVE9SRUxPQURfXyk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIDE2LWJpdCBvciAzMi1iaXQgdmFsdWUgb2YgdGhlIHRpbWVyIGF1dG8tcmVsb2FkIHJlZ2lzdGVyKFRJTXhfQVJSKQorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXykgXAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkFSUikKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDbG9jayBEaXZpc2lvbiB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NLRF9fIHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxOiB0RFRTPXRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWNDogdERUUz00KnRDS19JTlQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9OKF9fSEFORExFX18sIF9fQ0tEX18pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH5USU1fQ1IxX0NLRCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKF9fQ0tEX18pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuQ2xvY2tEaXZpc2lvbiA9IChfX0NLRF9fKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBkaXZpc2lvbiBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxOiB0RFRTPXRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMjogdERUUz0yKnRDS19JTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWNDogdERUUz00KnRDS19JTlQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OKF9fSEFORExFX18pICBcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgVElNX0NSMV9DS0QpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgX19JQ1BTQ19fIHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTQgcHJlc2NhbGVyIG5ldyB2YWx1ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfSUNQUkVTQ0FMRVIoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fSUNQU0NfXykgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUoKF9fSEFORExFX18pLCAoX19DSEFOTkVMX18pLCAoX19JQ1BTQ19fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIElucHV0IENhcHR1cmUgcHJlc2NhbGVyIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgaW5wdXQgY2FwdHVyZSAxIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBnZXQgaW5wdXQgY2FwdHVyZSAyIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBnZXQgaW5wdXQgY2FwdHVyZSAzIHByZXNjYWxlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgaW5wdXQgY2FwdHVyZSA0IHByZXNjYWxlciB2YWx1ZQorICAqIEByZXR2YWwgVGhlIGlucHV0IGNhcHR1cmUgcHJlc2NhbGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0dFVF9JQ1BSRVNDQUxFUihfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0lDMVBTQykgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9JQzJQU0MpID4+IDhVKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJiBUSU1fQ0NNUjJfSUMzUFNDKSA6XAorICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9JQzRQU0MpKSA+PiA4VSkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIENvbmZpZ0NoYW5uZWwgZnVuY3Rpb24uCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEBwYXJhbSAgX19DT01QQVJFX18gc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUgcmVnaXN0ZXIgbmV3IHZhbHVlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fQ09NUEFSRV9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMSA9IChfX0NPTVBBUkVfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMiA9IChfX0NPTVBBUkVfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMyA9IChfX0NPTVBBUkVfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNCA9IChfX0NPTVBBUkVfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNSA9IChfX0NPTVBBUkVfXykpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYgPSAoX19DT01QQVJFX18pKSkKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FwdHVyZSBjb21wYXJlIHJlZ2lzdGVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogZ2V0IGNhcHR1cmUvY29tcGFyZSAxIHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IGdldCBjYXB0dXJlL2NvbXBhcmUgMiByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBnZXQgY2FwdHVyZS9jb21wYXJlIDMgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogZ2V0IGNhcHR1cmUvY29tcGFyZSA0IHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IGdldCBjYXB0dXJlL2NvbXBhcmUgNSByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBnZXQgY2FwdHVyZS9jb21wYXJlIDYgcmVnaXN0ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIDE2LWJpdCBvciAzMi1iaXQgdmFsdWUgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J5KQorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKygoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMykgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0KSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYpKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIE91dHB1dCBjb21wYXJlIHByZWxvYWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX09DeFBSRUxPQUQoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgIFwKKyAgICAgICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzFQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzRQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzVQRSkgOlwKKyAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M2UEUpKQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFX09DeFBSRUxPQUQoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgIFwKKyAgICAgICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9ICh1aW50MTZfdCl+VElNX0NDTVIxX09DMVBFKSA6XAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MyUEUpIDpcCisgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSAodWludDE2X3QpflRJTV9DQ01SMl9PQzNQRSkgOlwKKyAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DNFBFKSA6XAorICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjNfT0M1UEUpIDpcCisgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjNfT0M2UEUpKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVXBkYXRlIFJlcXVlc3QgU291cmNlIChVUlMpIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQG5vdGUgIFdoZW4gdGhlIFVSUyBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyIGlzIHNldCwgb25seSBjb3VudGVyIAorICAqICAgICAgICBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgKGlmCisgICogICAgICAgIGVuYWJsZWQpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9VUlNfRU5BQkxFKF9fSEFORExFX18pIFwKKyAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxfD0gVElNX0NSMV9VUlMpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFVwZGF0ZSBSZXF1ZXN0IFNvdXJjZSAoVVJTKSBiaXQgb2YgdGhlIFRJTXhfQ1IxIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBub3RlICBXaGVuIHRoZSBVUlMgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3RlciBpcyByZXNldCwgYW55IG9mIHRoZSAKKyAgKiAgICAgICAgZm9sbG93aW5nIGV2ZW50cyBnZW5lcmF0ZSBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZiAKKyAgKiAgICAgICAgZW5hYmxlZCk6CisgICogICAgICAgICAgIF8gQ291bnRlciBvdmVyZmxvdyB1bmRlcmZsb3cKKyAgKiAgICAgICAgICAgXyBTZXR0aW5nIHRoZSBVRyBiaXQKKyAgKiAgICAgICAgICAgXyBVcGRhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIHRoZSBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1VSU19ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEmPX5USU1fQ1IxX1VSUykKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDYXB0dXJlIHggaW5wdXQgcG9sYXJpdHkgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIF9fUE9MQVJJVFlfXyBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HOiBSaXNpbmcgRWRnZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORzogRmFsbGluZyBFZGdlCisgICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRTogUmlzaW5nIGFuZCBGYWxsaW5nIEVkZ2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fUE9MQVJJVFlfXykgICAgXAorICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgVElNX1JFU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXyksIChfX1BPTEFSSVRZX18pKTsgXAorICAgICAgICB9d2hpbGUoMCkKKyAgICAgICAgICAKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9Db25zdGFudHMgVElNIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIFRoZSBjb3VudGVyIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgb25seSBpZiBhbGwgdGhlIENDeCBhbmQgQ0N4TgorICAgY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9DQ0VSX0NDeEVfTUFTSyAgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUgfCBUSU1fQ0NFUl9DQzNFIHwgVElNX0NDRVJfQ0M0RSkpCisjZGVmaW5lIFRJTV9DQ0VSX0NDeE5FX01BU0sgKCh1aW50MzJfdCkoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FKSkKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9NYWNyb3MgVElNIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKENPTVAxKSAmJiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9TT1VSQ0UoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfTk9ORSkpCisjZWxzZQorI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9TT1VSQ0UoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkUpKQorI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisKKyNkZWZpbmUgSVNfVElNX0RNQV9CQVNFKF9fQkFTRV9fKSAoKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU01DUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRElFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU1IpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRUdSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ05UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfUFNDKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQVJSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfUkNSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQkRUUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfT1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfVElTRUwpKQorCisjZGVmaW5lIElTX1RJTV9FVkVOVF9TT1VSQ0UoX19TT1VSQ0VfXykgKCgoKF9fU09VUkNFX18pICYgMHhGRkZGRkUwMFUpID09IDB4MDAwMDAwMDBVKSAmJiAoKF9fU09VUkNFX18pICE9IDB4MDAwMDAwMDBVKSkKKworI2RlZmluZSBJU19USU1fQ09VTlRFUl9NT0RFKF9fTU9ERV9fKSAgICAgICgoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfVVApICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9ET1dOKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMykpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLRElWSVNJT05fRElWKF9fRElWX18pICAoKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gVElNX0NMT0NLRElWSVNJT05fRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjQpKQorCisjZGVmaW5lIElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoUFJFTE9BRCkgKCgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJFTE9BRCkgPT0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9FTkFCTEUpKQorCisjZGVmaW5lIElTX1RJTV9GQVNUX1NUQVRFKF9fU1RBVEVfXykgICAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NGQVNUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9PQ0ZBU1RfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fT0NfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19USU1fT0NOX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX09DTlBPTEFSSVRZX0hJR0gpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9PQ05QT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX1RJTV9PQ0lETEVfU1RBVEUoX19TVEFURV9fKSAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NJRExFU1RBVEVfU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBUSU1fT0NJRExFU1RBVEVfUkVTRVQpKQorCisjZGVmaW5lIElTX1RJTV9PQ05JRExFX1NUQVRFKF9fU1RBVEVfXykgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fT0NOSURMRVNUQVRFX1NFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX09DTklETEVTVEFURV9SRVNFVCkpCisKKyNkZWZpbmUgSVNfVElNX0lDX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX1JJU0lORykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9GQUxMSU5HKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfQk9USEVER0UpKQorCisjZGVmaW5lIElTX1RJTV9JQ19TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fSUNTRUxFQ1RJT05fVFJDKSkKKworI2RlZmluZSBJU19USU1fSUNfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVY4KSkKKworI2RlZmluZSBJU19USU1fT1BNX01PREUoX19NT0RFX18pICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBUSU1fT1BNT0RFX1NJTkdMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT1BNT0RFX1JFUEVUSVRJVkUpKQorCisjZGVmaW5lIElTX1RJTV9FTkNPREVSX01PREUoX19NT0RFX18pICAgICAgKCgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX1RJMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfVEkxMikpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9TT1VSQ0UoX19TT1VSQ0VfXykgKCgoKF9fU09VUkNFX18pICYgMHhGRkZGODBGRlUpID09IDB4MDAwMDAwMDBVKSAmJiAoKF9fU09VUkNFX18pICE9IDB4MDAwMDAwMDBVKSkKKworI2RlZmluZSBJU19USU1fQ0hBTk5FTFMoX19DSEFOTkVMX18pICAgICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF9BTEwpKQorCisjZGVmaW5lIElTX1RJTV9PUE1fQ0hBTk5FTFMoX19DSEFOTkVMX18pICAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikpCisKKyNkZWZpbmUgSVNfVElNX0NPTVBMRU1FTlRBUllfQ0hBTk5FTFMoX19DSEFOTkVMX18pICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpKQorCisjZGVmaW5lIElTX1RJTV9DTE9DS1NPVVJDRShfX0NMT0NLX18pICgoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjApICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjEpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0lUUjMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMUVEKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX1RJMikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tQT0xBUklUWShfX1BPTEFSSVRZX18pICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMT0NLUE9MQVJJVFlfSU5WRVJURUQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX05PTklOVkVSVEVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjgpKQorCisjZGVmaW5lIElTX1RJTV9DTE9DS0ZJTFRFUihfX0lDRklMVEVSX18pICAgICAgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfSU5WRVJURUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTEVBUklOUFVUUE9MQVJJVFlfTk9OSU5WRVJURUQpKQorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAoKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVY4KSkKKworI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9GSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fT1NTUl9TVEFURShfX1NUQVRFX18pICAgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBUSU1fT1NTUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fT1NTSV9TVEFURShfX1NUQVRFX18pICAgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBUSU1fT1NTSV9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fTE9DS19MRVZFTChfX0xFVkVMX18pICAgICAgICgoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF9PRkYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRVZFTF9fKSA9PSBUSU1fTE9DS0xFVkVMXzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8zKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtfRklMVEVSKF9fQlJLRklMVEVSX18pICgoX19CUktGSUxURVJfXykgPD0gMHhGVUwpCisKKworI2RlZmluZSBJU19USU1fQlJFQUtfU1RBVEUoX19TVEFURV9fKSAgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBS19QT0xBUklUWShfX1BPTEFSSVRZX18pICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLUE9MQVJJVFlfTE9XKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLX0FGTU9ERShfX0FGTU9ERV9fKSAoKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUtfQUZNT0RFX0lOUFVUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRk1PREVfXykgPT0gVElNX0JSRUFLX0FGTU9ERV9CSURJUkVDVElPTkFMKSkKKworCisjZGVmaW5lIElTX1RJTV9CUkVBSzJfU1RBVEUoX19TVEFURV9fKSAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUsyX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLMl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUsyX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUsyUE9MQVJJVFlfTE9XKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBSzJQT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fQlJFQUsyX0FGTU9ERShfX0FGTU9ERV9fKSAoKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUsyX0FGTU9ERV9JTlBVVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FGTU9ERV9fKSA9PSBUSU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMKSkKKworCisjZGVmaW5lIElTX1RJTV9BVVRPTUFUSUNfT1VUUFVUX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBUSU1fQVVUT01BVElDT1VUUFVUX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fR1JPVVBDSDUoX19PQ1JFRl9fKSAoKCgoX19PQ1JFRl9fKSAmIDB4MUZGRkZGRkZVKSA9PSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX1RSR09fU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX1JFU0VUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19VUERBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0MxUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzJSRUYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DM1JFRikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0M0UkVGKSkKKworI2RlZmluZSBJU19USU1fVFJHTzJfU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9SRVNFVCkgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX0VOQUJMRSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfVVBEQVRFKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzEpICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DMVJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MyUkVGKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzNSRUYpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DM1JFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M0UkVGKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUYpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNlJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR0ZBTExJTkcpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzZSRUZfUklTSU5HRkFMTElORykgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX1JJU0lORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNVJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX1RJTV9NU01fU1RBVEUoX19TVEFURV9fKSAgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBUSU1fTUFTVEVSU0xBVkVNT0RFX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1RJTV9TTEFWRV9NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9ESVNBQkxFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX1JFU0VUKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfR0FURUQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSKSkKKworI2RlZmluZSBJU19USU1fUFdNX01PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1BXTTEpICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX1BXTTIpICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMikpCisKKyNkZWZpbmUgSVNfVElNX09DX01PREUoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVElNX09DTU9ERV9USU1JTkcpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9BQ1RJVkUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9JTkFDVElWRSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9UT0dHTEUpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9GT1JDRURfQUNUSVZFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTIpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX1RJMUZfRUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGUDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTJGUDIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19FVFJGKSkKKworI2RlZmluZSBJU19USU1fSU5URVJOQUxfVFJJR0dFUkVWRU5UX1NFTEVDVElPTihfX1NFTEVDVElPTl9fKSAoKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfTk9ORSkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQT0xBUklUWShfX1BPTEFSSVRZX18pICAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0lOVkVSVEVEICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX0ZBTExJTkcgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9CT1RIRURHRSAgICkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJQUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX1RSSUdHRVJGSUxURVIoX19JQ0ZJTFRFUl9fKSAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fVEkxU0VMRUNUSU9OKF9fVEkxU0VMRUNUSU9OX18pICAoKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX0NIMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJMVNFTEVDVElPTl9fKSA9PSBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OKSkKKworI2RlZmluZSBJU19USU1fRE1BX0xFTkdUSChfX0xFTkdUSF9fKSAgICAgICgoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOFRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzExVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE0VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE3VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTKSkKKworI2RlZmluZSBJU19USU1fSUNfRklMVEVSKF9fSUNGSUxURVJfXykgICAoKF9fSUNGSUxURVJfXykgPD0gMHhGVSkKKworI2RlZmluZSBJU19USU1fREVBRFRJTUUoX19ERUFEVElNRV9fKSAgICAoKF9fREVBRFRJTUVfXykgPD0gMHhGRlUpCisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKyNkZWZpbmUgSVNfVElNX0JSRUFLX1NZU1RFTShfX0NPTkZJR19fKSAgICAoKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX0VDQykgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX1BWRCkgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX1NSQU1fUEFSSVRZX0VSUk9SKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX0xPQ0tVUCkpCisjZWxzZQorI2RlZmluZSBJU19USU1fQlJFQUtfU1lTVEVNKF9fQ09ORklHX18pICAgICgoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fRUNDKSAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fU1JBTV9QQVJJVFlfRVJST1IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fTE9DS1VQKSkKKyNlbmRpZiAvKiBQV1JfUFZEX1NVUFBPUlQgKi8KKworI2RlZmluZSBJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRChfX1RSSUdHRVJfXykgKCgoX19UUklHR0VSX18pID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19UUklHR0VSX18pID09IFRJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSKSkKKworI2RlZmluZSBUSU1fU0VUX0lDUFJFU0NBTEVSVkFMVUUoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fSUNQU0NfXykgXAorKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IChfX0lDUFNDX18pKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKF9fSUNQU0NfXykpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpKQorCisjZGVmaW5lIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMxUFNDKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9ICh1aW50MTZfdCl+VElNX0NDTVIxX0lDMlBTQykgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSAodWludDE2X3QpflRJTV9DQ01SMl9JQzNQU0MpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX0lDNFBTQykpCisKKyNkZWZpbmUgVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fUE9MQVJJVFlfXykgXAorKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKF9fUE9MQVJJVFlfXykpIDpcCisgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgNFUpKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDhVKSkgOlwKKyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKChfX1BPTEFSSVRZX18pIDw8IDEyVSkpKSkKKworI2RlZmluZSBUSU1fUkVTRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApKSA6XAorICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSkgOlwKKyAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDM1AgfCBUSU1fQ0NFUl9DQzNOUCkpIDpcCisgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0M0UCB8IFRJTV9DQ0VSX0NDNE5QKSkpCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJbmNsdWRlIFRJTSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF90aW1fZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVGltZSBCYXNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUaW1lIEJhc2UgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBUaW1lIEJhc2UgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fQmFzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9CYXNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVGltZSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVGltZSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFRpbWVyIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09DX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVGltZSBQV00gZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWUgUFdNIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogVGltZXIgUFdNIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9QV01fTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgVGltZSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUaW1lIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBUaW1lciBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFRpbWUgT25lIFB1bHNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUaW1lIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFRpbWVyIE9uZSBQdWxzZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE9uZVB1bHNlTW9kZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBUaW1lIEVuY29kZXIgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWUgRW5jb2RlciBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFRpbWVyIEVuY29kZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmKiBzQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGExLCB1aW50MzJfdCAqcERhdGEyLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNyBUSU0gSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICAqICBAYnJpZWYgICBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qIEludGVycnVwdCBIYW5kbGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9USU1fSVJRSGFuZGxlcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA4IFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT0NfSW5pdFR5cGVEZWYqIHNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09DX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0lDX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsLCAgdWludDMyX3QgSW5wdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmICogc0NsZWFySW5wdXRDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0Nsb2NrQ29uZmlnVHlwZURlZiAqIHNDbG9ja1NvdXJjZUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ1RJMUlucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBUSTFfU2VsZWN0aW9uKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9fSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1dyaXRlU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSk7Cit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDkgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9CYXNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT0NfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9QV01fR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9JQ19HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBQcml2YXRlIEZ1bmN0aW9ucworKiBAeworKi8KK3ZvaWQgVElNX0Jhc2VfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fQmFzZV9Jbml0VHlwZURlZiAqU3RydWN0dXJlKTsKK3ZvaWQgVElNX1RJMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7Cit2b2lkIFRJTV9PQzJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7Cit2b2lkIFRJTV9FVFJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MzJfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fRXh0VFJHUG9sYXJpdHksIHVpbnQzMl90IEV4dFRSR0ZpbHRlcik7CisKK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyogQH0KKyovCisvKiBFbmQgb2YgcHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9USU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfdGltX2V4LmggYi9JbmMvc3RtMzJnMHh4X2hhbF90aW1fZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg3OTcyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfdGltX2V4LmgKQEAgLTAsMCArMSw0MTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbV9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUSU0gSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovIAorCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1RJTV9FWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9IQUxfVElNX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXgKKyAgKiBAeworICAqLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX1R5cGVzIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLyAgCisKKyAgdWludDMyX3QgQ29tbXV0YXRpb25fRGVsYXk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIHB1bHNlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBUSU1fSGFsbFNlbnNvcl9Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgVElNIEJyZWFrL0JyZWFrMiBpbnB1dCBjb25maWd1cmF0aW9uICAgCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTb3VyY2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgdGltZXIgYnJlYWsgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlICovCisgIHVpbnQzMl90IEVuYWJsZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgYnJlYWsgaW5wdXQgc291cmNlIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX0VuYWJsZSAqLworICB1aW50MzJfdCBQb2xhcml0eTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGJyZWFrIGlucHV0IHNvdXJjZSBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2VfUG9sYXJpdHkgKi8KK30KK1RJTUV4X0JyZWFrSW5wdXRDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU0gIEV4dGVuZGVkIFJlbWFwcGluZworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9HUElPICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCAqLworI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDIgICAgICAgICAgVElNMV9BRjFfRVRSU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0ICovCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzFfQVdEMSAgICAgIChUSU0xX0FGMV9FVFJTRUxfMSB8IFRJTTFfQUYxX0VUUlNFTF8wKSAgICAgLyogITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgQVdEMSAqLworI2RlZmluZSBUSU1fVElNMV9FVFJfQURDMV9BV0QyICAgICAgVElNMV9BRjFfRVRSU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QyICovCisjZGVmaW5lIFRJTV9USU0xX0VUUl9BREMxX0FXRDMgICAgICAoVElNMV9BRjFfRVRSU0VMXzIgfCBUSU0xX0FGMV9FVFJTRUxfMCkgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDMgKi8KKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIFRJTV9USU0yX0VUUl9HUElPICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAxICAgICAgICAgIFRJTTJfQUYxX0VUUlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCAqLworI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDIgICAgICAgICAgVElNMl9BRjFfRVRSU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0ICovCisjZGVmaW5lIFRJTV9USU0yX0VUUl9MU0UgICAgICAgICAgICAoVElNMl9BRjFfRVRSU0VMXzEgfCBUSU0yX0FGMV9FVFJTRUxfMCkgICAgIC8qICE8IFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNlbmRpZiAvKiAgVElNMiAqLworI2lmIGRlZmluZWQoVElNMykKKyNkZWZpbmUgVElNX1RJTTNfRVRSX0dQSU8gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNM19FVFIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNpZiBkZWZpbmVkKENPTVAxKSAmJiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDEgICAgICAgICAgVElNM19BRjFfRVRSU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0zX0VUUiBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0ICovCisjZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QMiAgICAgICAgICBUSU0zX0FGMV9FVFJTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTNfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworI2VuZGlmIC8qIFRJTTMgKi8KKy8qKgorICAqIEB9CisgICovIAorCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0IFRJTSAgRXh0ZW5kZWQgQnJlYWsgaW5wdXQKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVF9CUksgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUaW1lciBicmVhayBpbnB1dCAgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRfQlJLMiAgICAweDAwMDAwMDAyVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVGltZXIgYnJlYWsyIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqIEBkZWZncm91cCBUSU1FeF9CcmVha19JbnB1dF9Tb3VyY2UgVElNICBFeHRlbmRlZCBCcmVhayBpbnB1dCBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBBbiBleHRlcm5hbCBzb3VyY2UgKEdQSU8pIGlzIGNvbm5lY3RlZCB0byB0aGUgQktJTiBwaW4gICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDEgICAgMHgwMDAwMDAwMlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVGhlIENPTVAxIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJyZWFrIGlucHV0ICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAyICAgIDB4MDAwMDAwMDRVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRoZSBDT01QMiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZV9FbmFibGUgVElNIEV4dGVuZGVkIEJyZWFrIGlucHV0IHNvdXJjZSBlbmFibGluZworICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0RJU0FCTEUgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IEJyZWFrIGlucHV0IHNvdXJjZSBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9FTkFCTEUgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX1BvbGFyaXR5IFRJTSAgRXh0ZW5kZWQgQnJlYWsgaW5wdXQgcG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9MT1cgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9ISUdIICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgYWN0aXZlX2hpZ2ggKi8KKy8qKgorICAqIEB9CisgICovIAorICAgCisvKiogQGRlZmdyb3VwIFRJTUV4X1RpbWVyX0lucHV0X1NlbGVjdGlvbiBUSU0gIFRpbWVyIGlucHV0IHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9USU0xX1RJMV9HUElPICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QMSkKKyNkZWZpbmUgVElNX1RJTTFfVEkxX0NPTVAxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMV9USTEgaXMgY29ubmVjdGVkIHRvIENPTVAxIE9VVCAqLworI2VuZGlmIC8qIENPTVAxICovCisKKyNkZWZpbmUgVElNX1RJTTFfVEkyX0dQSU8gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMV9USTIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNpZiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU1fVElNMV9USTJfQ09NUDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xX1RJMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIgT1VUICovCisjZW5kaWYgLyogQ09NUDIgKi8KKworI2lmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgVElNX1RJTTJfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMl9USTEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTJfVEkxX0NPTVAxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMl9USTEgaXMgY29ubmVjdGVkIHRvIENPTVAxIE9VVCAqLworCisjZGVmaW5lIFRJTV9USU0yX1RJMl9HUElPICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTJfVEkyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIFRJTV9USU0yX1RJMl9DT01QMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTJfVEkyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBPVVQgKi8KKyNlbmRpZiAvKiBUSU0yICovCisKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNM19USTEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNpZiBkZWZpbmVkKENPTVAxKQorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0zX1RJMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgT1VUICovCisjZW5kaWYgLyogQ09NUDEgKi8KKworI2RlZmluZSBUSU1fVElNM19USTJfR1BJTyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0zX1RJMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2lmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIFRJTV9USU0zX1RJMl9DT01QMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTNfVEkyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBPVVQgKi8KKyNlbmRpZiAvKiBDT01QMiAqLworCisjZGVmaW5lIFRJTV9USU0xNF9USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE0X1RJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBUSU1fVElNMTRfVEkxX1JUQyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNF9USTEgaXMgY29ubmVjdGVkIHRvIFJUQyBjbG9jayAqLworI2RlZmluZSBUSU1fVElNMTRfVEkxX0hTRV8zMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNF9USTEgaXMgY29ubmVjdGVkIHRvIEhTRSBkaXYgMzIgKi8KKyNkZWZpbmUgVElNX1RJTTE0X1RJMV9NQ08gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTRfVEkxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8KKworI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIFRJTV9USU0xNV9USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE1X1RJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBUSU1fVElNMTVfVEkxX1RJTTJfQ0gxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNV9USTEgaXMgY29ubmVjdGVkIHRvIFRJTTIgQ0gxICovCisjZGVmaW5lIFRJTV9USU0xNV9USTFfVElNM19DSDEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE1X1RJMSBpcyBjb25uZWN0ZWQgdG8gVElNMyBDSDEgKi8KKworI2RlZmluZSBUSU1fVElNMTVfVEkyX0dQSU8gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNV9USTIgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTE1X1RJMl9USU0yX0NIMiAgICAgICAgICAgICAgICAweDAwMDAwMTAwVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTVfVEkyIGlzIGNvbm5lY3RlZCB0byBUSU0yIENIMiAqLworI2RlZmluZSBUSU1fVElNMTVfVEkyX1RJTTNfQ0gyICAgICAgICAgICAgICAgIDB4MDAwMDAyMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNV9USTIgaXMgY29ubmVjdGVkIHRvIFRJTTMgQ0gyICovCisjZW5kaWYgLyogVElNMTUgKi8KKworI2RlZmluZSBUSU1fVElNMTZfVEkxX0dQSU8gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNl9USTEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9MU0kgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTZfVEkxIGlzIGNvbm5lY3RlZCB0byBMU0kgKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9MU0UgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTZfVEkxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9SVENfV0FLRVVQICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTZfVEkxIGlzIGNvbm5lY3RlZCB0byBUUkMgd2FrZXVwIGludGVycnVwdCAqLworCisjZGVmaW5lIFRJTV9USU0xN19USTFfR1BJTyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE3X1RJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBUSU1fVElNMTdfVEkxX0hTRV8zMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xN19USTEgaXMgY29ubmVjdGVkIHRvIEhTRSBkaXYgMzIgKi8KKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9NQ08gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTdfVEkxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovIAorLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLyAgCisKKy8qKgorICAqIEB9CisgICovIAorLyogRW5kIG9mIGV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfUHJpdmF0ZV9NYWNyb3MgVElNIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBJU19USU1fUkVNQVAoX19SRU1BUF9fKSAoKCgoX19SRU1BUF9fKSAmIDB4RkZGQzNGRkZVKSA9PSAweDAwMDAwMDAwVSkpICAgICAgCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVQoX19CUkVBS0lOUFVUX18pICAoKChfX0JSRUFLSU5QVVRfXykgPT0gVElNX0JSRUFLSU5QVVRfQlJLKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQlJFQUtJTlBVVF9fKSA9PSBUSU1fQlJFQUtJTlBVVF9CUksyKSkKKworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIElTX1RJTV9CUkVBS0lOUFVUU09VUkNFKF9fU09VUkNFX18pICAoKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAyKSkKKyNlbHNlCisjZGVmaW5lIElTX1RJTV9CUkVBS0lOUFVUU09VUkNFKF9fU09VUkNFX18pICAoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU4pCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKworI2RlZmluZSBJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9TVEFURShfX1NUQVRFX18pICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0RJU0FCTEUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWShfX1BPTEFSSVRZX18pICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZX0xPVykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fVElTRUwoX19USVNFTF9fKSAoKCgoX19USVNFTF9fKSAmIDB4RjBGMEYwRjBVKSA9PSAweDAwMDAwMDAwVSkpICAgICAgCisKKy8qKgorICAqIEB9CisgICovIAorLyogRW5kIG9mIHByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucworICogIEBicmllZiAgICBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qICBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSGFsbFNlbnNvcl9Jbml0VHlwZURlZiogc0NvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworCit2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworCisgLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBFeHRlbmRlZCBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgKiBAeworICovCisvKiAgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBFeHRlbmRlZCBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgKiBAeworICovCisvKiAgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIEV4dGVuZGVkIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X01hc3RlckNvbmZpZ1N5bmNocm9uaXphdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKiBzTWFzdGVyQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdCcmVha0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdCcmVha0lucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCcmVha0lucHV0LCBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZiAqc0JyZWFrSW5wdXRDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0dyb3VwQ2hhbm5lbDUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWxzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXApOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9USU1FeF9USVNlbGVjdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVElTZWxlY3Rpb24gLCB1aW50MzJfdCBDaGFubmVsKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0Rpc2FybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1JlQXJtQnJlYWtJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnJlYWtJbnB1dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogRXh0ZW5kZWQgQ2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNyBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8gCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU1FeCBQcml2YXRlIEZ1bmN0aW9ucworKiBAeworKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisvKioKKyogQH0KKyovIAorLyogRW5kIG9mIHByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9USU1fRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9oYWxfdWFydC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfdWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDdlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF91YXJ0LmgKQEAgLTAsMCArMSwxNjE4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF91YXJ0LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVBUlQgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1VBUlRfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1VBUlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlQKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX1R5cGVzIFVBUlQgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVUFSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIFVBUlQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKDI1NiAqIGxwdWFydF9rZXJfY2twcmVzKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBscHVhcnRfa2VyX2NrX3ByZXMgaXMgdGhlIFVBUlQgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSBhIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIG92ZXJzYW1wbGluZyBpcyAxNiBvciBpbiBMSU4gbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKHVhcnRfa2VyX2NrcHJlcykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiBvdmVyc2FtcGxpbmcgaXMgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbMTU6NF0gPSAoKDIgKiB1YXJ0X2tlcl9ja3ByZXMpIC8gKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKVsxNTo0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclszXSA9ICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzI6MF0gPSAgKCgoMiAqIHVhcnRfa2VyX2NrcHJlcykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzM6MF0pID4+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB1YXJ0X2tlcl9ja19wcmVzIGlzIHRoZSBVQVJUIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVEV4X1dvcmRfTGVuZ3RoLiAqLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9TdG9wX0JpdHMuICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX01vZGUuICovCisKKyAgdWludDMyX3QgSHdGbG93Q3RsOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9IYXJkd2FyZV9GbG93X0NvbnRyb2wuICovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgT3ZlciBzYW1wbGluZyA4IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQsIHRvIGFjaGlldmUgaGlnaGVyIHNwZWVkICh1cCB0byBmX1BDTEsvOCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJfU2FtcGxpbmcuICovCisKKyAgdWludDMyX3QgT25lQml0U2FtcGxpbmc7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBhIHNpbmdsZSBzYW1wbGUgb3IgdGhyZWUgc2FtcGxlcycgbWFqb3JpdHkgdm90ZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RpbmcgdGhlIHNpbmdsZSBzYW1wbGUgbWV0aG9kIGluY3JlYXNlcyB0aGUgcmVjZWl2ZXIgdG9sZXJhbmNlIHRvIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWF0aW9ucy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX09uZUJpdF9TYW1wbGluZy4gKi8KKworICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBVQVJUIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQ2xvY2tQcmVzY2FsZXIuICovCisKK30gVUFSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVQVJUIEFkdmFuY2VkIEZlYXR1cmVzIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBBZHZGZWF0dXJlSW5pdDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGFkdmFuY2VkIFVBUlQgZmVhdHVyZXMgaXMgaW5pdGlhbGl6ZWQuIFNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIEZlYXR1cmVzIG1heSBiZSBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlLiAqLworCisgIHVpbnQzMl90IFR4UGluTGV2ZWxJbnZlcnQ7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVFggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9UeF9JbnYuICovCisKKyAgdWludDMyX3QgUnhQaW5MZXZlbEludmVydDsgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBSWCBwaW4gYWN0aXZlIGxldmVsIGlzIGludmVydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1J4X0ludi4gKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBhcmUgaW52ZXJ0ZWQgKHBvc2l0aXZlL2RpcmVjdCBsb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0RhdGFfSW52LiAqLworCisgIHVpbnQzMl90IFN3YXA7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9SeF9UeF9Td2FwLiAqLworCisgIHVpbnQzMl90IE92ZXJydW5EaXNhYmxlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJydW5fRGlzYWJsZS4gKi8KKworICB1aW50MzJfdCBETUFEaXNhYmxlb25SeEVycm9yOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvci4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVFbmFibGU7ICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZS4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVNb2RlOyAgICAgIC8qITwgSWYgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQsIHNwZWNpZmllcyBob3cgdGhlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiBpcyBjYXJyaWVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUuICovCisKKyAgdWludDMyX3QgTVNCRmlyc3Q7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIE1TQiBpcyBzZW50IGZpcnN0IG9uIFVBUlQgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9NU0JfRmlyc3QuICovCit9IFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmOworCisKKworLyoqCisgICogQGJyaWVmIEhBTCBVQVJUIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFVBUlQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZSAoc2VlIEByZWYgVUFSVF9TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZC4gSEFMIFVBUlQgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIFVBUlQgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAqLworICBVQVJUX0NMT0NLU09VUkNFX0hTSSAgICAgICAgPSAweDAyVSwgICAgLyohPCBIU0kgY2xvY2sgc291cmNlICAgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLICAgICA9IDB4MDRVLCAgICAvKiE8IFNZU0NMSyBjbG9jayBzb3VyY2UgKi8KKyAgVUFSVF9DTE9DS1NPVVJDRV9MU0UgICAgICAgID0gMHgwOFUsICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRCAgPSAweDEwVSAgICAgLyohPCBVbmRlZmluZWQgY2xvY2sgc291cmNlICovCit9IFVBUlRfQ2xvY2tTb3VyY2VUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZgoreworICBVU0FSVF9UeXBlRGVmICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgKi8KKworICBVQVJUX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKworICBVQVJUX0FkdkZlYXR1cmVJbml0VHlwZURlZiBBZHZhbmNlZEluaXQ7ICAgICAgICAgICAvKiE8IFVBUlQgQWR2YW5jZWQgRmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBVQVJUIFR4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAgICAgICAgIC8qITwgVUFSVCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAgICAgICAgIC8qITwgVUFSVCBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBVQVJUIFJ4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAgICAgICAgIC8qITwgVUFSVCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAgICAgICAgIC8qITwgVUFSVCBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBNYXNrOyAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBSeCBSRFIgcmVnaXN0ZXIgbWFzayAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBGaWZvTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBGSUZPIG1vZGUgaXMgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRFeF9GSUZPX21vZGUuICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE5iUnhEYXRhVG9Qcm9jZXNzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWCBJU1IgZXhlY3V0aW9uICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE5iVHhEYXRhVG9Qcm9jZXNzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBUWCBJU1IgZXhlY3V0aW9uICovCisKKyAgdm9pZCAoKlJ4SVNSKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFJ4IElSUSBoYW5kbGVyICAgKi8KKworICB2b2lkICgqVHhJU1IpKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVJRIGhhbmRsZXIgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXR4OyAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX1VBUlRfU3RhdGVUeXBlRGVmICAgIGdTdGF0ZTsgICAgICAgICAgICAgIC8qITwgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9VQVJUX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX1VBUlRfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAgICAgICAgIC8qITwgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAvKiE8IFVBUlQgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgIC8qITwgVUFSVCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworICB2b2lkICgqIFR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAgICAvKiE8IFVBUlQgVHggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgLyohPCBVQVJUIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgICAgIC8qITwgVUFSVCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgICAgICAvKiE8IFVBUlQgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydENwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgLyohPCBVQVJUIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgVUFSVCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICB2b2lkICgqIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAvKiE8IFVBUlQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBXYWtldXBDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAgLyohPCBVQVJUIFdha2V1cCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogUnhGaWZvRnVsbENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgIC8qITwgVUFSVCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgICAgICAgICAgICAqLworICB2b2lkICgqIFR4Rmlmb0VtcHR5Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAvKiE8IFVBUlQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAvKiE8IFVBUlQgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgLyohPCBVQVJUIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBVQVJUX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBVQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VQVJUX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgVUFSVCBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9VQVJUX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgID0gMHgwN1UsICAgIC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworICBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgICAgICAgICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IFVBUlQgV2FrZXVwIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEICAgICAgICAgICAgPSAweDA5VSwgICAgLyohPCBVQVJUIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRCAgICAgICAgICAgICovCisgIEhBTF9VQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgICAgICAgICAgID0gMHgwQVUsICAgIC8qITwgVUFSVCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElEICAgICAgICAgICAqLworCisgIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwQlUsICAgIC8qITwgVUFSVCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MENVICAgICAvKiE8IFVBUlQgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgVUFSVCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVUFSVF9DYWxsYmFja1R5cGVEZWYpKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgLyohPCBwb2ludGVyIHRvIGFuIFVBUlQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9Db25zdGFudHMgVUFSVCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RhdGVfRGVmaW5pdGlvbiBVQVJUIFN0YXRlIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9SRVNFVCAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX1JFQURZICAgICAgICAgMHgwMDAwMDAyMFUgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9CVVNZICAgICAgICAgIDB4MDAwMDAwMjRVICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX0JVU1lfVFggICAgICAgMHgwMDAwMDAyMVUgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCAgICAgICAweDAwMDAwMDIyVSAgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCAgICAweDAwMDAwMDIzVSAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIGFuZCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfVElNRU9VVCAgICAgICAweDAwMDAwMEEwVSAgICAvKiE8IFRpbWVvdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfRVJST1IgICAgICAgICAweDAwMDAwMEUwVSAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FcnJvcl9EZWZpbml0aW9uICAgVUFSVCBFcnJvciBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX05PTkUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfUEUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgICAvKiE8IFBhcml0eSBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9ORSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAgIC8qITwgTm9pc2UgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX0ZFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgICAgLyohPCBGcmFtZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfT1JFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9ETUEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpICAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0b3BfQml0cyAgIFVBUlQgTnVtYmVyIG9mIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIHdpdGggMC41IHN0b3AgYml0ICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSB3aXRoIDEgc3RvcCBiaXQgICAgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18xXzUgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSAvKiE8IFVBUlQgZnJhbWUgd2l0aCAxLjUgc3RvcCBiaXRzICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIHdpdGggMiBzdG9wIGJpdHMgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1Bhcml0eSAgVUFSVCBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcGFyaXR5ICAgKi8KKyNkZWZpbmUgVUFSVF9QQVJJVFlfRVZFTiAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFVBUlRfUEFSSVRZX09ERCAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSAgICAgLyohPCBPZGQgcGFyaXR5ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCBVQVJUIEhhcmR3YXJlIEZsb3cgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSFdDT05UUk9MX05PTkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBoYXJkd2FyZSBjb250cm9sICAgICAgICovCisjZGVmaW5lIFVBUlRfSFdDT05UUk9MX1JUUyAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfUlRTRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IFRvIFNlbmQgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSFdDT05UUk9MX0NUUyAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTRSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDbGVhciBUbyBTZW5kICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSFdDT05UUk9MX1JUU19DVFMgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkgICAgLyohPCBSZXF1ZXN0IGFuZCBDbGVhciBUbyBTZW5kICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTW9kZSBVQVJUIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX01PREVfUlggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgIC8qITwgUlggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9NT0RFX1RYICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgICAvKiE8IFRYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFVBUlRfTU9ERV9UWF9SWCAgICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfVEUgfFVTQVJUX0NSMV9SRSkgICAgLyohPCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0YXRlICBVQVJUIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IFVBUlQgZGlzYWJsZWQgICovCisjZGVmaW5lIFVBUlRfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9VRSAgICAgICAgLyohPCBVQVJUIGVuYWJsZWQgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX092ZXJfU2FtcGxpbmcgVUFSVCBPdmVyIFNhbXBsaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9PVkVSU0FNUExJTkdfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBVQVJUX09WRVJTQU1QTElOR184ICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfT1ZFUjggICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfT25lQml0X1NhbXBsaW5nIFVBUlQgT25lIEJpdCBTYW1wbGluZyBNZXRob2QKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgIC8qITwgT25lLWJpdCBzYW1wbGluZyBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFICAgICAgICAgIFVTQVJUX0NSM19PTkVCSVQgICAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DbG9ja1ByZXNjYWxlciAgVUFSVCBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYxICAgIDB4MDAwMDAwMDBVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsgICAgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjIgICAgMHgwMDAwMDAwMVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8yICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWNCAgICAweDAwMDAwMDAyVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzQgICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVY2ICAgIDB4MDAwMDAwMDNVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNiAgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjggICAgMHgwMDAwMDAwNFUgIC8qITwgZmNsa19wcmVzID0gZmNsay84ICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTAgICAweDAwMDAwMDA1VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEwICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYxMiAgIDB4MDAwMDAwMDZVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTIgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjE2ICAgMHgwMDAwMDAwN1UgIC8qITwgZmNsa19wcmVzID0gZmNsay8xNiAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMzIgICAweDAwMDAwMDA4VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzMyICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVY2NCAgIDB4MDAwMDAwMDlVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNjQgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjEyOCAgMHgwMDAwMDAwQVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMjggKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMjU2ICAweDAwMDAwMDBCVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0F1dG9CYXVkX1JhdGVfTW9kZSAgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgQXV0b0JhdWQgUmF0ZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTlNUQVJUQklUICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiBzdGFydCBiaXQgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09ORkFMTElOR0VER0UgVVNBUlRfQ1IyX0FCUk1PREVfMCAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG9uIGZhbGxpbmcgZWRnZSAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDdGRlJBTUUgICBVU0FSVF9DUjJfQUJSTU9ERV8xICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gb24gMHg3RiBmcmFtZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSAgIFVTQVJUX0NSMl9BQlJNT0RFICAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiAweDU1IGZyYW1lIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1JlY2VpdmVyX1RpbWVPdXQgVUFSVCBSZWNlaXZlciBUaW1lT3V0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSAgICAgICAgVVNBUlRfQ1IyX1JUT0VOICAgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9MSU4gICAgVUFSVCBMb2NhbCBJbnRlcmNvbm5lY3Rpb24gTmV0d29yayBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9MSU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBMb2NhbCBJbnRlcmNvbm5lY3QgTmV0d29yayBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfTElOX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9MSU5FTiAgICAgICAgICAgIC8qITwgTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0xJTl9CcmVha19EZXRlY3Rpb24gIFVBUlQgTElOIEJyZWFrIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTBCICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITwgTElOIDEwLWJpdCBicmVhayBkZXRlY3Rpb24gbGVuZ3RoICovCisjZGVmaW5lIFVBUlRfTElOQlJFQUtERVRFQ1RMRU5HVEhfMTFCICAgICAgIFVTQVJUX0NSMl9MQkRMICAgICAgICAgICAgIC8qITwgTElOIDExLWJpdCBicmVhayBkZXRlY3Rpb24gbGVuZ3RoICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RNQV9UeCAgICBVQVJUIERNQSBUeAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfRE1BX1RYX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITwgVUFSVCBETUEgVFggZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUFSVF9ETUFfVFhfRU5BQkxFICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0RNQVQgICAgICAgICAgICAgLyohPCBVQVJUIERNQSBUWCBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RNQV9SeCAgIFVBUlQgRE1BIFJ4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9ETUFfUlhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBETUEgUlggZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUFSVF9ETUFfUlhfRU5BQkxFICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0RNQVIgICAgICAgICAgICAgIC8qITwgVUFSVCBETUEgUlggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9IYWxmX0R1cGxleF9TZWxlY3Rpb24gIFVBUlQgSGFsZiBEdXBsZXggU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9IQUxGX0RVUExFWF9ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBoYWxmLWR1cGxleCBkaXNhYmxlZCAqLworI2RlZmluZSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSAgICAgICAgICAgICBVU0FSVF9DUjNfSERTRUwgICAgICAgICAgICAgLyohPCBVQVJUIGhhbGYtZHVwbGV4IGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfV2FrZVVwX01ldGhvZHMgICBVQVJUIFdha2VVcCBNZXRob2RzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIGlkbGUgbGluZSAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSyAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gYWRkcmVzcyBtYXJrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUmVxdWVzdF9QYXJhbWV0ZXJzIFVBUlQgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BVVRPQkFVRF9SRVFVRVNUICAgICAgICAgICAgICAgVVNBUlRfUlFSX0FCUlJRICAgICAgICAvKiE8IEF1dG8tQmF1ZCBSYXRlIFJlcXVlc3QgICAgICAqLworI2RlZmluZSBVQVJUX1NFTkRCUkVBS19SRVFVRVNUICAgICAgICAgICAgICBVU0FSVF9SUVJfU0JLUlEgICAgICAgIC8qITwgU2VuZCBCcmVhayBSZXF1ZXN0ICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfTVVURV9NT0RFX1JFUVVFU1QgICAgICAgICAgICAgIFVTQVJUX1JRUl9NTVJRICAgICAgICAgLyohPCBNdXRlIE1vZGUgUmVxdWVzdCAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgICAgVVNBUlRfUlFSX1JYRlJRICAgICAgICAvKiE8IFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0ICAqLworI2RlZmluZSBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICAgICBVU0FSVF9SUVJfVFhGUlEgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZSAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEluaXRpYWxpemF0aW9uIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBObyBhZHZhbmNlZCBmZWF0dXJlIGluaXRpYWxpemF0aW9uICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICAgMHgwMDAwMDAwNFUgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgICAgICAgICAgICAgICAweDAwMDAwMDA4VSAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgIDB4MDAwMDAwMTBVICAgICAgICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCAgMHgwMDAwMDAyMFUgICAgICAgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfSU5JVCAgICAgICAweDAwMDAwMDQwVSAgICAgICAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBpbml0aWFsaXphdGlvbiAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwODBVICAgICAgICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1R4X0ludiBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSAgICAgICAgVVNBUlRfQ1IyX1RYSU5WICAgICAgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUnhfSW52IFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBSWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFICAgICAgICBVU0FSVF9DUjJfUlhJTlYgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9EYXRhX0ludiAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFICAgICAgVVNBUlRfQ1IyX0RBVEFJTlYgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1J4X1R4X1N3YXAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFJYIFRYIFBpbnMgU3dhcAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVFgvUlggcGlucyBzd2FwIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFICAgICAgICAgVVNBUlRfQ1IyX1NXQVAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX092ZXJydW5fRGlzYWJsZSAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIE92ZXJydW4gRGlzYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgUlggb3ZlcnJ1biBlbmFibGUgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0RJU0FCTEUgICAgIFVTQVJUX0NSM19PVlJESVMgICAgICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZSAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEF1dG8gQmF1ZFJhdGUgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBSWCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gZW5hYmxlICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSAgICBVU0FSVF9DUjJfQUJSRU4gICAgICAvKiE8IFJYIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBkaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgRE1BIERpc2FibGUgT24gUnggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0VOQUJMRU9OUlhFUlJPUiAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IERNQSBlbmFibGUgb24gUmVjZXB0aW9uIEVycm9yICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfRE1BX0RJU0FCTEVPTlJYRVJST1IgICBVU0FSVF9DUjNfRERSRSAgICAgICAvKiE8IERNQSBkaXNhYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX01TQl9GaXJzdCAgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBNU0IgRmlyc3QKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICBVU0FSVF9DUjJfTVNCRklSU1QgICAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1N0b3BfTW9kZV9FbmFibGUgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgU3RvcCBNb2RlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVUFSVCBzdG9wIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFICAgICBVU0FSVF9DUjFfVUVTTSAgICAgICAgICAvKiE8IFVBUlQgc3RvcCBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9NdXRlX01vZGUgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgTXV0ZSBNb2RlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVUFSVCBtdXRlIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRU5BQkxFICAgICBVU0FSVF9DUjFfTU1FICAgICAgICAgICAvKiE8IFVBUlQgbXV0ZSBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TICAgIFVBUlQgQWRkcmVzcy1tYXRjaGluZyBMU0IgUG9zaXRpb24gSW4gQ1IyIFJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9DUjJfQUREUkVTU19MU0JfUE9TICAgICAgICAgICAgIDI0VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGFkZHJlc3MtbWF0Y2hpbmcgTFNCIHBvc2l0aW9uIGluIENSMiByZWdpc3RlciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uICAgVUFSVCBXYWtlVXAgRnJvbSBTdG9wIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX0FERFJFU1MgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQgICAgICAgICAgICAgVVNBUlRfQ1IzX1dVU18xICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gc3RhcnQgYml0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9SRUFEREFUQV9OT05FTVBUWSAgICBVU0FSVF9DUjNfV1VTICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiByZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IG9yIFJYRklGTyBpcyBub3QgZW1wdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9Ecml2ZXJFbmFibGVfUG9sYXJpdHkgICAgICBVQVJUIERyaXZlckVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfREVfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRHJpdmVyIGVuYWJsZSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgVUFSVF9ERV9QT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0RFUCAgICAgICAgICAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgbG93ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyAgICBVQVJUIERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUgTFNCIFBvc2l0aW9uIEluIENSMSBSZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ1IxX0RFQVRfQUREUkVTU19MU0JfUE9TICAgICAgIDIxVSAgICAgIC8qITwgVUFSVCBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lIExTQiBwb3NpdGlvbiBpbiBDUjEgcmVnaXN0ZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjFfREVEVF9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBEcml2ZXIgRW5hYmxlIERlQXNzZXJ0aW9uIFRpbWUgTFNCIFBvc2l0aW9uIEluIENSMSBSZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TICAgICAgIDE2VSAgICAgIC8qITwgVUFSVCBEcml2ZXIgRW5hYmxlIGRlLWFzc2VydGlvbiB0aW1lIExTQiBwb3NpdGlvbiBpbiBDUjEgcmVnaXN0ZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRpb25fTWFzayAgICBVQVJUIEludGVycnVwdGlvbnMgRmxhZyBNYXNrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGVSAgLyohPCBVQVJUIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1RpbWVPdXRfVmFsdWUgICAgVUFSVCBwb2xsaW5nLWJhc2VkIGNvbW11bmljYXRpb25zIHRpbWUtb3V0IHZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSAgICAgICAgICAgICAgMHgxRkZGRkZGVSAgLyohPCBVQVJUIHBvbGxpbmctYmFzZWQgY29tbXVuaWNhdGlvbnMgdGltZS1vdXQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9GbGFncyAgICAgVUFSVCBTdGF0dXMgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfRkxBR19UWEZUICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEZUICAgICAgICAgIC8qITwgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYRlQgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRlQgICAgICAgICAgLyohPCBVQVJUIFJYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUlhGRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAvKiE8IFVBUlQgUlhGSUZPIEZ1bGwgZmxhZyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19UWEZFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEZFICAgICAgICAgIC8qITwgVUFSVCBUWEZJRk8gRW1wdHkgZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JFQUNLICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEVBQ0sgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19XVUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JXVSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JXVSAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHdha2UtdXAgZnJvbSBtdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBVQVJUX0ZMQUdfU0JLRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfU0JLRiAgICAgICAgICAvKiE8IFVBUlQgc2VuZCBicmVhayBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19DTUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DTUYgICAgICAgICAgIC8qITwgVUFSVCBjaGFyYWN0ZXIgbWF0Y2ggZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBVQVJUIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQUJSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgIC8qITwgVUFSVCBhdXRvIEJhdWQgcmF0ZSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0NUUyAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUUyAgICAgICAgICAgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ1RTSUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ1RTSUYgICAgICAgICAvKiE8IFVBUlQgY2xlYXIgdG8gc2VuZCBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19MQkRGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9MQkRGICAgICAgICAgIC8qITwgVUFSVCBMSU4gYnJlYWsgZGV0ZWN0aW9uIGZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhGTkYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhFX1RYRk5GICAgICAvKiE8IFVBUlQgVFhGSUZPIG5vdCBmdWxsICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19UQyAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UQyAgICAgICAgICAgIC8qITwgVUFSVCB0cmFuc21pc3Npb24gY29tcGxldGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgLyohPCBVQVJUIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUlhGTkUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhORV9SWEZORSAgICAvKiE8IFVBUlQgUlhGSUZPIG5vdCBlbXB0eSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19JRExFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgIC8qITwgVUFSVCBpZGxlIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBVQVJUIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAvKiE8IFVBUlQgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBVQVJUIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0ludGVycnVwdF9kZWZpbml0aW9uICAgVUFSVCBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMFpaWlpaMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICAqICAgICAgICAgICAtIFpaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig1Yml0cykKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDAwMDAwMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMFpaWlowMDAwMDAwMGIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0lUX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfVFhFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyN1UgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9UWEZORiAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVUFSVF9JVF9SWEZORSAgICAgICAgICAgICAgICAgICAgICAgMHgwNTI1VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjRVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGlkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfTEJEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDg0NlUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9DVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTZBVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBDVFMgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0NNICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMkVVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGNoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfV1VGICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3NlUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHRpb24gICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9SWEZGICAgICAgICAgICAgICAgICAgICAgICAgMHgxODNGVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBSWEZJRk8gZnVsbCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3M0VVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFRYRklGTyBlbXB0eSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfUlhGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MUE3Q1UgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9UWEZUICAgICAgICAgICAgICAgICAgICAgICAgMHgxQjc3VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQgaW50ZXJydXB0aW9uICAgICAqLworCisjZGVmaW5lIFVBUlRfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgKi8KKworI2RlZmluZSBVQVJUX0lUX09SRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDBVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVBUlRfSVRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMFUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0lUX0NMRUFSX0ZsYWdzICBVQVJUIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgIC8qITwgTm9pc2UgRXJyb3IgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfSURMRUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgIC8qITwgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVFhGRUNGICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVFhGRUNGICAgICAgICAgIC8qITwgVFhGSUZPIGVtcHR5IGNsZWFyIGZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTEJERiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTEJEQ0YgICAgICAgICAgIC8qITwgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ1RTRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgIC8qITwgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ01GICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfV1VGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgIC8qITwgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfTWFjcm9zIFVBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgVUFSVCBoYW5kbGUgc3RhdGVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9VQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVUFSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZiAvKlVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqIEBicmllZiAgRmx1c2ggdGhlIFVBUlQgRGF0YSByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgXAorICBkb3sgICAgICAgICAgICAgICAgXAorICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICB9ICB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGICAgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfVFhGRUNGICAgVFhGSUZPIGVtcHR5IGNsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RDRiAgICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgICBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NUU0YgICAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ01GICAgICAgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgICAgIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgQ2xlYXIgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9QRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfT1JFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSURMRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBUWCBGSUZPIGVtcHR5IGNsZWFyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfVFhGRUNGKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9UWEZFQ0YpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWEZGICBSWEZJRk8gRnVsbCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRkUgIFRYRklGTyBFbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfV1VGICAgV2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JXVSAgIFJlY2VpdmVyIHdha2UgdXAgZmxhZyAoaWYgdGhlIFVBUlQgaW4gbXV0ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19TQktGICBTZW5kIEJyZWFrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQ01GICAgQ2hhcmFjdGVyIG1hdGNoIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkUgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0NUUyAgIENUUyBDaGFuZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19MQkRGICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRk5GIFVBUlQgVFhGSUZPIG5vdCBmdWxsIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRk5FIFVBUlQgUlhGSUZPIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19PUkUgICBPdmVycnVuIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUEUgICAgUGFyaXR5IEVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSU5URVJSVVBUX18pPj4gOFUpKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRkUgIFRYRklGTyBFbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKSA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgVUFSVF9JVF9NQVNLKSkpICAhPSBSRVNFVCkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGICAgIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9GRUYgICAgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfSURMRUYgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RDRiAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTEJERiAgIExJTiBCcmVhayBEZXRlY3Rpb24gQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ1RTRiAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ01GICAgIENoYXJhY3RlciBNYXRjaCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVQVJUIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0FVVE9CQVVEX1JFUVVFU1QgQXV0by1CYXVkIFJhdGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QgU2VuZCBCcmVhayBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9NVVRFX01PREVfUkVRVUVTVCBNdXRlIE1vZGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFVBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+VVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gflVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRW5hYmxlIENUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBlbmFibGUgQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgQ1RTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfQ1RTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19DVFNFKTsgIFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsIHw9IFVTQVJUX0NSM19DVFNFOyAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBEaXNhYmxlIENUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIENUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19DVFNFKTsgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSVFMgZmxvdyBjb250cm9sLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZW5hYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCB8PSBVU0FSVF9DUjNfUlRTRTsgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFJUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SVFNFKTtcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19SVFNFKTsgICAgIFwKKyAgfSB3aGlsZSgwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX01hY3JvcyAgIFVBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgR2V0IFVBUlQgY2xvayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBjbG9jayBwcmVzY2FsZXIgdmFsdWUuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBVQVJUIGNsb2NrIGRpdmlzaW9uIGZhY3RvcgorICAqLworI2RlZmluZSBVQVJUX0dFVF9ESVZfRkFDVE9SKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgXAorICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpICAgPyAxVSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYyKSAgID8gMlUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNCkgICA/IDRVIDogICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpICAgPyA2VSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY4KSAgID8gOFUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTApICA/IDEwVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSAgPyAxMlUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxNikgID8gMTZVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMzIpICA/IDMyVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSAgPyA2NFUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMjgpID8gMTI4VSA6ICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMjU2KSA/IDI1NlUgOiAxVSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIHdpdGggTFBVQVJULgorICAqIEBwYXJhbSAgX19QQ0xLX18gTFBVQVJUIGNsb2NrLgorICAqIEBwYXJhbSAgX19CQVVEX18gQmF1ZCByYXRlIHNldCBieSB0aGUgdXNlci4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICAqLworI2RlZmluZSBVQVJUX0RJVl9MUFVBUlQoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAgICAgKCh1aW50MzJfdCkoKCgoKHVpbnQ2NF90KShfX1BDTEtfXykvVUFSVF9HRVRfRElWX0ZBQ1RPUigoX19DTE9DS1BSRVNDQUxFUl9fKSkpKjI1NlUpICsgKHVpbnQzMl90KSgoX19CQVVEX18pLzJVKSkgLyAoX19CQVVEX18pKSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDgtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gVUFSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVUFSVF9ESVZfU0FNUExJTkc4KF9fUENMS19fLCBfX0JBVURfXywgX19DTE9DS1BSRVNDQUxFUl9fKSAgICgoKCgoX19QQ0xLX18pL1VBUlRfR0VUX0RJVl9GQUNUT1IoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykpKSoyVSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDE2LWJpdCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEBwYXJhbSAgX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgcHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgICovCisjZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HMTYoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAoKCgoX19QQ0xLX18pL1VBUlRfR0VUX0RJVl9GQUNUT1IoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykpKSArICgoX19CQVVEX18pLzJVKSkgLyAoX19CQVVEX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIG9yIG5vdCBVQVJUIGluc3RhbmNlIGlzIExvdyBQb3dlciBVQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgU0VUIChpbnN0YW5jZSBpcyBMUFVBUlQpIG9yIFJFU0VUIChpbnN0YW5jZSBpc24ndCBMUFVBUlQpCisgICovCisjZGVmaW5lIFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoX19IQU5ETEVfXykgKElTX0xQVUFSVF9JTlNUQU5DRSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBCYXVkIHJhdGUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAqICAgICAgICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBHMCAoaS5lLiA2NCBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAgKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA4MDAwMDAxVSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBhc3NlcnRpb24gdGltZS4KKyAgKiBAcGFyYW0gIF9fVElNRV9fIDUtYml0IHZhbHVlIGFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0FTU0VSVElPTlRJTUUoX19USU1FX18pICAgICgoX19USU1FX18pIDw9IDB4MUZVKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIGRlYXNzZXJ0aW9uIHRpbWUuCisgICogQHBhcmFtICBfX1RJTUVfXyA1LWJpdCB2YWx1ZSBkZWFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0RFQVNTRVJUSU9OVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMHgxRlUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMuCisgICogQHJldHZhbCBTRVQgKF9fU1RPUEJJVFNfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RPUEJJVFNfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1NUT1BCSVRTKF9fU1RPUEJJVFNfXykgKCgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzBfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzFfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgTFBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBMUFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0xQVUFSVF9TVE9QQklUUyhfX1NUT1BCSVRTX18pICgoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18yKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVBUlQgZnJhbWUgcGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVUFSVF9QQVJJVFlfT0REKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NPTlRST0xfXyBVQVJUIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChfX0NPTlRST0xfXylcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9DVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBVQVJUIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX01PREUoX19NT0RFX18pICgoKChfX01PREVfXykgJiAofigodWludDMyX3QpKFVBUlRfTU9ERV9UWF9SWCkpKSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RBVEVfXyBVQVJUIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFVBUlRfU1RBVEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgb3ZlcnNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NBTVBMSU5HX18gVUFSVCBvdmVyc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09WRVJTQU1QTElORyhfX1NBTVBMSU5HX18pICgoKF9fU0FNUExJTkdfXykgPT0gVUFSVF9PVkVSU0FNUExJTkdfMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMSU5HX18pID09IFVBUlRfT1ZFUlNBTVBMSU5HXzgpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBzYW1wbGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PTkVCSVRfXyBVQVJUIGZyYW1lIHNhbXBsaW5nLgorICAqIEByZXR2YWwgU0VUIChfX09ORUJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PTkVCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09ORV9CSVRfU0FNUExFKF9fT05FQklUX18pICgoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIFVBUlQgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTlNUQVJUQklUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05GQUxMSU5HRURHRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg3RkZSQU1FKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USU1FT1VUX18gVUFSVCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9SRUNFSVZFUl9USU1FT1VUKF9fVElNRU9VVF9fKSAoKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MSU5fXyBVQVJUIExJTiBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19MSU5fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTElOX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9MSU4oX19MSU5fXykgICAgICAgICgoKF9fTElOX18pID09IFVBUlRfTElOX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTElOX18pID09IFVBUlRfTElOX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPT0gVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBUWCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19ETUFUWF9fIFVBUlQgRE1BIFRYIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gVUFSVF9ETUFfVFhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgRE1BIFJYIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVJYX18gVUFSVCBETUEgUlggc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fRE1BUlhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BUlhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0RNQV9SWChfX0RNQVJYX18pICAgICAoKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFSWF9fKSA9PSBVQVJUX0RNQV9SWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYWxmLWR1cGxleCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19IRFNFTF9fIFVBUlQgaGFsZi1kdXBsZXggc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fSERTRUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSERTRUxfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0hBTEZfRFVQTEVYKF9fSERTRUxfXykgICAgICgoKF9fSERTRUxfXykgPT0gVUFSVF9IQUxGX0RVUExFWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgbWV0aG9kIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1dBS0VVUF9fIFVBUlQgd2FrZS11cCBtZXRob2QgLgorICAqIEByZXR2YWwgU0VUIChfX1dBS0VVUF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFVVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1dBS0VVUE1FVEhPRChfX1dBS0VVUF9fKSAoKChfX1dBS0VVUF9fKSA9PSBVQVJUX1dBS0VVUE1FVEhPRF9JRExFTElORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VVUF9fKSA9PSBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSykpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHJlcXVlc3QgcGFyYW1ldGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUkFNX18gVUFSVCByZXF1ZXN0IHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVBUlRfQVVUT0JBVURfUkVRVUVTVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0lOSVRfXyBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9JTklUKF9fSU5JVF9fKSAgICgoX19JTklUX18pIDw9IChVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfSU5JVCAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBUWCBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19UWElOVl9fIFVBUlQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVFhJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVFhJTlZfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAoKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1JYSU5WX18gVUFSVCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19SWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19SWElOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9SWElOVihfX1JYSU5WX18pICgoKF9fUlhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgZGF0YSBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19EQVRBSU5WX18gVUFSVCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKF9fREFUQUlOVl9fKSAoKChfX0RBVEFJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NXQVBfXyBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1NXQVBfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1dBUF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAoKChfX1NXQVBfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NXQVBfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TV0FQX18pID09IFVBUlRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG92ZXJydW4gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PVkVSUlVOX18gVUFSVCBmcmFtZSBvdmVycnVuIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fT1ZFUlJVTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PVkVSUlVOX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9PVkVSUlVOKF9fT1ZFUlJVTl9fKSAgICAgKCgoX19PVkVSUlVOX18pID09IFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGF1dG8gQmF1ZCByYXRlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0FVVE9CQVVEUkFURV9fIFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FVVE9CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEUoX19BVVRPQkFVRFJBVEVfXykgICgoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FVVE9CQVVEUkFURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19ETUFfXyBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAgKCgoX19ETUFfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RNQV9FTkFCTEVPTlJYRVJST1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTVNCRklSU1RfXyBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUKF9fTVNCRklSU1RfXykgKCgoX19NU0JGSVJTVF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBzdG9wIG1vZGUgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUE1PREVfXyBVQVJUIHN0b3AgbW9kZSBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TVE9QTU9ERShfX1NUT1BNT0RFX18pICgoKF9fU1RPUE1PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgbXV0ZSBtb2RlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01VVEVfXyBVQVJUIG11dGUgbW9kZSBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NVVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01VVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX01VVEVfTU9ERShfX01VVEVfXykgICAgICAgKCgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VVEVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgc2VsZWN0aW9uIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1dBS0VfXyBVQVJUIHdha2UtdXAgc2VsZWN0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX1dBS0VfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fV0FLRV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQX1NFTEVDVElPTihfX1dBS0VfXykgKCgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX1NUQVJUQklUKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX1JFQUREQVRBX05PTkVNUFRZKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZHJpdmVyIGVuYWJsZSBwb2xhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QT0xBUklUWV9fIFVBUlQgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QT0xBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QT0xBUklUWV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfREVfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAoKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBVQVJUX0RFX1BPTEFSSVRZX0xPVykpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFByZXNjYWxlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgUHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgU0VUIChfX0NMT0NLUFJFU0NBTEVSX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NMT0NLUFJFU0NBTEVSX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9QUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYzMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYyNTYpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfdWFydF9leC5oIgorCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCBBZGRyZXNzLCB1aW50MzJfdCBXYWtlVXBNZXRob2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BEZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFVBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3VpbnQzMl90ICAgICAgICAgICAgICBIQUxfVUFSVF9HZXRFcnJvcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRfUHJpdmF0ZV9GdW5jdGlvbnMgVUFSVCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9VQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3VhcnRfZXguaCBiL0luYy9zdG0zMmcweHhfaGFsX3VhcnRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM4YTgwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfdWFydF9leC5oCkBAIC0wLDAgKzEsNTQ0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF91YXJ0X2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1VBUlRfRVhfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1VBUlRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9UeXBlcyBVQVJURXggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBXYWtlVXBFdmVudDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGV2ZW50IHdpbGwgYWN0aXZhdGUgdGhlIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnIChXVUYpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIFVBUlRfV0FLRVVQX09OX0FERFJFU1MsIHRoZSB0d28gb3RoZXIgZmllbGRzIGJlbG93IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB1cC4gKi8KKworICB1aW50MTZfdCBBZGRyZXNzTGVuZ3RoOyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgNCBvciA3LWJpdCBsb25nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoLiAgKi8KKworICB1aW50OF90IEFkZHJlc3M7ICAgICAgICAgICAgIC8qITwgVUFSVC9VU0FSVCBub2RlIGFkZHJlc3MgKDctYml0IGxvbmcgbWF4KS4gKi8KK30gVUFSVF9XYWtlVXBUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlRFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9Xb3JkX0xlbmd0aCBVQVJURXggV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAvKiE8IDktYml0IGxvbmcgVUFSVCBmcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoIFVBUlRFeCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgNC1iaXQgbG9uZyB3YWtlLXVwIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgICAgICAgVVNBUlRfQ1IyX0FERE03ICAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9GSUZPX21vZGUgVUFSVEV4IEZJRk8gbW9kZQorICAqIEBicmllZiAgICBVQVJUIEZJRk8gbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfRklGT01PREVfRElTQUJMRSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBGSUZPIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4gIC8qITwgRklGTyBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAgKiBAYnJpZWYgICAgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfMV80ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIgICBVU0FSVF9DUjNfVFhGVENGR18xICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCAgIChVU0FSVF9DUjNfVFhGVENGR18wfFVTQVJUX0NSM19UWEZUQ0ZHXzEpIC8qITwgVFhGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfN184ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzggICAoVVNBUlRfQ1IzX1RYRlRDRkdfMnxVU0FSVF9DUjNfVFhGVENGR18wKSAvKiE8IFRYRklGTyBiZWNvbWVzIGVtcHR5ICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1JYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAgKiBAYnJpZWYgICAgVUFSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQgICBVU0FSVF9DUjNfUlhGVENGR18wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yICAgVVNBUlRfQ1IzX1JYRlRDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNCAgIChVU0FSVF9DUjNfUlhGVENGR18wfFVTQVJUX0NSM19SWEZUQ0ZHXzEpIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAzLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzggICBVU0FSVF9DUjNfUlhGVENGR18yICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfOF84ICAgKFVTQVJUX0NSM19SWEZUQ0ZHXzJ8VVNBUlRfQ1IzX1JYRlRDRkdfMCkgLyohPCBSWEZJRk8gRklGTyBiZWNvbWVzIGZ1bGwgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKwordm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCit2b2lkIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgVGhyZXNob2xkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfTWFjcm9zIFVBUlRFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KQorLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVQVJUIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCBVQVJUIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCisgICovCisjZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUNCkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwNzB4eCkKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgVUFSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDQpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbGlmIGRlZmluZWQoU1RNMzJHMDQxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDMxeHgpCisvKiogQGJyaWVmICBSZXBvcnQgdGhlIFVBUlQgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAgKiBAcmV0dmFsIFVBUlQgY2xvY2tpbmcgc291cmNlLCB3cml0dGVuIGluIF9fQ0xPQ0tTT1VSQ0VfXy4KKyAgKi8KKyNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9IU0k7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs7ICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9MU0U7ICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwMzB4eCkKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgVUFSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisjZW5kaWYgLyogU1RNMzJHMDgxeHggfHwgU1RNMzJHMDcxeHggKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVQVJUIG1hc2sgdG8gYXBwbHkgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICAqIEBub3RlICAgSWYgUENFID0gMSwgdGhlIHBhcml0eSBiaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBkYXRhIGV4dHJhY3RlZAorICAqICAgICAgICAgYnkgdGhlIHJlY2VwdGlvbiBBUEkoKS4KKyAgKiAgICAgICAgIFRoaXMgbWFza2luZyBvcGVyYXRpb24gaXMgbm90IGNhcnJpZWQgb3V0IGluIHRoZSBjYXNlIG9mCisgICogICAgICAgICBETUEgdHJhbnNmZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZSwgdGhlIG1hc2sgdG8gYXBwbHkgdG8gVUFSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNkZWZpbmUgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF84QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzdCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBVQVJUIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9XT1JEX0xFTkdUSChfX0xFTkdUSF9fKSAoKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCB3YWtlLXVwIGFkZHJlc3MgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0FERFJFU1NfXyBVQVJUIHdha2UtdXAgYWRkcmVzcyBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fQUREUkVTU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19BRERSRVNTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChfX0FERFJFU1NfXykgKCgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfNEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfN0IpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFVBUlQgVFhGSUZPIHRocmVzaG9sZCBsZXZlbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9UWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICgoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8zXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzgpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFVBUlQgUlhGSUZPIHRocmVzaG9sZCBsZXZlbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9SWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICgoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVBUlRfUlhGSUZPX1RIUkVTSE9MRF84XzgpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9VQVJUX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3VzYXJ0LmggYi9JbmMvc3RtMzJnMHh4X2hhbF91c2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzAxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2hhbF91c2FydC5oCkBAIC0wLDAgKzEsOTk4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF91c2FydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0FSVCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9IQUxfVVNBUlRfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1VTQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX1R5cGVzIFVTQVJUIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFVTQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgVXNhcnQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzE1OjRdID0gKCgyICogZmNsa19wcmVzKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMTU6NF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbM10gICAgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzI6MF0gID0gICgoKDIgKiBmY2xrX3ByZXMpIC8gKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKVszOjBdKSA+PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgZmNsa19wcmVzIGlzIHRoZSBVU0FSVCBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGZjbGspIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgIE92ZXJzYW1wbGluZyBieSA4IGlzIHN5c3RlbWF0aWNhbGx5IGFwcGxpZWQgdG8gYWNoaWV2ZSBoaWdoIGJhdWQgcmF0ZXMuICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJURXhfV29yZF9MZW5ndGguICovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9TdG9wX0JpdHMuICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9Nb2RlLiAqLworCisgIHVpbnQzMl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0Nsb2NrX1BvbGFyaXR5LiAqLworCisgIHVpbnQzMl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2tfUGhhc2UuICovCisKKyAgdWludDMyX3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MYXN0X0JpdC4gKi8KKworICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9DbG9ja1ByZXNjYWxlci4gKi8KK30gVVNBUlRfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgVVNBUlQgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1VTQVJUX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IGFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFggICAgICAgICAgID0gMHgxMlUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCAgICAgICAgICAgPSAweDIyVSwgICAgLyohPCBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYICAgICAgICA9IDB4MzJVLCAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX1RJTUVPVVQgICAgICAgICAgID0gMHgwM1UsICAgIC8qITwgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgY2xvY2sgc291cmNlcyBkZWZpbml0aW9ucworICAqLwordHlwZWRlZiBlbnVtCit7CisgIFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxICAgICAgPSAweDAwVSwgICAgLyohPCBQQ0xLMSBjbG9jayBzb3VyY2UgICAgICovCisgIFVTQVJUX0NMT0NLU09VUkNFX0hTSSAgICAgICAgPSAweDAyVSwgICAgLyohPCBIU0kgY2xvY2sgc291cmNlICAgICAgICovCisgIFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSyAgICAgPSAweDA0VSwgICAgLyohPCBTWVNDTEsgY2xvY2sgc291cmNlICAgICovCisgIFVTQVJUX0NMT0NLU09VUkNFX0xTRSAgICAgICAgPSAweDA4VSwgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovCisgIFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRCAgPSAweDEwVSAgICAgLyohPCBVbmRlZmluZWQgY2xvY2sgc291cmNlICovCit9IFVTQVJUX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVU0FSVCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZgoreworICBVU0FSVF9UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyohPCBVU0FSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVTQVJUX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBVU0FSVCBUeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgICAgICAgICAvKiE8IFVTQVJUIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBVU0FSVCBSeCB0cmFuc2ZlciBCdWZmZXIgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAgICAgICAgLyohPCBVU0FSVCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgTWFzazsgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgUnggUkRSIHJlZ2lzdGVyIG1hc2sgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICBOYlJ4RGF0YVRvUHJvY2VzczsgICAgICAgLyohPCBOdW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWCBJU1IgZXhlY3V0aW9uICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgTmJUeERhdGFUb1Byb2Nlc3M7ICAgICAgIC8qITwgTnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgVFggSVNSIGV4ZWN1dGlvbiAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIFNsYXZlTW9kZTsgICAgICAgICAgICAgICAvKiE8IEVuYWJsZS9EaXNhYmxlIFVBUlQgU1BJIFNsYXZlIE1vZGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIEByZWYgVVNBUlRFeF9TbGF2ZV9Nb2RlICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgRmlmb01vZGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBGSUZPIG1vZGUgd2lsbCBiZSB1c2VkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIFVTQVJURXhfRklGT19tb2RlLiAqLworCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgICovCisKKyAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAqaGRtYXR4OyAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgICAvKiE8IFVTQVJUIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAvKiE8IFVTQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgIC8qITwgVVNBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICovCisgIHZvaWQgKCogVHhSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAgLyohPCBVU0FSVCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAgIC8qITwgVVNBUlQgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydENwbHRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAvKiE8IFVTQVJUIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICovCisgIHZvaWQgKCogUnhGaWZvRnVsbENhbGxiYWNrKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgICAgICAgLyohPCBVU0FSVCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgICAgICAgICAgICAqLworICB2b2lkICgqIFR4Rmlmb0VtcHR5Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgIC8qITwgVVNBUlQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAgICAgICAgICAgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAgIC8qITwgVVNBUlQgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgICAvKiE8IFVTQVJUIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKK30gVVNBUlRfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgVVNBUlQgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFVTQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VU0FSVF9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFVTQVJUIFR4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFVTQVJUIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFVTQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFVTQVJUIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9VU0FSVF9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFVTQVJUIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFVTQVJUIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9VU0FSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IFVTQVJUIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRCAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9UWF9GSUZPX0VNUFRZX0NCX0lEICAgICAgICAgICA9IDB4MDhVLCAgICAvKiE8IFVTQVJUIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisKKyAgSEFMX1VTQVJUX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOVUsICAgIC8qITwgVVNBUlQgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwQVUgICAgIC8qITwgVVNBUlQgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfVVNBUlRfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFVTQVJUIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBVU0FSVF9DYWxsYmFja1R5cGVEZWYpKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAvKiE8IHBvaW50ZXIgdG8gYW4gVVNBUlQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0NvbnN0YW50cyBVU0FSVCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Vycm9yX0RlZmluaXRpb24gICBVU0FSVCBFcnJvciBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX05PTkUgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9QRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgIC8qITwgUGFyaXR5IGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfTkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX0ZFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgICAgLyohPCBGcmFtZSBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9PUkUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfRE1BICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX1VEUiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgICAgLyohPCBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3IgICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICgodWludDMyX3QpMHgwMDAwMDA0MFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1N0b3BfQml0cyAgVVNBUlQgTnVtYmVyIG9mIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDAuNSBzdG9wIGJpdCAgKi8KKyNkZWZpbmUgVVNBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIHdpdGggMSBzdG9wIGJpdCAgICAqLworI2RlZmluZSBVU0FSVF9TVE9QQklUU18xXzUgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEpIC8qITwgVVNBUlQgZnJhbWUgd2l0aCAxLjUgc3RvcCBiaXRzICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDIgc3RvcCBiaXRzICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUGFyaXR5ICAgIFVTQVJUIFBhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcGFyaXR5ICAgKi8KKyNkZWZpbmUgVVNBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBVU0FSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX01vZGUgICBVU0FSVCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfTU9ERV9SWCAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFVTQVJUX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1RYX1JYICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpICAgIC8qITwgUlggYW5kIFRYIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfT3Zlcl9TYW1wbGluZyBVU0FSVCBPdmVyIFNhbXBsaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfT1ZFUlNBTVBMSU5HXzE2ICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBVU0FSVF9PVkVSU0FNUExJTkdfOCAgICAgICAgICAgICAgICBVU0FSVF9DUjFfT1ZFUjggICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Nsb2NrICBVU0FSVCBDbG9jaworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0NMT0NLX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgVVNBUlQgY2xvY2sgZGlzYWJsZSAqLworI2RlZmluZSBVU0FSVF9DTE9DS19FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gICAvKiE8IFVTQVJUIGNsb2NrIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2tfUG9sYXJpdHkgIFVTQVJUIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IERyaXZlciBlbmFibGUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFVTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MICAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgbG93ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9DbG9ja19QaGFzZSAgIFVTQVJUIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IFVTQVJUIGZyYW1lIHBoYXNlIG9uIGZpcnN0IGNsb2NrIHRyYW5zaXRpb24gICovCisjZGVmaW5lIFVTQVJUX1BIQVNFXzJFREdFICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUEhBICAgLyohPCBVU0FSVCBmcmFtZSBwaGFzZSBvbiBzZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MYXN0X0JpdCAgVVNBUlQgTGFzdCBCaXQKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9MQVNUQklUX0RJU0FCTEUgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgVVNBUlQgZnJhbWUgbGFzdCBkYXRhIGJpdCBjbG9jayBwdWxzZSBub3Qgb3V0cHV0IHRvIFNDTEsgcGluICovCisjZGVmaW5lIFVTQVJUX0xBU1RCSVRfRU5BQkxFICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9MQkNMICAgLyohPCBVU0FSVCBmcmFtZSBsYXN0IGRhdGEgYml0IGNsb2NrIHB1bHNlIG91dHB1dCB0byBTQ0xLIHBpbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2tQcmVzY2FsZXIgIFVTQVJUIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYxICAgIDB4MDAwMDAwMDBVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsgICAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYyICAgIDB4MDAwMDAwMDFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMiAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVY0ICAgIDB4MDAwMDAwMDJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNCAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVY2ICAgIDB4MDAwMDAwMDNVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNiAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVY4ICAgIDB4MDAwMDAwMDRVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvOCAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYxMCAgIDB4MDAwMDAwMDVVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTAgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYxMiAgIDB4MDAwMDAwMDZVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTIgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYxNiAgIDB4MDAwMDAwMDdVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTYgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYzMiAgIDB4MDAwMDAwMDhVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMzIgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVY2NCAgIDB4MDAwMDAwMDlVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNjQgICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYxMjggIDB4MDAwMDAwMEFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTI4ICovCisjZGVmaW5lIFVTQVJUX1BSRVNDQUxFUl9ESVYyNTYgIDB4MDAwMDAwMEJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMjU2ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUmVxdWVzdF9QYXJhbWV0ZXJzICBVU0FSVCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgVVNBUlRfUlFSX1JYRlJRICAgICAgICAvKiE8IFJlY2VpdmUgRGF0YSBmbHVzaCBSZXF1ZXN0ICAqLworI2RlZmluZSBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgVVNBUlRfUlFSX1RYRlJRICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9GbGFncyAgICAgIFVTQVJUIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RYRlQgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhGVCAgICAgICAgICAvKiE8IFVTQVJUIFRYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JYRlQgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGVCAgICAgICAgICAvKiE8IFVTQVJUIFJYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JYRkYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAvKiE8IFVTQVJUIFJYRklGTyBGdWxsIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RYRkUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhGRSAgICAgICAgICAvKiE8IFVTQVJUIFRYRklGTyBFbXB0eSBmbGFnICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JFQUNLICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAvKiE8IFVTQVJUIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RFQUNLICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQlVTWSAgICAgICAgICAvKiE8IFVTQVJUIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1VEUiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVURSICAgICAgICAgICAvKiE8IFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvciBmbGFnICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhFX1RYRk5GICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RYRk5GICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhFX1RYRk5GICAgICAvKiE8IFVTQVJUIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhORV9SWEZORSAgICAvKiE8IFVTQVJUIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JYRk5FICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhORV9SWEZORSAgICAvKiE8IFVTQVJUIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX0lETEUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfSURMRSAgICAgICAgICAvKiE8IFVTQVJUIGlkbGUgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAvKiE8IFVTQVJUIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX05FICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAvKiE8IFVTQVJUIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX0ZFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRkUgICAgICAgICAgICAvKiE8IFVTQVJUIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAvKiE8IFVTQVJUIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiBVU0FSVCBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKDJiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBDUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IENSMyByZWdpc3RlcgorICAqICAgICAgICAgICAtIFpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDRiaXRzKQorICAqIEB7CisgICovCisKKyNkZWZpbmUgVVNBUlRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyOFUgICAgIC8qITwgVVNBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfVFhFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyN1UgICAgIC8qITwgVVNBUlQgdHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVVNBUlRfSVRfVFhGTkYgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyN1UgICAgIC8qITwgVVNBUlQgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNlUgICAgIC8qITwgVVNBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdGlvbiAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgIC8qITwgVVNBUlQgcmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgVVNBUlRfSVRfUlhGTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgIC8qITwgVVNBUlQgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfSURMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQyNFUgICAgIC8qITwgVVNBUlQgaWRsZSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgIC8qITwgVVNBUlQgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfT1JFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMFUgICAgIC8qITwgVVNBUlQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMFUgICAgIC8qITwgVVNBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfRkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgIC8qITwgVVNBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfUlhGRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgzRlUgICAgIC8qITwgVVNBUlQgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfVFhGRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTczRVUgICAgIC8qITwgVVNBUlQgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfUlhGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MUE3Q1UgICAgIC8qITwgVVNBUlQgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVRfVFhGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MUI3N1UgICAgIC8qITwgVVNBUlQgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9JVF9DTEVBUl9GbGFncyAgICBVU0FSVCBJbnRlcnJ1cHRpb24gQ2xlYXIgRmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgLyohPCBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9ORUNGICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9VRFJGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9VRFJDRiAgICAgICAgICAgLyohPCBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3IgQ2xlYXIgRmxhZyAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9UWEZFQ0YgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UWEZFQ0YgICAgICAgICAgLyohPCBUWEZJRk8gRW1wdHkgQ2xlYXIgRmxhZyAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9JbnRlcnJ1cHRpb25fTWFzayAgICBVU0FSVCBJbnRlcnJ1cHRpb24gRmxhZ3MgTWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0lUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRlUgICAgIC8qITwgVVNBUlQgaW50ZXJydXB0aW9ucyBmbGFncyBtYXNrICovCisjZGVmaW5lIFVTQVJUX0NSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBFMFUgICAgIC8qITwgVVNBUlQgY29udHJvbCByZWdpc3RlciBtYXNrICovCisjZGVmaW5lIFVTQVJUX0NSX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVVICAgICAgICAgIC8qITwgVVNBUlQgY29udHJvbCByZWdpc3RlciBwb3NpdGlvbiAqLworI2RlZmluZSBVU0FSVF9JU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDBVICAgICAvKiE8IFVTQVJUIElTUiByZWdpc3RlciBtYXNrICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfSVNSX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOFUgICAgICAgICAgLyohPCBVU0FSVCBJU1IgcmVnaXN0ZXIgcG9zaXRpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9NYWNyb3MgVVNBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBVU0FSVCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfVVNBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVVNBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SWEZUICBSWEZJRk8gdGhyZXNob2xkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1JYRkYgIFJYRklGTyBGdWxsIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1RYRkUgIFRYRklGTyBFbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SRUFDSyBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19VRFIgICBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UWEZORiBUWEZJRk8gbm90IGZ1bGwgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1JYTkUgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUlhGTkUgUlhGSUZPIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19JRExFICBJZGxlIExpbmUgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX09SRSAgIE92ZXJSdW4gRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfRkUgICAgRnJhbWluZyBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19QRSAgICBQYXJpdHkgRXJyb3IgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1BFRiAgICAgIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfRkVGICAgICAgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX09SRUYgICAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVFhGRUNGICAgVFhGSUZPIGVtcHR5IGNsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1VEUkYgICAgIFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvciBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgUEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX1BFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX0ZFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBORSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBPUkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9PUkVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9JRExFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9JRExFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIFRYIEZJRk8gZW1wdHkgY2xlYXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX1RYRkVDRihfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9UWEZFQ0YpCisKKy8qKiBAYnJpZWYgIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvciBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfVURSRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVU0FSVF9DTEVBUl9VRFJGKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGRiAgUlhGSUZPIEZ1bGwgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRk5GIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGTkUgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKCgoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfQ1JfTUFTSykgPj4gVVNBUlRfQ1JfUE9TKSA9PSAxVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfQ1JfTUFTSykgPj4gVVNBUlRfQ1JfUE9TKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9DUl9NQVNLKSA+PiBVU0FSVF9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0NSX01BU0spID4+IFVTQVJUX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGRiAgUlhGSUZPIEZ1bGwgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRk5GIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGTkUgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX09SRSAgIE92ZXJSdW4gRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfTkUgICAgTm9pc2UgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfRkUgICAgRnJhbWluZyBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoKHVpbnQzMl90KTB4MDFVIDw8ICgoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVNSX01BU0spPj4gVVNBUlRfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfT1JFICAgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9ORSAgICBOb2lzZSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9GRSAgICBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiAweDA1VSkgPT0gMHgwMVUpID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDB4MDVVKSA9PSAweDAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFVTQVJUX0lUX01BU0spKSkgICE9IDBVKSA/IFNFVCA6IFJFU0VUKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVVNBUlQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9QRUYgICAgICBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX05FRiAgICAgIE5vaXNlIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9PUkVGICAgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1RYRkVDRiAgIFRYRklGTyBlbXB0eSBjbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGICAgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVU0FSVCByZXF1ZXN0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAodWludDE2X3QpKF9fUkVRX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzfD0gVVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgVVNBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH5VU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBFbmFibGUgVVNBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVTQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH5VU0FSVF9DUjFfVUUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9NYWNyb3MgICBVU0FSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEdldCBVU0FSVCBjbG9jayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBjbG9jayBwcmVzY2FsZXIgdmFsdWUuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVVNBUlQgcHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgVVNBUlQgY2xvY2sgZGl2aXNpb24gZmFjdG9yCisgICovCisjZGVmaW5lIFVTQVJUX0dFVF9ESVZfRkFDVE9SKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgXAorICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYxKSAgID8gMVUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjIpICAgPyAyVSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWNCkgICA/IDRVIDogICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVY2KSAgID8gNlUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjgpICAgPyA4VSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTApICA/IDEwVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYxMikgID8gMTJVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjE2KSAgPyAxNlUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMzIpICA/IDMyVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVY2NCkgID8gNjRVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjEyOCkgPyAxMjhVIDogICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMjU2KSA/IDI1NlUgOiAxVSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDgtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gVVNBUlQgY2xvY2suCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEBwYXJhbSAgX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgcHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgICovCisjZGVmaW5lIFVTQVJUX0RJVl9TQU1QTElORzgoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAgKCgoKChfX1BDTEtfXykvVVNBUlRfR0VUX0RJVl9GQUNUT1IoX19DTE9DS1BSRVNDQUxFUl9fKSkqMlUpICsgKChfX0JBVURfXykvMlUpKSAvIChfX0JBVURfXykpCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVVNBUlQgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCB0aGUgVVNBUlQgY2xvY2tpbmcgc291cmNlLCB3cml0dGVuIGluIF9fQ0xPQ0tTT1VSQ0VfXy4KKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MHh4KQorI2RlZmluZSBVU0FSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDQpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkKKyNkZWZpbmUgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKKyNlbmRpZgorCisvKiogQGJyaWVmICBDaGVjayBVU0FSVCBCYXVkIHJhdGUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAqICAgICAgICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBHMCAoaS5lLiA2NCBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAgKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpICAqLworI2RlZmluZSBJU19VU0FSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8PSA4MDAwMDAwVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVU0FSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzBfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVVNBUlRfU1RPUEJJVFNfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVU0FSVF9TVE9QQklUU18xXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVTQVJUIGZyYW1lIHBhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IFVTQVJUX1BBUklUWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBVU0FSVF9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVVNBUlRfUEFSSVRZX09ERCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIFVTQVJUIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgMHhGRkZGRkZGM1UpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBvdmVyc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU0FNUExJTkdfXyBVU0FSVCBvdmVyc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9PVkVSU0FNUExJTkcoX19TQU1QTElOR19fKSAoKChfX1NBTVBMSU5HX18pID09IFVTQVJUX09WRVJTQU1QTElOR18xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMSU5HX18pID09IFVTQVJUX09WRVJTQU1QTElOR184KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGNsb2NrIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NMT0NLX18gVVNBUlQgY2xvY2sgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9DTE9DSyhfX0NMT0NLX18pICgoKF9fQ0xPQ0tfXykgPT0gVVNBUlRfQ0xPQ0tfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVVNBUlRfQ0xPQ0tfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIHBvbGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NQT0xfXyBVU0FSVCBmcmFtZSBwb2xhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DUE9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NQT0xfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9QT0xBUklUWShfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFVTQVJUX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gVVNBUlRfUE9MQVJJVFlfSElHSCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBwaGFzZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUEhBX18gVVNBUlQgZnJhbWUgcGhhc2UuCisgICogQHJldHZhbCBTRVQgKF9fQ1BIQV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUEhBX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUEhBU0UoX19DUEhBX18pICgoKF9fQ1BIQV9fKSA9PSBVU0FSVF9QSEFTRV8xRURHRSkgfHwgKChfX0NQSEFfXykgPT0gVVNBUlRfUEhBU0VfMkVER0UpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MQVNUQklUX18gVVNBUlQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19MQVNUQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xBU1RCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9MQVNUQklUKF9fTEFTVEJJVF9fKSAoKChfX0xBU1RCSVRfXykgPT0gVVNBUlRfTEFTVEJJVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFTVEJJVF9fKSA9PSBVU0FSVF9MQVNUQklUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCByZXF1ZXN0IHBhcmFtZXRlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIFVTQVJUIHJlcXVlc3QgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBQcmVzY2FsZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVU0FSVCBQcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9QUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVY2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjI1NikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgVVNBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfdXNhcnRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwRGVJbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFQYXVzZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVJlc3VtZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVN0b3AoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKwordm9pZCBIQUxfVVNBUlRfSVJRSGFuZGxlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit2b2lkIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgSEFMX1VTQVJUX0dldFN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit1aW50MzJfdCAgICAgICAgICAgICAgIEhBTF9VU0FSVF9HZXRFcnJvcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9VU0FSVF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2hhbF91c2FydF9leC5oIGIvSW5jL3N0bTMyZzB4eF9oYWxfdXNhcnRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWNiZTIzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfdXNhcnRfZXguaApAQCAtMCwwICsxLDI4NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfdXNhcnRfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVNBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1VTQVJUX0VYX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0hBTF9VU0FSVF9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0NvbnN0YW50cyBVU0FSVEV4IEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9Xb3JkX0xlbmd0aCBVU0FSVEV4IFdvcmQgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfV09SRExFTkdUSF83QiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX00xKSAgIC8qITwgNy1iaXQgbG9uZyBVU0FSVCBmcmFtZSAqLworI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzhCICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCA4LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCisjZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVVTQVJUX0NSMV9NMCkgICAvKiE8IDktYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCBVU0FSVEV4IFNsYXZlIFNlbGVjdCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfTlNTX0hBUkQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFNQSSBzbGF2ZSBzZWxlY3Rpb24gZGVwZW5kcyBvbiBOU1MgaW5wdXQgcGluICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9OU1NfU09GVCAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9ESVNfTlNTICAgIC8qITwgU1BJIHNsYXZlIGlzIGFsd2F5cyBzZWxlY3RlZCBhbmQgTlNTIGlucHV0IHBpbiBpcyBpZ25vcmVkICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9TbGF2ZV9Nb2RlIFVTQVJURXggU3luY2hyb25vdXMgU2xhdmUgbW9kZSBlbmFibGUKKyAgKiBAYnJpZWYgICAgVVNBUlQgU0xBVkUgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgIC8qITwgVVNBUlQgU1BJIFNsYXZlIE1vZGUgRW5hYmxlICAqLworI2RlZmluZSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFICAgIFVTQVJUX0NSMl9TTFZFTiAvKiE8IFVTQVJUIFNQSSBTbGF2ZSBNb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9GSUZPX21vZGUgVVNBUlRFeCBGSUZPICBtb2RlCisgICogQGJyaWVmICAgIFVTQVJUIEZJRk8gIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9GSUZPTU9ERV9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4gICAgICAgICAgICAgIC8qITwgRklGTyBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9UWEZJRk9fdGhyZXNob2xkX2xldmVsIFVTQVJURXggVFhGSUZPIHRocmVzaG9sZCBsZXZlbAorICAqIEBicmllZiAgICBVU0FSVCBUWEZJRk8gbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfNCAgIFVTQVJUX0NSM19UWEZUQ0ZHXzAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19UWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS8yIG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCAgIChVU0FSVF9DUjNfVFhGVENGR18wfFVTQVJUX0NSM19UWEZUQ0ZHXzEpIC8qITwgVFhGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOCAgIFVTQVJUX0NSM19UWEZUQ0ZHXzIgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfVFhGVENGR18yfFVTQVJUX0NSM19UWEZUQ0ZHXzApIC8qITwgVFhGSUZPIGJlY29tZXMgZW1wdHkgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X1JYRklGT190aHJlc2hvbGRfbGV2ZWwgVVNBUlRFeCBSWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQGJyaWVmICAgIFVTQVJUIFJYRklGTyBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1JYRklGT19USFJFU0hPTERfMV84ICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQgICBVU0FSVF9DUjNfUlhGVENGR18wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19SWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzIgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1JYRklGT19USFJFU0hPTERfM180ICAgKFVTQVJUX0NSM19SWEZUQ0ZHXzB8VVNBUlRfQ1IzX1JYRlRDRkdfMSkgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzggICBVU0FSVF9DUjNfUlhGVENGR18yICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfUlhGVENGR18yfFVTQVJUX0NSM19SWEZUQ0ZHXzApIC8qITwgUlhGSUZPIEZJRk8gYmVjb21lcyBmdWxsICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVEV4X1ByaXZhdGVfTWFjcm9zIFVTQVJURXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBDb21wdXRlIHRoZSBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIHJldHJpZXZlIHRoZSByZWNlaXZlZCBkYXRhCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHdvcmQgbGVuZ3RoIGFuZCB0byB0aGUgcGFyaXR5IGJpdHMgYWN0aXZhdGlvbi4KKyAgKiBAbm90ZSAgIElmIFBDRSA9IDEsIHRoZSBwYXJpdHkgYml0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGF0YSBleHRyYWN0ZWQKKyAgKiAgICAgICAgIGJ5IHRoZSByZWNlcHRpb24gQVBJKCkuCisgICogICAgICAgICBUaGlzIG1hc2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBjYXJyaWVkIG91dCBpbiB0aGUgY2FzZSBvZgorICAqICAgICAgICAgRE1BIHRyYW5zZmVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVU0FSVCBSRFIgcmVnaXN0ZXIgaXMgc3RvcmVkIGluIChfX0hBTkRMRV9fKS0+TWFzayBmaWVsZC4KKyAgKi8KKyNkZWZpbmUgVVNBUlRfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOEIpICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF83QikgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMFUpCisKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBVU0FSVCBmcmFtZSBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID09IFVTQVJUX1dPUkRMRU5HVEhfN0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVVNBUlRfV09SRExFTkdUSF84QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIE5lZ2F0aXZlIFNsYXZlIFNlbGVjdCAoTlNTKSBwaW4gbWFuYWdlbWVudCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19OU1NfXyBVU0FSVCBOZWdhdGl2ZSBTbGF2ZSBTZWxlY3QgcGluIG1hbmFnZW1lbnQuCisgICogQHJldHZhbCBTRVQgKF9fTlNTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX05TU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX05TUyhfX05TU19fKSAoKChfX05TU19fKSA9PSBVU0FSVF9OU1NfSEFSRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NfXykgPT0gVVNBUlRfTlNTX1NPRlQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgU2xhdmUgTW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVEFURV9fIFVTQVJUIFNsYXZlIE1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fU1RBVEVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RBVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9TTEFWRU1PREUoX19TVEFURV9fKSAgICgoKF9fU1RBVEVfXykgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIEZJRk8gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVEFURV9fIFVTQVJUIEZJRk8gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVEFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVEFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX0ZJRk9fTU9ERV9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gVVNBUlRfRklGT01PREVfRElTQUJMRSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBVU0FSVF9GSUZPTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgVFhGSUZPIHRocmVzaG9sZCBsZXZlbCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USFJFU0hPTERfXyBVU0FSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsLgorICAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9UWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICAoKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1RYRklGT19USFJFU0hPTERfMV8yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1RYRklGT19USFJFU0hPTERfOF84KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVEhSRVNIT0xEX18gVVNBUlQgUlhGSUZPIHRocmVzaG9sZCBsZXZlbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19USFJFU0hPTERfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVEhSRVNIT0xEX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUlhGSUZPX1RIUkVTSE9MRChfX1RIUkVTSE9MRF9fKSAgKCgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1JYRklGT19USFJFU0hPTERfMV80KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1JYRklGT19USFJFU0hPTERfN184KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzhfOCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfRW5hYmxlU2xhdmVNb2RlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9EaXNhYmxlU2xhdmVNb2RlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9Db25maWdOU1MoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBOU1NDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfRW5hYmxlRmlmb01vZGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0Rpc2FibGVGaWZvTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgVGhyZXNob2xkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X1NldFJ4Rmlmb1RocmVzaG9sZChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IFRocmVzaG9sZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfSEFMX1VTQVJUX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfaGFsX3d3ZGcuaCBiL0luYy9zdG0zMmcweHhfaGFsX3d3ZGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdmZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9oYWxfd3dkZy5oCkBAIC0wLDAgKzEsMzA3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF93d2RnLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFdXREcgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfSEFMX1dXREdfSAorI2RlZmluZSBTVE0zMkcweHhfSEFMX1dXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX1R5cGVzIFdXREcgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdXREcgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSBvZiB0aGUgV1dERy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFdXREdfUHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgV2luZG93OyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFdXREcgd2luZG93IHZhbHVlIHRvIGJlIGNvbXBhcmVkIHRvIHRoZSBkb3duY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIE1pbl9EYXRhID0gMHg0MCBhbmQgTWF4X0RhdGEgPSAweDdGICovCisKKyAgdWludDMyX3QgQ291bnRlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFdXREcgZnJlZS1ydW5uaW5nIGRvd25jb3VudGVyICB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDQwIGFuZCBNYXhfRGF0YSA9IDB4N0YgKi8KKworICB1aW50MzJfdCBFV0lNb2RlIDsgICAgICAvKiE8IFNwZWNpZmllcyBpZiBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnVwdCBpcyBlbmFibGUgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgV1dER19FV0lfTW9kZSAqLworCit9IFdXREdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgV1dERyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19XV0RHX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIFdXREdfVHlwZURlZiAgICAgICpJbnN0YW5jZTsgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCisKKyAgV1dER19Jbml0VHlwZURlZiAgSW5pdDsgICAgICAgLyohPCBXV0RHIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgICAgICAgICAgICAgICgqIEV3aUNhbGxiYWNrKShzdHJ1Y3QgX19XV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsgICAgIC8qITwgV1dERyBFYXJseSBXYWtlVXAgSW50ZXJydXB0IGNhbGxiYWNrICovCisKKyAgdm9pZCAgICAgICAgICAgICAgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19XV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsgLyohPCBXV0RHIE1zcCBJbml0IGNhbGxiYWNrICovCisjZW5kaWYKK30gV1dER19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFdXREcgY29tbW9uIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfV1dER19FV0lfQ0JfSUQgICAgICAgICAgPSAweDAwdSwgICAgLyohPCBXV0RHIEVXSSBjYWxsYmFjayBJRCAqLworICBIQUxfV1dER19NU1BJTklUX0NCX0lEICAgICAgPSAweDAxdSwgICAgLyohPCBXV0RHIE1zcEluaXQgY2FsbGJhY2sgSUQgKi8KK31IQUxfV1dER19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgV1dERyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgdm9pZCAoKnBXV0RHX0NhbGxiYWNrVHlwZURlZikoV1dER19IYW5kbGVUeXBlRGVmICogaHBwcCk7IC8qITwgcG9pbnRlciB0byBhIFdXREcgY29tbW9uIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9Db25zdGFudHMgV1dERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfSW50ZXJydXB0X2RlZmluaXRpb24gV1dERyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfSVRfRVdJICAgICAgICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX0VXSSAgLyohPCBFYXJseSB3YWtldXAgaW50ZXJydXB0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRmxhZ19kZWZpbml0aW9uIFdXREcgRmxhZyBkZWZpbml0aW9uCisgICogQGJyaWVmIFdXREcgRmxhZyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19GTEFHX0VXSUYgICAgICAgICAgICAgICAgICAgICAgV1dER19TUl9FV0lGICAvKiE8IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX1ByZXNjYWxlciBXV0RHIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMSAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl8yICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8wICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzIgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfNCAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS80ICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgICAgIChXV0RHX0NGUl9XREdUQl8xIHwgV1dER19DRlJfV0RHVEJfMCkgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvOCAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl8xNiAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8yICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzE2ICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgICAgIChXV0RHX0NGUl9XREdUQl8yIHwgV1dER19DRlJfV0RHVEJfMCkgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMzIgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfNjQgICAgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzIgfCBXV0RHX0NGUl9XREdUQl8xKSAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS82NCAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl8xMjggICAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0VXSV9Nb2RlIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19FV0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgLyohPCBFV0kgRGlzYWJsZSAqLworI2RlZmluZSBXV0RHX0VXSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kgICAgICAvKiE8IEVXSSBFbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19Qcml2YXRlX01hY3JvcyBXV0RHIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfV1dER19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgKCgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gV1dER19QUkVTQ0FMRVJfMTI4KSkKKworI2RlZmluZSBJU19XV0RHX1dJTkRPVyhfX1dJTkRPV19fKSAgICAgICAgICAoKChfX1dJTkRPV19fKSA+PSBXV0RHX0NGUl9XXzYpICYmICgoX19XSU5ET1dfXykgPD0gV1dER19DRlJfVykpCisKKyNkZWZpbmUgSVNfV1dER19DT1VOVEVSKF9fQ09VTlRFUl9fKSAgICAgICAgKCgoX19DT1VOVEVSX18pID49IFdXREdfQ1JfVF82KSAmJiAoKF9fQ09VTlRFUl9fKSA8PSBXV0RHX0NSX1QpKQorCisjZGVmaW5lIElTX1dXREdfRVdJX01PREUoX19NT0RFX18pICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBXV0RHX0VXSV9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFdXREdfRVdJX0RJU0FCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX01hY3JvcyBXV0RHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBXV0RHIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBXV0RHX0NSX1dER0EpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBXV0RHIGVhcmx5IHdha2V1cCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgdG8gZW5hYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19JVF9FV0k6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE9uY2UgZW5hYmxlZCB0aGlzIGludGVycnVwdCBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGUiwgKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIFdXREcgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBpdCB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgSVQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgV1dER19GTEFHIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgX19IQUxfV1dER19HRVRfRkxBRygoX19IQU5ETEVfXyksKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgV1dERyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqICAgICAgICAgYml0cyB0byBjbGVhciB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgIF9fSEFMX1dXREdfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgV1dERyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgV1dER19GTEFHIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIFdXREcncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fICBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0ZMQUdfRVdJRjogRWFybHkgd2FrZXVwIGludGVycnVwdCBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgPSB+KF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFdXREcgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBXV0RHIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0lUX0VXSTogRWFybHkgV2FrZXVwIEludGVycnVwdAorICAqIEByZXR2YWwgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX01zcEluaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7CisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwV1dER19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1dXREdfUmVmcmVzaChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfV1dER19JUlFIYW5kbGVyKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0hBTF9XV0RHX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfYWRjLmggYi9JbmMvc3RtMzJnMHh4X2xsX2FkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX2FkYy5oCkBAIC0wLDAgKzEsNTA1MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9hZGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfQURDX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX0FEQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQURDMSkKKworLyoqIEBkZWZncm91cCBBRENfTEwgQURDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfUkVHX1JBTktfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJhbmsgYml0cyBwb3NpdGlvbiBpbnRvIHRoZSBzZWxlY3RlZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSyAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgYml0cyBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCAgKi8KKy8qIGludG8gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xX1NRUlhfQklUT0ZGU0VUX1BPUyAgKCAwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfU1ExIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfMl9TUVJYX0JJVE9GRlNFVF9QT1MgICggNFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX1NRMiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzNfU1FSWF9CSVRPRkZTRVRfUE9TICAoIDhVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9TUTMiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS180X1NRUlhfQklUT0ZGU0VUX1BPUyAgKDEyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfU1E0IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfNV9TUVJYX0JJVE9GRlNFVF9QT1MgICgxNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX1NRNSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzZfU1FSWF9CSVRPRkZTRVRfUE9TICAoMjBVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9TUTYiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS183X1NRUlhfQklUT0ZGU0VUX1BPUyAgKDI0VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfU1E3IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfOF9TUVJYX0JJVE9GRlNFVF9QT1MgICgyOFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX1NROCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKworCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19SRUdfVFJJR194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSByZWd1bGFyIHRyaWdnZXIgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gcmVndWxhciB0cmlnZ2VyIGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUICAgICAgIChBRENfQ0ZHUjFfRVhURU5fMCkgLyogVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkgKi8KKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgc291cmNlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfU09VUkNFX01BU0sgICAgICAgICAgICAoKChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUjFfRVhUU0VMKSA8PCAoNFUgKiAwVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1IxX0VYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKDRVICogMVVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19DRkdSMV9FWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDJVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfQ0ZHUjFfRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAzVUwpKSAgKQorCisvKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBlZGdlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgICAqLworLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8KKy8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FREdFX01BU0sgICAgICAgICAgICAgICgoKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSMV9FWFRFTikgPDwgKDRVICogMFVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgPDwgKDRVICogMVVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgPDwgKDRVICogMlVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgPDwgKDRVICogM1VMKSkgICkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIGJpdHMgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVFNFTF9CSVRPRkZTRVRfUE9TICAoIDZVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NGR1IxX0VYVFNFTCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgICAoMTBVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NGR1IxX0VYVEVOIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGNoYW5uZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgaWRlbnRpZmllciBkZWZpbmVkIGJ5IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGlkZW50aWZpZXIgZGVmaW5lZCBieSBiaXRmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBjaGFubmVscyAoY29ubmVjdGVkIHRvICAgICAgICAgICovCisvKiAgIEdQSU8gcGlucykgYW5kIGludGVybmFsIGNoYW5uZWxzIChjb25uZWN0ZWQgdG8gaW50ZXJuYWwgcGF0aHMpICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyAgICAgICAgIChBRENfQ0ZHUjFfQVdEMUNIKQorI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLICAgICAgIChBRENfQ0hTRUxSX0NIU0VMKQorI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19TRVEgICAgIChBRENfQ0hTRUxSX1NRMSA8PCBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgLyogVmFsdWUgZXF1aXZhbGVudCB0byBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyB3aXRoIHJlZHVjZWQgcmFuZ2U6IG9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciwgaWYgc2V0IHRvIG1vZGUgImZ1bGx5IGNvbmZpZ3VyYWJsZSIsIGNhbiBjb250YWluIGNoYW5uZWxzIHdpdGggYSByZXN0cmljdGVkIGNoYW5uZWwgbnVtYmVyLiBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TICgyNlVMKS8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9NQVNLICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyB8IEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0sgfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorLyogRXF1aXZhbGVudCBtYXNrIG9mIEFEQ19DSEFOTkVMX05VTUJFUl9NQVNLIGFsaWduZWQgb24gcmVnaXN0ZXIgTFNCIChiaXQgMCkgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCAoMHgwMDAwMDAxRlVMKSAvKiBFcXVpdmFsZW50IHRvIHNoaWZ0OiAoQURDX0NIQU5ORUxfTlVNQkVSX01BU0sgPj4gW1Bvc2l0aW9uIG9mIGJpdGZpZWxkICJBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyIgaW4gcmVnaXN0ZXJdKSAqLworCisvKiBDaGFubmVsIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBjaGFubmVscyAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSCAgICAgICAgICgweDgwMDAwMDAwVUwpIC8qIE1hcmtlciBvZiBpbnRlcm5hbCBjaGFubmVsICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0sgICAgKEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKQorCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIG51bWJlciBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCBpbnRvICAgICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9OVU1CRVIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xX05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfM19OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRDFDSF8xIHwgQURDX0NGR1IxX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0QxQ0hfMiAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRDFDSF8yIHwgQURDX0NGR1IxX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF83X05VTUJFUiAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEMUNIXzIgfCBBRENfQ0ZHUjFfQVdEMUNIXzEgfCBBRENfQ0ZHUjFfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0QxQ0hfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9OVU1CRVIgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRDFDSF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEMUNIXzMgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUNIXzEgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0QxQ0hfMyAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxQ0hfMSB8IEFEQ19DRkdSMV9BV0QxQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTJfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRDFDSF8zIHwgQURDX0NGR1IxX0FXRDFDSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xM19OVU1CRVIgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVdEMUNIXzMgfCBBRENfQ0ZHUjFfQVdEMUNIXzIgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BV0QxQ0hfMyB8IEFEQ19DRkdSMV9BV0QxQ0hfMiB8IEFEQ19DRkdSMV9BV0QxQ0hfMSAgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTVfTlVNQkVSICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FXRDFDSF8zIHwgQURDX0NGR1IxX0FXRDFDSF8yIHwgQURDX0NGR1IxX0FXRDFDSF8xIHwgQURDX0NGR1IxX0FXRDFDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9OVU1CRVIgICAgICAgICAgICAgIChBRENfQ0ZHUjFfQVdEMUNIXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3X05VTUJFUiAgICAgICAgICAgICAgKEFEQ19DRkdSMV9BV0QxQ0hfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxQ0hfMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMThfTlVNQkVSICAgICAgICAgICAgICAoQURDX0NGR1IxX0FXRDFDSF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICAgKQorCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIElEIGJpdGZpZWxkIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzFfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMikKKyNkZWZpbmUgQURDX0NIQU5ORUxfM19CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDMpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzRfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUw0KQorI2RlZmluZSBBRENfQ0hBTk5FTF81X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMNSkKKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDYpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzdfQklURklFTEQgICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUw3KQorI2RlZmluZSBBRENfQ0hBTk5FTF84X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMOCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9CSVRGSUVMRCAgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDkpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwX0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTFfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDExKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTIpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzX0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxMykKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDE0KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTUpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19DSFNFTFJfQ0hTRUwxNikKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfQklURklFTEQgICAgICAgICAgICAoQURDX0NIU0VMUl9DSFNFTDE3KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQ0hTRUxSX0NIU0VMMTgpCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFscyBMTF9BRENfU0FNUExJTkdUSU1FX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIChjb25jYXRlbmF0aW9uIG9mIG11bHRpcGxlIGJpdHMgdXNlZCBpbiByZWdpc3RlciBTTVBSKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIEFEQyBjaGFubmVscyBzYW1wbGluZyB0aW1lOiBzZXR0aW5nIGNoYW5uZWwgd2lzZSwgdG8gbWFwIGVhY2ggY2hhbm5lbCAgICAqLworLyogICBvbiBvbmUgb2YgdGhlIGNvbW1vbiBzYW1wbGluZyB0aW1lIGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gQURDIGNoYW5uZWxzIGNvbW1vbiBzYW1wbGluZyB0aW1lOiBzZXQgYSBzYW1wbGluZyB0aW1lIGludG8gb25lIG9mIHRoZSAgICovCisvKiAgIGNvbW1vbiBzYW1wbGluZyB0aW1lIGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfU0FNUExJTkdfVElNRV9DSF9NQVNLICAgICAgICAgIChBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLIDw8IEFEQ19TTVBSX1NNUFNFTDBfQklUT0ZGU0VUX1BPUykKKyNkZWZpbmUgQURDX1NBTVBMSU5HX1RJTUVfU01QX01BU0sgICAgICAgICAoQURDX1NNUFJfU01QMiB8IEFEQ19TTVBSX1NNUDEpCisjZGVmaW5lIEFEQ19TQU1QTElOR19USU1FX1NNUF9TSElGVF9NQVNLICAgKEFEQ19TTVBSX1NNUDJfQklUT0ZGU0VUX1BPUyB8IEFEQ19TTVBSX1NNUDFfQklUT0ZGU0VUX1BPUykKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWxzIExMX0FEQ19BV0RfQ0hBTk5FTHhfeHh4IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICovCisvKiAoY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBiaXRzIHVzZWQgaW4gZGlmZmVyZW50IGFuYWxvZyB3YXRjaGRvZ3MsICAgICAgICAqLworLyogKGZlYXR1cmUgb2Ygc2V2ZXJhbCB3YXRjaGRvZ3Mgbm90IGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpKS4gICAgICAgKi8KKy8qIC0gYW5hbG9nIHdhdGNoZG9nIDE6IG1vbml0b3JlZCBjaGFubmVsIGRlZmluZWQgYnkgbnVtYmVyLCAgICAgICAgICAgICAgICAgICovCisvKiAgIHNlbGVjdGlvbiBvZiBBREMgZ3JvdXAgKEFEQyBncm91cCByZWd1bGFyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBhbmFsb2cgd2F0Y2hkb2cgMiBhbmQgMzogbW9uaXRvcmVkIGNoYW5uZWwgZGVmaW5lZCBieSBiaXRmaWVsZCwgbm8gICAgICAgKi8KKy8qICAgc2VsZWN0aW9uIG9uIGdyb3Vwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURDX0FXRF9DUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBBRENfQVdEX0NSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICgweDAwMTAwMDAwVUwpCisjZGVmaW5lIEFEQ19BV0RfQ1IzX1JFR09GRlNFVCAgICAgICAgICAgICAgKDB4MDAyMDAwMDBVTCkKKworLyogUmVnaXN0ZXIgb2Zmc2V0IGdhcCBiZXR3ZWVuIEFXRDEgYW5kIEFXRDItQVdEMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworLyogKFNldCBzZXBhcmF0ZWx5IGFzIEFEQ19BV0RfQ1JYX1JFR09GRlNFVCB0byBzcGFyZSAzMiBiaXRzIHNwYWNlICovCisjZGVmaW5lIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfTUFTSyAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzApCisjZGVmaW5lIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfVkFMICAgICAgKDB4MDAwMDAwMjRVTCkKKworI2RlZmluZSBBRENfQVdEX0NSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgIChBRENfQVdEX0NSMV9SRUdPRkZTRVQgfCBBRENfQVdEX0NSMl9SRUdPRkZTRVQgfCBBRENfQVdEX0NSM19SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICgyMFVMKQorCisjZGVmaW5lIEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyAgICAgICAgICAgKEFEQ19DRkdSMV9BV0QxQ0ggfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpCisjZGVmaW5lIEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIKQorI2RlZmluZSBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0sgICAgICAgIChBRENfQVdEX0NSMV9DSEFOTkVMX01BU0sgfCBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKQorCisjZGVmaW5lIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MgICAgICAgICAgKDIwVUwpIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX0FXRF9DUnhfUkVHT0ZGU0VUIGluIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9NQVNLICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRENfQVdEX1RSMV9SRUdPRkZTRVQgICAgICAgICAgICAgIChBRENfQVdEX0NSMV9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfVFIyX1JFR09GRlNFVCAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IyX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUjNfUkVHT0ZGU0VUICAgICAgICAgICAgICAoQURDX0FXRF9DUjNfUkVHT0ZGU0VUICsgKDFVTCA8PCBBRENfQVdEX0NSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykpCisjZGVmaW5lIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLICAgICAgICAgKEFEQ19BV0RfVFIxX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIyX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIzX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAoQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUykgICAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX1NRUnhfUkVHT0ZGU0VUIGluIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLICovCisjZGVmaW5lIEFEQ19BV0RfVFJYX0JJVF9ISUdIX01BU0sgICAgICAgICAgKDB4MDAwMTAwMDBVTCkgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSB0aHJlc2hvbGQgaGlnaDogbWFzayBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfUE9TICAgICAgICAgICAoMTZVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gb2YgMSBiaXQgdG8gZGlzY3JpbWluYXRlIHRocmVzaG9sZCBoaWdoOiBwb3NpdGlvbiBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0ICAgICAgICAoQURDX0FXRF9UUlhfQklUX0hJR0hfUE9TIC0gNFVMKSAvKiBTaGlmdCBvZiBiaXQgQURDX0FXRF9UUlhfQklUX0hJR0ggdG8gcG9zaXRpb24gdG8gcGVyZm9ybSBhIHNoaWZ0IG9mIDQgcmFua3MgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgKDIwVUwpCisKKworCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjZGVmaW5lIEFEQ19DRkdSMV9SRVNfQklUT0ZGU0VUX1BPUyAgICAgICAgKCAzVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DRkdSMV9SRVMiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DRkdSMV9BV0RTR0xfQklUT0ZGU0VUX1BPUyAgICAgKDIyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DRkdSMV9BV0RTR0wiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19UUjFfSFQxX0JJVE9GRlNFVF9QT1MgICAgICAgICAgKDE2VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19UUjFfSFQxIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMF9CSVRPRkZTRVRfUE9TICAgICggMFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMMCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDFfQklUT0ZGU0VUX1BPUyAgICAoIDFVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDEiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwyX0JJVE9GRlNFVF9QT1MgICAgKCAyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUwyIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMM19CSVRPRkZTRVRfUE9TICAgICggM1VMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMMyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDRfQklUT0ZGU0VUX1BPUyAgICAoIDRVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDQiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUw1X0JJVE9GRlNFVF9QT1MgICAgKCA1VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUw1IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMNl9CSVRPRkZTRVRfUE9TICAgICggNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMNiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDdfQklUT0ZGU0VUX1BPUyAgICAoIDdVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDciIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUw4X0JJVE9GRlNFVF9QT1MgICAgKCA4VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUw4IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMOV9CSVRPRkZTRVRfUE9TICAgICggOVVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMOSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDEwX0JJVE9GRlNFVF9QT1MgICAoMTBVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDEwIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMTFfQklUT0ZGU0VUX1BPUyAgICgxMVVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMMTEiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxMl9CSVRPRkZTRVRfUE9TICAgKDEyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUwxMiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDEzX0JJVE9GRlNFVF9QT1MgICAoMTNVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDEzIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMTRfQklUT0ZGU0VUX1BPUyAgICgxNFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMMTQiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxNV9CSVRPRkZTRVRfUE9TICAgKDE1VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUwxNSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIU0VMUl9DSFNFTDE2X0JJVE9GRlNFVF9QT1MgICAoMTZVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NIU0VMUl9DSFNFTDE2IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hTRUxSX0NIU0VMMTdfQklUT0ZGU0VUX1BPUyAgICgxN1VMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hTRUxSX0NIU0VMMTciIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSFNFTFJfQ0hTRUwxOF9CSVRPRkZTRVRfUE9TICAgKDE4VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSFNFTFJfQ0hTRUwxOCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1NNUFJfU01QMV9CSVRPRkZTRVRfUE9TICAgICAgICAoIDBVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFJfU01QMSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1NNUFJfU01QMl9CSVRPRkZTRVRfUE9TICAgICAgICAoIDRVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFJfU01QMiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1NNUFJfU01QU0VMMF9CSVRPRkZTRVRfUE9TICAgICAoIDhVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFJfU01QU0VMMCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKworCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgZ3JvdXBzICovCisjZGVmaW5lIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTICAgICAgICAgICAgKEFEQ19DUl9BRENBTCB8IEFEQ19DUl9BRFNUUCB8IEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERElTIHwgQURDX0NSX0FERU4pIC8qIEFEQyByZWdpc3RlciBDUiBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIjogU29mdHdhcmUgY2FuIHJlYWQgYXMgd2VsbCBhcyBzZXQgdGhpcyBiaXQuIFdyaXRpbmcgJzAnIGhhcyBubyBlZmZlY3Qgb24gdGhlIGJpdCB2YWx1ZS4gKi8KKworCisvKiBBREMgaW50ZXJuYWwgY2hhbm5lbHMgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAqLworI2RlZmluZSBWUkVGSU5UX0NBTF9BRERSICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkZGNzVBQVVMKSkgLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFZSRUZJTlRfQ0FMOiBWcmVmSW50IEFEQyByYXcgZGF0YSBhY3F1aXJlZCBhdCB0ZW1wZXJhdHVyZSAzMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjMgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfVlJFRiAgICAgICAgICAgICAgICAgICAoIDMwMDBVTCkgICAgICAgICAgICAgICAgICAgIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZvbHRhZ2Ugd2l0aCB3aGljaCBWcmVmSW50IGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiAodG9sZXJhbmNlOiArLTEwIG1WKSAodW5pdDogbVYpLiAqLworLyogVGVtcGVyYXR1cmUgc2Vuc29yICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9BRERSICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgweDFGRkY3NUE4VUwpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyRzAsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkZGNzVDQVVMKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwyOiBPbiBTVE0zMkcwLCB0ZW1wZXJhdHVyZSBzZW5zb3IgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDEzMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjAgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUwxX1RFTVAgICAgICAgICAgICAgICAoKCBpbnQzMl90KSAgIDMwKSAgICAgICAgICAgIC8qIEludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgdGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiBmb3IgZGF0YSBpbnRvIFRFTVBTRU5TT1JfQ0FMMV9BRERSICh0b2xlcmFuY2U6ICstNSBEZWdDKSAodW5pdDogRGVnQykuICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMl9URU1QICAgICAgICAgICAgICAgKCggaW50MzJfdCkgIDEzMCkgICAgICAgICAgICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDJfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HICAgICAgICAgICggMzAwMFVMKSAgICAgICAgICAgICAgICAgICAgLyogQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKHRvbGVyYW5jZTogKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9Qcml2YXRlX01hY3JvcyBBREMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgICogICAgICAgICBhIHJlZ2lzdGVyIGZyb20gYSByZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIGFuIG9mZnNldAorICAqICAgICAgICAgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19PRkZGU0VUX18gT2Zmc2V0IHRvIGJlIGFwcGxpZWQgKHVuaXQ6IG51bWJlciBvZiByZWdpc3RlcnMpLgorICAqIEByZXR2YWwgUG9pbnRlciB0byByZWdpc3RlciBhZGRyZXNzCisgICovCisjZGVmaW5lIF9fQURDX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRkZTRVRfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICgoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpICgodWludDMyX3QpKCYoX19SRUdfXykpICsgKChfX1JFR19PRkZGU0VUX18pIDw8IDJVTCkpKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBBRENfTExfRVNfSU5JVCBBREMgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGNvbW1vbiBwYXJhbWV0ZXJzCisgICogICAgICAgICBhbmQgbXVsdGltb2RlCisgICogICAgICAgICAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db21tb25Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBpbnN0YW5jZXMgc3RhdGUgKGFsbCBBREMgaW5zdGFuY2VzCisgICogICAgICAgICBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlIG11c3QgYmUKKyAgKiAgICAgICAgIGRpc2FibGVkLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ29tbW9uQ2xvY2s7ICAgICAgICAgICAgICAgICAvKiE8IFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uQ2xvY2soKS4gKi8KKworfSBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSAuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9jazsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBpbnN0YW5jZSBjbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0NMT0NLX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBwYXJhbWV0ZXIgaGFzIHNvbWUgY2xvY2sgcmF0aW8gY29uc3RyYWludHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREMgY2xvY2sgc3luY2hyb25vdXMgKGZyb20gUENMSykgd2l0aCBwcmVzY2FsZXIgMSBtdXN0IGJlIGVuYWJsZWQgb25seSBpZiBQQ0xLIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVBCIHByZXNjYWxlciBjb25maWd1cmVkIGluc2lkZSB0aGUgUkNDIG11c3QgYmUgYnlwYXNzZWQgYW5kIHRoZSBzeXN0ZW0gY2xvY2sgbXVzdCBieSA1MCUgZHV0eSBjeWNsZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgUmVzb2x1dGlvbjsgICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgcmVzb2x1dGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFU09MVVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0UmVzb2x1dGlvbigpLiAqLworCisgIHVpbnQzMl90IERhdGFBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19EQVRBX0FMSUdOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldERhdGFBbGlnbm1lbnQoKS4gKi8KKworICB1aW50MzJfdCBMb3dQb3dlck1vZGU7ICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBsb3cgcG93ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0xQX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TG93UG93ZXJNb2RlKCkuICovCisKK30gTExfQURDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyaWdnZXJTb3VyY2U7ICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZTogaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlciBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZyBlZGdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBzZXR0aW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBBREMgb24gb3RoZXIgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyRWRnZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZSgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckxlbmd0aDsgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19TRVFfU0NBTl9MRU5HVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckRpc2NvbnQ7ICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZTogc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZCBudW1iZXIgb2YgcmFua3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaGFzIGFuIGVmZmVjdCBvbmx5IGlmIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXBlbmRpbmcgb24gdGhlIHNlcXVlbmNlciBtb2RlOiBzY2FuIGxlbmd0aCBvZiAyIHJhbmtzIG9yIG1vcmUsIG9yIHNldmVyYWwgQURDIGNoYW5uZWxzIGVuYWJsZWQgaW4gZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIuIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKSApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udCgpLiAqLworCisgIHVpbnQzMl90IENvbnRpbnVvdXNNb2RlOyAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyLCB3aGV0aGVyIEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGluIHNpbmdsZSBtb2RlIChvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcikgb3IgaW4gY29udGludW91cyBtb2RlIChhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19DT05USU5VT1VTX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUgYm90aCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgYW5kIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlKCkuICovCisKKyAgdWludDMyX3QgRE1BVHJhbnNmZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX0RNQV9UUkFOU0ZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKS4gKi8KKworICB1aW50MzJfdCBPdmVycnVuOyAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcHJlc2VydmVkIG9yIG92ZXJ3cml0dGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX09WUl9EQVRBX0JFSEFWSU9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRPdmVycnVuKCkuICovCisKK30gTExfQURDX1JFR19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBBREMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfRkxBRyBBREMgZmxhZ3MKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0FEQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQURSRFkgICAgICAgICAgICAgICAgICBBRENfSVNSX0FEUkRZICAgICAgLyohPCBBREMgZmxhZyBBREMgaW5zdGFuY2UgcmVhZHkgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQ0NSRFkgICAgICAgICAgICAgICAgICBBRENfSVNSX0NDUkRZICAgICAgLyohPCBBREMgZmxhZyBBREMgY2hhbm5lbCBjb25maWd1cmF0aW9uIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPQyAgICAgICAgICAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT1MgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfRU9TICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfT1ZSICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TTVAgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPU01QICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMSAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDEgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMiAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDIgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfQVdEMyAgICAgICAgICAgICAgICAgICBBRENfSVNSX0FXRDMgICAgICAgLyohPCBBREMgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9DQUwgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPQ0FMICAgICAgLyohPCBBREMgZmxhZyBlbmQgb2YgY2FsaWJyYXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lUIEFEQyBpbnRlcnJ1cHRpb25zIGZvciBjb25maWd1cmF0aW9uIChpbnRlcnJ1cHRpb24gZW5hYmxlIG9yIGRpc2FibGUpCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9BRENfUmVhZFJlZyBhbmQgIExMX0FEQ19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSVRfQURSRFkgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQURSRFlJRSAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGluc3RhbmNlIHJlYWR5ICovCisjZGVmaW5lIExMX0FEQ19JVF9DQ1JEWSAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9DQ1JEWUlFICAgIC8qITwgQURDIGludGVycnVwdGlvbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgKi8KKyNkZWZpbmUgTExfQURDX0lUX0VPQyAgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0VPQ0lFICAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0lUX0VPUyAgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0VPU0lFICAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucyAqLworI2RlZmluZSBMTF9BRENfSVRfT1ZSICAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfT1ZSSUUgICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1biAqLworI2RlZmluZSBMTF9BRENfSVRfRU9TTVAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfRU9TTVBJRSAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlICovCisjZGVmaW5lIExMX0FEQ19JVF9BV0QxICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9BV0QxSUUgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FXRDIgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0FXRDJJRSAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiAqLworI2RlZmluZSBMTF9BRENfSVRfQVdEMyAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQVdEM0lFICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzICovCisjZGVmaW5lIExMX0FEQ19JVF9FT0NBTCAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT0NBTElFICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdJU1RFUlMgIEFEQyByZWdpc3RlcnMgY29tcGxpYW50IHdpdGggc3BlY2lmaWMgcHVycG9zZQorICAqIEB7CisgICovCisvKiBMaXN0IG9mIEFEQyByZWdpc3RlcnMgaW50ZW5kZWQgdG8gYmUgdXNlZCAobW9zdCBjb21tb25seSkgd2l0aCAgICAgICAgICAgICAqLworLyogRE1BIHRyYW5zZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQSAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAvKiBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgcmVnaXN0ZXIgKGNvcnJlc3BvbmRpbmcgdG8gcmVnaXN0ZXIgRFIpIHRvIGJlIHVzZWQgd2l0aCBBREMgY29uZmlndXJlZCBpbiBpbmRlcGVuZGVudCBtb2RlLiBXaXRob3V0IERNQSB0cmFuc2ZlciwgcmVnaXN0ZXIgYWNjZXNzZWQgYnkgTEwgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRheCgpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjIgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMi4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMSAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA2LiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjggICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgOC4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMiAgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwLiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18xICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzIgfCBBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNi4gQURDIGNvbW1vbiBjbG9jayBhc3luY2hyb25vdXMgcHJlc2NhbGVyIGlzIGFwcGxpZWQgdG8gZWFjaCBBREMgaW5zdGFuY2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgQURDIGluc3RhbmNlIGNsb2NrIGlzIHNldCB0byBjbG9jayBzb3VyY2UgYXN5bmNocm9ub3VzIChyZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDbG9jaygpICkuICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDMyLiBBREMgY29tbW9uIGNsb2NrIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgaXMgYXBwbGllZCB0byBlYWNoIEFEQyBpbnN0YW5jZSBpZiB0aGUgY29ycmVzcG9uZGluZyBBREMgaW5zdGFuY2UgY2xvY2sgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4gKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0ICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNjQuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4ICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEpICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxMjguIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMjU2ICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAyNTYuIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayBpcyBzZXQgdG8gY2xvY2sgc291cmNlIGFzeW5jaHJvbm91cyAocmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2xvY2soKSApLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX0NMT0NLX0ZSRVFfTU9ERSAgQURDIGNvbW1vbiAtIENsb2NrIGZyZXF1ZW5jeSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9ISUdIICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIGNsb2NrIG1vZGUgdG8gaGlnaCBmcmVxdWVuY3kuIE9uIFNUTTMyRzAsIEFEQyBjbG9jayBmcmVxdWVuY3kgYWJvdmUgMy41TUh6LiAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0ZSRVFfTU9ERV9MT1cgICAgICAgICAoQURDX0NDUl9MRk1FTikgICAgICAgIC8qITwgQURDIGNsb2NrIG1vZGUgdG8gbG93IGZyZXF1ZW5jeS4gT24gU1RNMzJHMCwgQURDIGNsb2NrIGZyZXF1ZW5jeSBiZWxvdyAzLjVNSHouICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX1BBVEhfSU5URVJOQUwgIEFEQyBjb21tb24gLSBNZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE90aGVyIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG1heSBiZSBhdmFpbGFibGUgICAgICAgICovCisvKiAgICAgICAoY29ubmVjdGlvbnMgdG8gb3RoZXIgcGVyaXBoZXJhbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8KKy8qICAgICAgIHBhdGggZW5hYmxlLiBJbiB0aGlzIGNhc2UsIEFjY2VzcyB0byBtZWFzdXJlbWVudCBwYXRoIGlzIGRvbmUgICAgICAgICovCisvKiAgICAgICBvbmx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBBREMgaW50ZXJuYWwgY2hhbm5lbC4gICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aGVzIGFsbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UICAgICAgIChBRENfQ0NSX1ZSRUZFTikgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIFZyZWZJbnQgKi8KKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiAgICAoQURDX0NDUl9UU0VOKSAgICAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCAgICAgICAgICAoQURDX0NDUl9WQkFURU4pICAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCBWYmF0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19DTE9DS19TT1VSQ0UgIEFEQyBpbnN0YW5jZSAtIENsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWNCAgICAgICAgKEFEQ19DRkdSMl9DS01PREVfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyICAgICAgICAoQURDX0NGR1IyX0NLTU9ERV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgICAgICAgIChBRENfQ0ZHUjJfQ0tNT0RFXzEgfCBBRENfQ0ZHUjJfQ0tNT0RFXzApICAgICAgICAgICAgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgbm90IGRpdmlkZWQgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQyAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrLiBBc3luY2hyb25vdXMgY2xvY2sgcHJlc2NhbGVyIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vbkNsb2NrKCkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRVNPTFVUSU9OICBBREMgaW5zdGFuY2UgLSBSZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTJCICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTBCICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX1JFU18wKSAvKiE8IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fOEIgICAgICAgICAgICAgICAoQURDX0NGR1IxX1JFU18xICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyByZXNvbHV0aW9uICA4IGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fNkIgICAgICAgICAgICAgICAoQURDX0NGR1IxX1JFU18xIHwgQURDX0NGR1IxX1JFU18wKSAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0RBVEFfQUxJR04gIEFEQyBpbnN0YW5jZSAtIERhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0RBVEFfQUxJR05fUklHSFQgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IHJpZ2h0IGFsaWduZWQgKGFsaWdubWVudCBvbiBkYXRhIHJlZ2lzdGVyIExTQiBiaXQgMCkqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9MRUZUICAgICAgICAgICAgIChBRENfQ0ZHUjFfQUxJR04pICAgICAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogbGVmdCBhbGlnbmVkIChhbGlnbWVudCBvbiBkYXRhIHJlZ2lzdGVyIE1TQiBiaXQgMTUpKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0xQX01PREUgIEFEQyBpbnN0YW5jZSAtIExvdyBwb3dlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0xQX01PREVfTk9ORSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIEFEQyBsb3cgcG93ZXIgbW9kZSBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0xQX0FVVE9XQUlUICAgICAgICAgICAgICAgICAoQURDX0NGR1IxX1dBSVQpICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb3cgcG93ZXIgbW9kZSBhdXRvIGRlbGF5OiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gbmVjZXNzYXJ5ICh3aGVuIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcmVhZCkuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworI2RlZmluZSBMTF9BRENfTFBfQVVUT1BPV0VST0ZGICAgICAgICAgICAgIChBRENfQ0ZHUjFfQVVUT0ZGKSAgICAgICAgICAgICAgICAgIC8qITwgQURDIGxvdyBwb3dlciBtb2RlIGF1dG8gcG93ZXItb2ZmOiB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIEFEQyBjb252ZXJzaW9uIGFuZCBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgQURDIGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkICh3aXRoIHN0YXJ0dXAgdGltZSBiZXR3ZWVuIHRyaWdnZXIgYW5kIHN0YXJ0IG9mIHNhbXBsaW5nKS4gU2VlIGRlc2NyaXB0aW9uIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0TG93UG93ZXJNb2RlKCkuICovCisjZGVmaW5lIExMX0FEQ19MUF9BVVRPV0FJVF9BVVRPUE9XRVJPRkYgICAgKEFEQ19DRkdSMV9XQUlUIHwgQURDX0NGR1IxX0FVVE9GRikgLyohPCBBREMgbG93IHBvd2VyIG1vZGVzIGF1dG8gd2FpdCBhbmQgYXV0byBwb3dlci1vZmYgY29tYmluZWQuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRlJFUSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGZyZXF1ZW5jeSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1RSSUdHRVJfRlJFUV9ISUdIICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgIC8qITwgQURDIHRyaWdnZXIgZnJlcXVlbmN5IG1vZGUgc2V0IHRvIGhpZ2ggZnJlcXVlbmN5LiBOb3RlOiBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBtdXN0IGJlIHNldCB0byBsb3cgZnJlcXVlbmN5IHdoZW4gYSBkdXJhdGlvbiBpcyBleGNlZWRlZCBiZWZvcmUgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudCAoYmV0d2VlbiBBREMgZW5hYmxlIGFuZCBBREMgY29udmVyc2lvbiBzdGFydCB0cmlnZ2VyIGV2ZW50IG9yIGJldHdlZW4gdHdvIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQpLiBEdXJhdGlvbiB2YWx1ZTogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0SWRsZSIuICovCisjZGVmaW5lIExMX0FEQ19UUklHR0VSX0ZSRVFfTE9XICAgICAgICAgICAgKEFEQ19DRkdSMl9MRlRSSUcpICAgICAgICAvKiE8IEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIHNldCB0byBsb3cgZnJlcXVlbmN5LiBOb3RlOiBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBtdXN0IGJlIHNldCB0byBsb3cgZnJlcXVlbmN5IHdoZW4gYSBkdXJhdGlvbiBpcyBleGNlZWRlZCBiZWZvcmUgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBldmVudCAoYmV0d2VlbiBBREMgZW5hYmxlIGFuZCBBREMgY29udmVyc2lvbiBzdGFydCB0cmlnZ2VyIGV2ZW50IG9yIGJldHdlZW4gdHdvIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQpLiBEdXJhdGlvbiB2YWx1ZTogUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0SWRsZSIuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19TQU1QTElOR1RJTUVfQ09NTU9OICBBREMgaW5zdGFuY2UgLSBTYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhIGdyb3VwIG9mIGNoYW5uZWxzCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8xICAgICAgIChBRENfU01QUl9TTVAxX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBzYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhIGdyb3VwIG9mIGNoYW5uZWxzOiBzYW1wbGluZyB0aW1lIG5iIDEgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMiAgICAgICAoQURDX1NNUFJfU01QMl9CSVRPRkZTRVRfUE9TIHwgQURDX1NBTVBMSU5HX1RJTUVfQ0hfTUFTSykgLyohPCBTZXQgc2FtcGxpbmcgdGltZSBjb21tb24gdG8gYSBncm91cCBvZiBjaGFubmVsczogc2FtcGxpbmcgdGltZSBuYiAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19HUk9VUFMgIEFEQyBpbnN0YW5jZSAtIEdyb3VwcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9SRUdVTEFSICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVTCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciAoYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBkZXZpY2VzKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTCAgQURDIGluc3RhbmNlIC0gQ2hhbm5lbCBudW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8wICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8wX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8yX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8yX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8zX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF80X05VTUJFUiAgfCBBRENfQ0hBTk5FTF80X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF81X05VTUJFUiAgfCBBRENfQ0hBTk5FTF81X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF82X05VTUJFUiAgfCBBRENfQ0hBTk5FTF82X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF83X05VTUJFUiAgfCBBRENfQ0hBTk5FTF83X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF84ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF84X05VTUJFUiAgfCBBRENfQ0hBTk5FTF84X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF85ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF85X05VTUJFUiAgfCBBRENfQ0hBTk5FTF85X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xM19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xN19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xN19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xOCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xOF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xMyB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UuICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzEyIHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IuICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE0IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMyB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFZkZGEuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgaW50ZXJuYWw6IFNXIHN0YXJ0LiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDQgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2lmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08gICAgICAoICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0VYVFNFTF8xICAgICAgICAgICAgICAgICAgICAgIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2VuZGlmCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPICAgICAgKCAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRTRUxfMSB8IEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNpZiBkZWZpbmVkKFRJTTYpCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPICAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMiAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTYgVFJHTy4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgICAgKEFEQ19DRkdSMV9FWFRTRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTE1IFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZW5kaWYKKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSAgICAoQURDX0NGR1IxX0VYVFNFTF8yIHwgQURDX0NGR1IxX0VYVFNFTF8xIHwgQURDX0NGR1IxX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9FREdFICBBREMgZ3JvdXAgcmVndWxhciAtIFRyaWdnZXIgZWRnZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0VYVEVOXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcgICAgICAgIChBRENfQ0ZHUjFfRVhURU5fMSAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORyAgKEFEQ19DRkdSMV9FWFRFTl8xIHwgQURDX0NGR1IxX0VYVEVOXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX0NPTlRJTlVPVVNfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBDb250aW51b3VzIG1vZGUKKyogQHsKKyovCisjZGVmaW5lIExMX0FEQ19SRUdfQ09OVl9TSU5HTEUgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMgICAgICAgICAoQURDX0NGR1IxX0NPTlQpICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIGluIGNvbnRpbnVvdXMgbW9kZTogYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZyBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgYXV0b21hdGljYWxseSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX0RNQV9UUkFOU0ZFUiAgQURDIGdyb3VwIHJlZ3VsYXIgLSBETUEgdHJhbnNmZXIgb2YgQURDIGNvbnZlcnNpb24gZGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9ucyBhcmUgbm90IHRyYW5zZmVycmVkIGJ5IERNQSAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0RNQUVOKSAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFyZSB0cmFuc2ZlcnJlZCBieSBETUEsIGluIGxpbWl0ZWQgbW9kZSAob25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZCB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4gKi8KKyNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEICAoQURDX0NGR1IxX0RNQUNGRyB8IEFEQ19DRkdSMV9ETUFFTikgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhcmUgdHJhbnNmZXJyZWQgYnkgRE1BLCBpbiB1bmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnJlZCAobnVtYmVyIG9mIEFEQyBjb252ZXJzaW9ucykuIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX09WUl9EQVRBX0JFSEFWSU9SICBBREMgZ3JvdXAgcmVndWxhciAtIE92ZXJydW4gYmVoYXZpb3Igb24gY29udmVyc2lvbiBkYXRhCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46IGRhdGEgcHJlc2VydmVkICovCisjZGVmaW5lIExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgKEFEQ19DRkdSMV9PVlJNT0QpICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBvdmVyd3JpdHRlbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1NFUV9NT0RFICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciBjb25maWd1cmF0aW9uIGZsZXhpYmlsaXR5CisqIEB7CisqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9GSVhFRCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBTZXF1ZW5jZXIgY29uZmlndXJlZCB0byBub3QgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4gUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkuICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0NPTkZJR1VSQUJMRSAgICAgICAgKEFEQ19DRkdSMV9DSFNFTFJNT0QpICAvKiE8IFNlcXVlbmNlciBjb25maWd1cmVkIHRvIGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLiBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1NDQU5fTEVOR1RIICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciBzY2FuIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgKEFEQ19DSFNFTFJfU1EyKSAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNhYmxlIChlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6IEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsKSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgIChBRENfQ0hTRUxSX1NRMykgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMiByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTICAoQURDX0NIU0VMUl9TUTQpICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgKEFEQ19DSFNFTFJfU1E1KSAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA0IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV81UkFOS1MgIChBRENfQ0hTRUxSX1NRNikgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNSByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTICAoQURDX0NIU0VMUl9TUTcpICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUyAgKEFEQ19DSFNFTFJfU1E4KSAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA3IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1MgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggOCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19TRVFfU0NBTl9ESVJFQ1RJT04gIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHNjYW4gZGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9ESVJfRk9SV0FSRCAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgT24gdGhpcyBTVE0zMiBzZXJpZSwgcGFyYW1ldGVyIHJlbGV2YW50IG9ubHkgaXMgc2VxdWVuY2VyIHNldCB0byBtb2RlIG5vdCBmdWxseSBjb25maWd1cmFibGUsIHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKS4gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHNjYW4gZGlyZWN0aW9uIGZvcndhcmQ6IGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIgKHNjYW4gb2YgYWxsIHJhbmtzLCBBREMgY29udmVyc2lvbiBvZiByYW5rcyB3aXRoIGNoYW5uZWxzIGVuYWJsZWQgaW4gc2VxdWVuY2VyKS4gT24gc29tZSBvdGhlciBTVE0zMiBmYW1pbGllcywgdGhpcyBzZXR0aW5nIGlzIG5vdCBhdmFpbGFibGUgYW5kIHRoZSBkZWZhdWx0IHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQuICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElSX0JBQ0tXQVJEICAgKEFEQ19DRkdSMV9TQ0FORElSKSAgICAvKiE8IE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciByZWxldmFudCBvbmx5IGlzIHNlcXVlbmNlciBzZXQgdG8gbW9kZSBub3QgZnVsbHkgY29uZmlndXJhYmxlLCByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBzY2FuIGRpcmVjdGlvbiBiYWNrd2FyZDogZnJvbSBoaWdoZXN0IGNoYW5uZWwgbnVtYmVyIHRvIGxvd2VzdCBjaGFubmVsIG51bWJlciAoc2NhbiBvZiBhbGwgcmFua3MsIEFEQyBjb252ZXJzaW9uIG9mIHJhbmtzIHdpdGggY2hhbm5lbHMgZW5hYmxlZCBpbiBzZXF1ZW5jZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksgICAgICAgKEFEQ19DRkdSMV9ESVNDRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgZW5hYmxlIHdpdGggc2VxdWVuY2UgaW50ZXJydXB0aW9uIGV2ZXJ5IHJhbmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19TRVFfUkFOS1MgIEFEQyBncm91cCByZWd1bGFyIC0gU2VxdWVuY2VyIHJhbmtzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEgICAgICAgICAgICAgICAgICAoQURDX1JFR19SQU5LXzFfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18yICAgICAgICAgICAgICAgICAgKEFEQ19SRUdfUkFOS18yX1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMyAgICAgICAgICAgICAgICAgIChBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDMgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzQgICAgICAgICAgICAgICAgICAoQURDX1JFR19SQU5LXzRfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA0ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS181ICAgICAgICAgICAgICAgICAgKEFEQ19SRUdfUkFOS181X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNiAgICAgICAgICAgICAgICAgIChBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDYgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzcgICAgICAgICAgICAgICAgICAoQURDX1JFR19SQU5LXzdfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA3ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS184ICAgICAgICAgICAgICAgICAgKEFEQ19SRUdfUkFOS184X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUgIENoYW5uZWwgLSBTYW1wbGluZyB0aW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xQ1lDTEVfNSAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMS41IEFEQyBjbG9jayBjeWNsZSAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzNDWUNMRVNfNSAgICAgIChBRENfU01QUl9TTVAxXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAzLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzdDWUNMRVNfNSAgICAgIChBRENfU01QUl9TTVAxXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzEyQ1lDTEVTXzUgICAgIChBRENfU01QUl9TTVAxXzEgfCBBRENfU01QUl9TTVAxXzApICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSAxMi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xOUNZQ0xFU181ICAgICAoQURDX1NNUFJfU01QMV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgMTkuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMzlDWUNMRVNfNSAgICAgKEFEQ19TTVBSX1NNUDFfMiB8IEFEQ19TTVBSX1NNUDFfMCkgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDM5LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzc5Q1lDTEVTXzUgICAgIChBRENfU01QUl9TTVAxXzIgfCBBRENfU01QUl9TTVAxXzEpICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgdGltZSA3OS41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV8xNjBDWUNMRVNfNSAgICAoQURDX1NNUFJfU01QMV8yIHwgQURDX1NNUFJfU01QMV8xIHwgQURDX1NNUFJfU01QMV8wKSAvKiE8IFNhbXBsaW5nIHRpbWUgMTYwLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRDEgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0FXRF9DUjFfQ0hBTk5FTF9NQVNLICB8IEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAxICovCisjZGVmaW5lIExMX0FEQ19BV0QyICAgICAgICAgICAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgfCBBRENfQVdEX0NSMl9SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMiAqLworI2RlZmluZSBMTF9BRENfQVdEMyAgICAgICAgICAgICAgICAgICAgICAgIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIHwgQURDX0FXRF9DUjNfUkVHT0ZGU0VUKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0FXRF9DSEFOTkVMUyAgQW5hbG9nIHdhdGNoZG9nIC0gTW9uaXRvcmVkIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgYWxsIGNoYW5uZWxzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8wICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfMiAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXRDFFTiB8IEFEQ19DRkdSMV9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8zICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfNSAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXRDFFTiB8IEFEQ19DRkdSMV9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF82ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfOCAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSAgICAgICAgIHwgQURDX0NGR1IxX0FXRDFFTiB8IEFEQ19DRkdSMV9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF85ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjksIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEwICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzExICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEyICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEzICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE0ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE1ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE2ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE3ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTcsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzE4ICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTgsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcgICAgICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgVmRkYSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX1RIUkVTSE9MRFMgIEFuYWxvZyB3YXRjaGRvZyAtIFRocmVzaG9sZHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdIICAgICAgICAgIChBRENfVFIxX0hUMSAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfTE9XICAgICAgICAgICAoICAgICAgICAgICAgICBBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBsb3cgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERTX0hJR0hfTE9XICAgICAoQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIGJvdGggdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgY29uY2F0ZW5hdGVkIGludG8gdGhlIHNhbWUgZGF0YSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX1NDT1BFICBPdmVyc2FtcGxpbmcgLSBPdmVyc2FtcGxpbmcgc2NvcGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfT1ZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNhYmxlZC4gKi8KKyNkZWZpbmUgTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU0UpICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuIExpdGVyYWwgc3VmZml4ICJjb250aW51ZWQiIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzIGZlYXR1cmluZyBBREMgZ3JvdXAgaW5qZWN0ZWQsIGluIHRoaXMgY2FzZSBvdGhlciBvdmVyc2FtcGxpbmcgc2NvcGUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX0RJU0NPTlRfTU9ERSAgT3ZlcnNhbXBsaW5nIC0gRGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19SRUdfQ09OVCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbyBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikgKi8KKyNkZWZpbmUgTExfQURDX09WU19SRUdfRElTQ09OVCAgICAgICAgICAgICAoQURDX0NGR1IyX1RPVlMpICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbyBuZWVkcyBhIHRyaWdnZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfUkFUSU8gIE92ZXJzYW1wbGluZyAtIFJhdGlvCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18yICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMiAoMiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT180ICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNCAoNCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT184ICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgOCAoOCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18xNiAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSXzEgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTYgKDE2IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzMyICAgICAgICAgICAgICAgIChBRENfQ0ZHUjJfT1ZTUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAzMiAoMzIgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fNjQgICAgICAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNSXzIgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDY0ICg2NCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18xMjggICAgICAgICAgICAgICAoQURDX0NGR1IyX09WU1JfMiB8IEFEQ19DRkdSMl9PVlNSXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTI4ICgxMjggQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMjU2ICAgICAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNSXzIgfCBBRENfQ0ZHUjJfT1ZTUl8xIHwgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDI1NiAoMjU2IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX1NISUZUICBPdmVyc2FtcGxpbmcgLSBEYXRhIHNoaWZ0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9OT05FICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG5vIHNoaWZ0IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIG5vdCBkaXZpZGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMSAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAxIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMiAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF8zICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18xIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDMgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA4IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNCAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA0IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF81ICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzIgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDUgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAzMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1NfMiB8IEFEQ19DRkdSMl9PVlNTXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNiAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDY0IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNyAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18yIHwgQURDX0NGR1IyX09WU1NfMSB8IEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA3IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTI4IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOCAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA4IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMjU2IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0hXX0RFTEFZUyAgRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsCisgICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUKKyAgKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLgorICAqIEB7CisgICovCisgIAorLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJbmRpY2F0aW9ucyBmb3IgZXN0aW1hdGlvbiBvZiBBREMgdGltZW91dCBkZWxheXMsIGZvciB0aGlzICAgICAgICAgICAqLworLyogICAgICAgU1RNMzIgc2VyaWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNhbGlicmF0aW9uIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgODIvZkFEQy4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRDQUwiKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBBREMgZW5hYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMSBjb252ZXJzaW9uIGN5Y2xlLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidFNUQUIiKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBkaXNhYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayBjeWNsZXMgICAqLworLyogICAgICAgLSBBREMgc3RvcCBjb252ZXJzaW9uIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayAgKi8KKy8qICAgICAgICAgY3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBjb252ZXJzaW9uIHRpbWU6IGR1cmF0aW9uIGRlcGVuZGluZyBvbiBBREMgY2xvY2sgYW5kIEFEQyAgICAgICAqLworLyogICAgICAgICBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSByZWZlcmVuY2UgbWFudWFsLCBzZWN0aW9uICJUaW1pbmciKSAgICAgICAgICAgICAgICovCisKKy8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSByZWd1bGF0b3Igc3RhcnQtdXAgdGltZSkgICAgICovCisvKiBEZWxheSBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0QURDVlJFR19TVFVQIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9JTlRFUk5BTF9SRUdVTF9TVEFCX1VTICggMjBVTCkgIC8qITwgRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAqLworCisvKiBEZWxheSBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2Ugc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAqLworLyogRGVsYXkgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidHN0YXJ0X3ZyZWZpbnQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTICAgICAgICggMTJVTCkgIC8qITwgRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTICAgICggMTBVTCkgIC8qITwgRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworLyogRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGEgbWluaW11bSBudW1iZXIgb2YgQURDIGNsb2NrIGN5Y2xlcyAgICAgICAgICAgICovCisvKiAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAqLworLyogICAgICAgV2FpdCB0aW1lIGNhbiBiZSBjb21wdXRlZCBpbiB1c2VyIGFwcGxpY2F0aW9uIGJ5IHdhaXRpbmcgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgIGVxdWl2YWxlbnQgbnVtYmVyIG9mIENQVSBjeWNsZXMsIGJ5IHRha2luZyBpbnRvIGFjY291bnQgICAgICAgICAgICAgICovCisvKiAgICAgICByYXRpbyBvZiBDUFUgY2xvY2sgdmVyc3VzIEFEQyBjbG9jayBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX0NBTElCX0VOQUJMRV9BRENfQ1lDTEVTICggIDJVTCkgIC8qITwgRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX01hY3JvcyBBREMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0FEQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEFEQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEFEQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9BRENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX0hFTFBFUl9NQUNSTyBBREMgaGVscGVyIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICAqICAgICAgICAgZnJvbSBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LgorICAqIEBub3RlICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKExMX0FEQ19DSEFOTkVMXzQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICI0Ii4KKyAgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpcyByZXR1cm5lZCwgZWl0aGVyIGRlZmluZWQgd2l0aCBudW1iZXIKKyAgKiAgICAgICAgIG9yIHdpdGggYml0ZmllbGQgKG9ubHkgb25lIGJpdCBtdXN0IGJlIHNldCkuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICAqLworI2RlZmluZSBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykgPT0gMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwwKSA9PSBBRENfQ0hTRUxSX0NIU0VMMCkgPyAoMFVMKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEpID09IEFEQ19DSFNFTFJfQ0hTRUwxKSA/ICgxVUwpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMikgPT0gQURDX0NIU0VMUl9DSFNFTDIpID8gKDJVTCkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwzKSA9PSBBRENfQ0hTRUxSX0NIU0VMMykgPyAoM1VMKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDQpID09IEFEQ19DSFNFTFJfQ0hTRUw0KSA/ICg0VUwpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMNSkgPT0gQURDX0NIU0VMUl9DSFNFTDUpID8gKDVVTCkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw2KSA9PSBBRENfQ0hTRUxSX0NIU0VMNikgPyAoNlVMKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDcpID09IEFEQ19DSFNFTFJfQ0hTRUw3KSA/ICg3VUwpIDogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMOCkgPT0gQURDX0NIU0VMUl9DSFNFTDgpID8gKDhVTCkgOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUw5KSA9PSBBRENfQ0hTRUxSX0NIU0VMOSkgPyAoOVVMKSA6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEwKSA9PSBBRENfQ0hTRUxSX0NIU0VMMTApID8gKDEwVUwpIDogICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTEpID09IEFEQ19DSFNFTFJfQ0hTRUwxMSkgPyAoMTFVTCkgOiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxMikgPT0gQURDX0NIU0VMUl9DSFNFTDEyKSA/ICgxMlVMKSA6ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDEzKSA9PSBBRENfQ0hTRUxSX0NIU0VMMTMpID8gKDEzVUwpIDogICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTQpID09IEFEQ19DSFNFTFJfQ0hTRUwxNCkgPyAoMTRVTCkgOiAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxNSkgPT0gQURDX0NIU0VMUl9DSFNFTDE1KSA/ICgxNVVMKSA6ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DSEFOTkVMX18pICYgQURDX0NIU0VMUl9DSFNFTDE2KSA9PSBBRENfQ0hTRUxSX0NIU0VMMTYpID8gKDE2VUwpIDogICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hTRUxSX0NIU0VMMTcpID09IEFEQ19DSFNFTFJfQ0hTRUwxNykgPyAoMTdVTCkgOiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSFNFTFJfQ0hTRUwxOCkgPT0gQURDX0NIU0VMUl9DSFNFTDE4KSA/ICgxOFVMKSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBBREMgY2hhbm5lbCBpbiBsaXRlcmFsIGZvcm1hdCBMTF9BRENfQ0hBTk5FTF94CisgICogICAgICAgICBmcm9tIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdC4KKyAgKiBAbm90ZSAgIEV4YW1wbGU6CisgICogICAgICAgICAgIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTCg0KQorICAqICAgICAgICAgICB3aWxsIHJldHVybiBhIGRhdGEgZXF1aXZhbGVudCB0byAiTExfQURDX0NIQU5ORUxfNCIuCisgICogQHBhcmFtICBfX0RFQ0lNQUxfTkJfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAoMikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLlxuCisgICogICAgICAgICAoMikgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKF9fREVDSU1BTF9OQl9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIHwgICAgICAgICAgICAgICAgIFwKKyAgIChBRENfQ0hTRUxSX0NIU0VMMCA8PCAoX19ERUNJTUFMX05CX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAgKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBub3RlICAgVGhlIGRpZmZlcmVudCBsaXRlcmFsIGRlZmluaXRpb25zIG9mIEFEQyBjaGFubmVscyBhcmU6CisgICogICAgICAgICAtIEFEQyBpbnRlcm5hbCBjaGFubmVsOgorICAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULCBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4KKyAgKiAgICAgICAgIC0gQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pOgorICAqICAgICAgICAgICBMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgZGVmaW5lZCBmcm9tIGxpdGVyYWwKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKSwKKyAgKiAgICAgICAgIG11c3Qgbm90IGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgxKSBPbiBTVE0zMkcwLCBwYXJhbWV0ZXIgY2FuIGJlIHNldCBpbiBBREMgZ3JvdXAgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgb25seSBpZiBzZXF1ZW5jZXIgaXMgc2V0IGluIG1vZGUgIm5vdCBmdWxseSBjb25maWd1cmFibGUiLAorICAqICAgICAgICAgICAgIHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKS4KKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbC4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIX01BU0spICE9IDBVTCkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIGNoYW5uZWwgZGVmaW5lZCBmcm9tIHBhcmFtZXRlcgorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIHRvIGl0cyBlcXVpdmFsZW50IHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwKKyAgKiAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIGNhbiBiZSwgYWRkaXRpb25hbGx5IHRvIGEgdmFsdWUKKyAgKiAgICAgICAgIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIGEgdmFsdWUgZGVmaW5lZCBmcm9tIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mCisgICogICAgICAgICBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKQorICAqICAgICAgICAgb3IgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzIHJldHVybmVkCisgICogICAgICAgICBmcm9tIEFEQyByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICovCisjZGVmaW5lIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQ0hBTk5FTF9fKSAmIH5BRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqLworI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRShfX0FEQ19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOgorICAqICAgICAgICAgZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvciB3aXRoIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBhbmQgZ3JvdXBzIGRlZmluaXRpb24uCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKAorICAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoTExfQURDX0NIQU5ORUw0LCBMTF9BRENfR1JPVVBfUkVHVUxBUikpCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAoMikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLlxuCisgICogICAgICAgICAoMikgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKiBAcGFyYW0gIF9fR1JPVVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19HUk9VUF9SRUdVTEFSCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChfX0NIQU5ORUxfXywgX19HUk9VUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1IxX0FXRDFFTiB8IEFEQ19DRkdSMV9BV0QxU0dMKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBzZXQgdGhlIHZhbHVlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2gKKyAgKiAgICAgICAgIG9yIGxvdyBpbiBmdW5jdGlvbiBvZiBBREMgcmVzb2x1dGlvbiwgd2hlbiBBREMgcmVzb2x1dGlvbiBpcworICAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKCkKKyAgKiAgICAgICAgIG9yIEByZWYgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcygpLgorICAqICAgICAgICAgRXhhbXBsZSwgd2l0aCBhIEFEQyByZXNvbHV0aW9uIG9mIDggYml0cywgdG8gc2V0IHRoZSB2YWx1ZSBvZgorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoIChvbiA4IGJpdHMpOgorICAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzCisgICogICAgICAgICAgICAoPCBBREN4IHBhcmFtID4sCisgICogICAgICAgICAgICAgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKExMX0FEQ19SRVNPTFVUSU9OXzhCLCA8dGhyZXNob2xkX3ZhbHVlXzhfYml0cz4pCisgICogICAgICAgICAgICApOworICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTihfX0FEQ19SRVNPTFVUSU9OX18sIF9fQVdEX1RIUkVTSE9MRF9fKSBcCisgICgoX19BV0RfVEhSRVNIT0xEX18pIDw8ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUgKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzIAorICAqICAgICAgICAgZGlmZmVyZW50IG9mIDEyIGJpdHMuCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogICAgICAgICBFeGFtcGxlLCB3aXRoIGEgQURDIHJlc29sdXRpb24gb2YgOCBiaXRzLCB0byBnZXQgdGhlIHZhbHVlIG9mCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgICogICAgICAgICAgIDwgdGhyZXNob2xkX3ZhbHVlXzZfYml0cyA+ID0gX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OCisgICogICAgICAgICAgICAoTExfQURDX1JFU09MVVRJT05fOEIsCisgICogICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcyg8QURDeCBwYXJhbT4sIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gpCisgICogICAgICAgICAgICApOworICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEBwYXJhbSAgX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfR0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKF9fQURDX1JFU09MVVRJT05fXywgX19BV0RfVEhSRVNIT0xEXzEyX0JJVFNfXykgXAorICAoKF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18pID4+ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUgKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGZyb20gcmF3IHZhbHVlIGNvbnRhaW5pbmcgYm90aCB0aHJlc2hvbGRzIGNvbmNhdGVuYXRlZC4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHRvIGdldCBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggZnJvbSB0aGUgcmVnaXN0ZXIgcmF3IHZhbHVlOgorICAqICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gsIDxyYXdfdmFsdWVfd2l0aF9ib3RoX3RocmVzaG9sZHM+KTsKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF9UWVBFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERTX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18sIF9fQVdEX1RIUkVTSE9MRFNfXykgICAgICAgXAorICAoKChfX0FXRF9USFJFU0hPTERTX18pID4+ICgoKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18pICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4gQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSkgJiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoKKyAgKiAgICAgICAgIC0gU2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKF9fQURDeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBREMxX0NPTU1PTikKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQorICAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQorICAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAgKiBAcGFyYW0gIF9fQURDWFlfQ09NTU9OX18gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiBhdCBsZWFzdCBvbmUgQURDIGluc3RhbmNlIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgaXMgZW5hYmxlZC4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKF9fQURDWFlfQ09NTU9OX18pICAgICAgICAgICAgICBcCisgIExMX0FEQ19Jc0VuYWJsZWQoQURDMSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbAorICAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgICogQG5vdGUgICBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQorICAqICAgICAgICAgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLQorICAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUgb2YgQURDIGNvbnZlcnNpb24gZGF0YSkKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgweEZGRlVMID4+ICgoX19BRENfUkVTT0xVVElPTl9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVVMKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnJvbQorICAqICAgICAgICAgYSByZXNvbHV0aW9uIHRvIGFub3RoZXIgcmVzb2x1dGlvbi4KKyAgKiBAcGFyYW0gIF9fREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gYmUgY29udmVydGVkIAorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18gUmVzb2x1dGlvbiBvZiB0aGUgZGF0YSB0byBiZSBjb252ZXJ0ZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXyBSZXNvbHV0aW9uIG9mIHRoZSBkYXRhIGFmdGVyIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSB0byB0aGUgcmVxdWVzdGVkIHJlc29sdXRpb24KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oX19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pICAgICAgICAgICAgXAorICAoKChfX0RBVEFfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA8PCAoKF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fKSA+PiAoQURDX0NGR1IxX1JFU19CSVRPRkZTRVRfUE9TIC0gMVVMKSkpICBcCisgICA+PiAoKF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pID4+IChBRENfQ0ZHUjFfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVUwpKSAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdm9sdGFnZSAodW5pdDogbVZvbHQpCisgICogICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGEgQURDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBlcXVpdmFsZW50IHZvbHRhZ2UgdmFsdWUgKHVuaXQ6IG1Wb2x0KQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgLyBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykKKyAgKiAgICAgICAgICh1bml0OiBtVm9sdCkgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UKKyAgKiAgICAgICAgIHJlZmVyZW5jZSBWcmVmSW50LgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgVnJlZkludCBjYWxpYnJhdGlvbiB2YWx1ZQorICAqICAgICAgICAgc3RvcmVkIGluIHN5c3RlbSBtZW1vcnkgZm9yIGVhY2ggZGV2aWNlIGR1cmluZyBwcm9kdWN0aW9uLgorICAqIEBub3RlICAgVGhpcyB2b2x0YWdlIGRlcGVuZHMgb24gdXNlciBib2FyZCBlbnZpcm9ubWVudDogdm9sdGFnZSBsZXZlbAorICAqICAgICAgICAgY29ubmVjdGVkIHRvIHBpbiBWcmVmKy4KKyAgKiAgICAgICAgIE9uIGRldmljZXMgd2l0aCBzbWFsbCBwYWNrYWdlLCB0aGUgcGluIFZyZWYrIGlzIG5vdCBwcmVzZW50CisgICogICAgICAgICBhbmQgaW50ZXJuYWxseSBib25kZWQgdG8gcGluIFZkZGEuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlCisgICogICAgICAgICBWcmVmSW50IGNvcnJlc3BvbmRzIHRvIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLAorICAqICAgICAgICAgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQURDIHJlc29sdXRpb24gdG8gY29udmVydCB2b2x0YWdlIG9mCisgICogICAgICAgICBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50LgorICAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1ZSRUZJTlRfQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBWcmVmSW50ICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKF9fVlJFRklOVF9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICBcCisgICgoKHVpbnQzMl90KSgqVlJFRklOVF9DQUxfQUREUikgKiBWUkVGSU5UX0NBTF9WUkVGKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8gX19MTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oKF9fVlJFRklOVF9BRENfREFUQV9fKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMKKyAgKiAgICAgICAgIHN0b3JlZCBpbiBzeXN0ZW0gbWVtb3J5IGZvciBlYWNoIGRldmljZSBkdXJpbmcgcHJvZHVjdGlvbi4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKChUU19BRENfREFUQSAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAqIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gKFRTX0NBTDIgLSBUU19DQUwxKSArIFRTX0NBTDFfVEVNUAorICAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgIEF2Z19TbG9wZSA9IChUU19DQUwyIC0gVFNfQ0FMMSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyX1RFTVAgLSBUU19DQUwxX1RFTVApCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMSAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwxIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICAgICAgICAgVFNfQ0FMMiAgID0gZXF1aXZhbGVudCBUU19BRENfREFUQSBhdCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBfREVHQ19DQUwyIChjYWxpYnJhdGVkIGluIGZhY3RvcnkpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGF0IGNhbGlicmF0aW9uCisgICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0IChhZGRyZXNzIGFuZCBkYXRhKS4KKyAgKiAgICAgICAgICAgICAgICAgIFRvIGNhbGN1bGF0ZSB0ZW1wZXJhdHVyZSB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcyAoZ2VuZXJpYyB2YWx1ZXMgbGVzcywgdGhlcmVmb3JlCisgICogICAgICAgICAgICAgICAgICBsZXNzIGFjY3VyYXRlIHRoYW4gY2FsaWJyYXRlZCB2YWx1ZXMpLAorICAqICAgICAgICAgICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkVfVFlQX1BBUkFNUygpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNhbGlicmF0aW9uIGRhdGEgb2YgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICAqICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqICAgICAgICAgT3RoZXJ3aXNlLCB0aGlzIG1hY3JvIHBlcmZvcm1zIHRoZSBwcm9jZXNzaW5nIHRvIHNjYWxlCisgICogICAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIHRvIDEyIGJpdHMuCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsIHRlbXBlcmF0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoICgoaW50MzJfdCkoKF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXyksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICogKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAvIFRFTVBTRU5TT1JfQ0FMX1ZSRUZBTkFMT0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLSAoaW50MzJfdCkgKlRFTVBTRU5TT1JfQ0FMMV9BRERSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICApICogKGludDMyX3QpKFRFTVBTRU5TT1JfQ0FMMl9URU1QIC0gVEVNUFNFTlNPUl9DQUwxX1RFTVApICAgICAgICAgICAgICAgICAgICBcCisgICAgKSAvIChpbnQzMl90KSgoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwyX0FERFIgLSAoaW50MzJfdCkqVEVNUFNFTlNPUl9DQUwxX0FERFIpIFwKKyAgICkgKyBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgdGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgZnJvbSBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIHRlbXBlcmF0dXJlIHNlbnNvciB0eXBpY2FsIHZhbHVlcworICAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQpLgorICAqIEBub3RlICAgQ2FsY3VsYXRpb24gZm9ybXVsYToKKyAgKiAgICAgICAgICAgVGVtcGVyYXR1cmUgPSAoVFNfVFlQX0NBTHhfVk9MVCh1VikgLSBUU19BRENfREFUQSAqIENvbnZlcnNpb25fdVYpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgLyBBdmdfU2xvcGUgKyBDQUx4X1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHJhdyBkYXRhIG1lYXN1cmVkIGJ5IEFEQworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogZGlnaXRhbCB2YWx1ZSkKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgICAgICAgID0gdGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiB1Vi9EZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgICAgICAgICBUU19UWVBfQ0FMeF9WT0xUID0gdGVtcGVyYXR1cmUgc2Vuc29yIGRpZ2l0YWwgdmFsdWUgYXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgQ0FMeF9URU1QICh1bml0OiBtVikKKyAgKiAgICAgICAgIENhdXRpb246IENhbGN1bGF0aW9uIHJlbGV2YW5jeSB1bmRlciByZXNlcnZlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGRldmljZSBoYXMgY2hhcmFjdGVyaXN0aWNzIGluIGxpbmUgd2l0aAorICAqICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0IHR5cGljYWwgdmFsdWVzLgorICAqICAgICAgICAgICAgICAgICAgSWYgdGVtcGVyYXR1cmUgc2Vuc29yIGNhbGlicmF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgICAgICAgICBvbiB0aGlzIGRldmljZSAocHJlc2VuY2Ugb2YgbWFjcm8gX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpKSwKKyAgKiAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIHdpbGwgYmUgbW9yZSBhY2N1cmF0ZSB1c2luZworICAqICAgICAgICAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRSgpLgorICAqIEBub3RlICAgQXMgY2FsY3VsYXRpb24gaW5wdXQsIHRoZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlCisgICogICAgICAgICBkZWZpbmVkIGFzIGl0IGltcGFjdHMgdGhlIEFEQyBMU0IgZXF1aXZhbGVudCB2b2x0YWdlLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAbm90ZSAgIEFEQyBtZWFzdXJlbWVudCBkYXRhIG11c3QgY29ycmVzcG9uZCB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cworICAqICAgICAgICAgKGZ1bGwgc2NhbGUgZGlnaXRhbCB2YWx1ZSA0MDk1KS4gSWYgbm90IHRoZSBjYXNlLCB0aGUgZGF0YSBtdXN0IGJlCisgICogICAgICAgICBwcmVsaW1pbmFyaWx5IHJlc2NhbGVkIHRvIGFuIGVxdWl2YWxlbnQgcmVzb2x1dGlvbiBvZiAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBzZW5zb3Igc2xvcGUgdHlwaWNhbCB2YWx1ZSAodW5pdDogdVYvRGVnQ2Vsc2l1cykuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMkcwLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiQXZnX1Nsb3BlIi4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18gICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgdHlwaWNhbCB2YWx1ZSAoYXQgdGVtcGVyYXR1cmUgYW5kIFZyZWYrIGRlZmluZWQgaW4gcGFyYW1ldGVycyBiZWxvdykgKHVuaXQ6IG1WKS4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIFNUTTMyRzAsIHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgcGFyYW1ldGVyICJWMzAiIChjb3JyZXNwb25kaW5nIHRvIFRTX0NBTDEpLgorICAqIEBwYXJhbSAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fICAgICAgRGV2aWNlIGRhdGFzaGVldCBkYXRhOiBUZW1wZXJhdHVyZSBhdCB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSAoc2VlIHBhcmFtZXRlciBhYm92ZSkgaXMgY29ycmVzcG9uZGluZyAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fICAgICAgICBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGF0IHdoaWNoIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIGhhcyBiZWVuIG1lYXN1cmVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBUZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgICovCisjZGVmaW5lIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkVfVFlQX1BBUkFNUyhfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgXAorICAoKCggKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAoaW50MzJfdCkoKCgoX19URU1QU0VOU09SX0FEQ19EQVRBX18pICogKF9fVlJFRkFOQUxPR19WT0xUQUdFX18pKSAgICAgICBcCisgICAgICAgICAgICAgICAgICAvIF9fTExfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSkgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAqIDEwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKGludDMyX3QpKCgoX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAqIDEwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKSAvIChpbnQzMl90KShfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKSArIChpbnQzMl90KShfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQURDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0RNQV9NYW5hZ2VtZW50IEFEQyBETUEgbWFuYWdlbWVudAorICAqIEB7CisgICovCisvKiBOb3RlOiBMTCBBREMgZnVuY3Rpb25zIHRvIHNldCBETUEgdHJhbnNmZXIgYXJlIGxvY2F0ZWQgaW50byBzZWN0aW9ucyBvZiAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiBvZiBBREMgaW5zdGFuY2UsIGdyb3VwcyBhbmQgbXVsdGltb2RlIChpZiBhdmFpbGFibGUpOiAgKi8KKy8qICAgICAgIEByZWYgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcigpLCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gaGVscCB0byBjb25maWd1cmUgRE1BIHRyYW5zZmVyIGZyb20gQURDOiByZXRyaWV2ZSB0aGUKKyAgKiAgICAgICAgIEFEQyByZWdpc3RlciBhZGRyZXNzIGZyb20gQURDIGluc3RhbmNlIGFuZCBhIGxpc3Qgb2YgQURDIHJlZ2lzdGVycworICAqICAgICAgICAgaW50ZW5kZWQgdG8gYmUgdXNlZCAobW9zdCBjb21tb25seSkgd2l0aCBETUEgdHJhbnNmZXIuCisgICogQG5vdGUgICBUaGVzZSBBREMgcmVnaXN0ZXJzIGFyZSBkYXRhIHJlZ2lzdGVyczoKKyAgKiAgICAgICAgIHdoZW4gQURDIGNvbnZlcnNpb24gZGF0YSBpcyBhdmFpbGFibGUgaW4gQURDIGRhdGEgcmVnaXN0ZXJzLAorICAqICAgICAgICAgQURDIGdlbmVyYXRlcyBhIERNQSB0cmFuc2ZlciByZXF1ZXN0LgorICAqIEBub3RlICAgVGhpcyBtYWNybyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggTEwgRE1BIGRyaXZlciwgcmVmZXIgdG8KKyAgKiAgICAgICAgIGZ1bmN0aW9uICJMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKCkiLgorICAqICAgICAgICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3NlcyhETUExLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9DSEFOTkVMXzEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyKEFEQzEsIExMX0FEQ19ETUFfUkVHX1JFR1VMQVJfREFUQSksCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSY8IGFycmF5IG9yIHZhcmlhYmxlID4sCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZKTsKKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREM6IGluIG11bHRpbW9kZSwgc29tZSBkZXZpY2VzCisgICogICAgICAgICB1c2UgYSBkaWZmZXJlbnQgZGF0YSByZWdpc3RlciBvdXRzaWRlIG9mIEFEQyBpbnN0YW5jZSBzY29wZQorICAqICAgICAgICAgKGNvbW1vbiBkYXRhIHJlZ2lzdGVyKS4gVGhpcyBtYWNybyBtYW5hZ2VzIHRoaXMgcmVnaXN0ZXIgZGlmZmVyZW5jZSwKKyAgKiAgICAgICAgIG9ubHkgQURDIGluc3RhbmNlIGhhcyB0byBiZSBzZXQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgRFIgICAgICAgREFUQSAgICAgICAgICAgTExfQURDX0RNQV9HZXRSZWdBZGRyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVnaXN0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEKKyAgKiBAcmV0dmFsIEFEQyByZWdpc3RlciBhZGRyZXNzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0RNQV9HZXRSZWdBZGRyKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSZWdpc3RlcikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICAodm9pZCkoUmVnaXN0ZXIpOworICAKKyAgLyogUmV0cmlldmUgYWRkcmVzcyBvZiByZWdpc3RlciBEUiAqLworICByZXR1cm4gKHVpbnQzMl90KSYoQURDeC0+RFIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Db21tb24gQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBjb21tb24gdG8gc2V2ZXJhbCBBREMgaW5zdGFuY2VzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKCkuCisgICogQHJtdG9sbCBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2sKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgQ29tbW9uQ2xvY2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjQgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY4ICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjggKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NiAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIAorICAqICAgICAgICAgICAgIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayAgCisgICogICAgICAgICAgICAgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMuCisgICogICAgICAgICAgICAgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25DbG9jayhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgQ29tbW9uQ2xvY2spCit7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfUFJFU0MsIENvbW1vbkNsb2NrKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXIuCisgICogQHJtdG9sbCBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfR2V0Q29tbW9uQ2xvY2sKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjQgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY4ICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjggKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NiAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIEFEQyBjb21tb24gY2xvY2sgYXN5bmNocm9ub3VzIHByZXNjYWxlciBpcyBhcHBsaWVkIHRvIAorICAqICAgICAgICAgICAgIGVhY2ggQURDIGluc3RhbmNlIGlmIHRoZSBjb3JyZXNwb25kaW5nIEFEQyBpbnN0YW5jZSBjbG9jayAgCisgICogICAgICAgICAgICAgaXMgc2V0IHRvIGNsb2NrIHNvdXJjZSBhc3luY2hyb25vdXMuCisgICogICAgICAgICAgICAgKHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENsb2NrKCkgKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q29tbW9uQ2xvY2soQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1BSRVNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTGVnYWN5IGZlYXR1cmUsIHVzZWxlc3Mgb24gU1RNMzJHMCAoQURDIGNvbW1vbiBjbG9jayBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICBtb2RlIGlzIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSBBREMgcGVyaXBoZXJhbCBvbiBTVE0zMkcwKS4KKyAgICAgICAgICAgIEZ1bmN0aW9uIGtlcHQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0NSICAgICAgTEZNRU4gICAgICAgICAgTExfQURDX1NldENvbW1vbkZyZXF1ZW5jeU1vZGUKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgQ29tbW9uRnJlcXVlbmN5TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19GUkVRX01PREVfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19GUkVRX01PREVfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uRnJlcXVlbmN5TW9kZShBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgQ29tbW9uRnJlcXVlbmN5TW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9MRk1FTiwgQ29tbW9uRnJlcXVlbmN5TW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTGVnYWN5IGZlYXR1cmUsIHVzZWxlc3Mgb24gU1RNMzJHMCAoQURDIGNvbW1vbiBjbG9jayBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICBtb2RlIGlzIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSBBREMgcGVyaXBoZXJhbCBvbiBTVE0zMkcwKS4KKyAgICAgICAgICAgIEZ1bmN0aW9uIGtlcHQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqIEBybXRvbGwgQ0NSICAgICAgTEZNRU4gICAgICAgICAgTExfQURDX0dldENvbW1vbkZyZXF1ZW5jeU1vZGUKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0xPVworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDb21tb25GcmVxdWVuY3lNb2RlKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9MRk1FTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsCisgICogICAgICAgICBjaGFubmVscyAoVnJlZkludCwgdGVtcGVyYXR1cmUgc2Vuc29yLCAuLi4pLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSBzZWxlY3RlZC4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwKKyAgKiAgICAgICAgICAgICAgICAgICBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKQorICAqIEBub3RlICAgU3RhYmlsaXphdGlvbiB0aW1lIG9mIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgIEFmdGVyIGVuYWJsaW5nIGludGVybmFsIHBhdGhzLCBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb24sCisgICogICAgICAgICBhIGRlbGF5IGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSBhbmQKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9WUkVGSU5UX1NUQUJfVVMuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUy4KKyAgKiBAbm90ZSAgIEFEQyBpbnRlcm5hbCBjaGFubmVsIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludDoKKyAgKiAgICAgICAgIEZvciBBREMgY29udmVyc2lvbiBvZiBpbnRlcm5hbCBjaGFubmVscywKKyAgKiAgICAgICAgIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlIGlzIHJlcXVpcmVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjaGVjayBjYW4gYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0lzRW5hYmxlZCgpIGZvciBlYWNoCisgICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIGhlbHBlciBtYWNybworICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKS4KKyAgKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBUU0VOICAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICAqICAgICAgICAgQ0NSICAgICAgVkJBVEVOICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIFBhdGhJbnRlcm5hbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04sIHVpbnQzMl90IFBhdGhJbnRlcm5hbCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1RTRU4gfCBBRENfQ0NSX1ZCQVRFTiwgUGF0aEludGVybmFsKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbAorICAqICAgICAgICAgY2hhbm5lbHMgKFZyZWZJbnQsIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKS4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8CisgICogICAgICAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikKKyAgKiBAcm10b2xsIENDUiAgICAgIFZSRUZFTiAgICAgICAgIExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaFxuCisgICogICAgICAgICBDQ1IgICAgICBUU0VOICAgICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICAqICAgICAgICAgQ0NSICAgICAgVkJBVEVOICAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoCisgICogQHBhcmFtICBBREN4eV9DT01NT04gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2goQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX1ZSRUZFTiB8IEFEQ19DQ1JfVFNFTiB8IEFEQ19DQ1JfVkJBVEVOKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogQURDIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGluc3RhbmNlIGNsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgQ0tNT0RFICAgICAgICAgTExfQURDX1NldENsb2NrCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgQXN5bmNocm9ub3VzIGNsb2NrIHByZXNjYWxlciBjYW4gYmUgY29uZmlndXJlZCB1c2luZworICAqICAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vbkNsb2NrKCkuXG4KKyAgKiAgICAgICAgICgyKSBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciBoYXMgc29tZSBjbG9jayByYXRpbyBjb25zdHJhaW50czoKKyAgKiAgICAgICAgICAgICBUaGlzIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBlbmFibGVkIG9ubHkgaWYgUENMSyBoYXMgYSA1MCUKKyAgKiAgICAgICAgICAgICBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIHRoZSBSQ0MKKyAgKiAgICAgICAgICAgICBtdXN0IGJlIGJ5cGFzc2VkIGFuZCB0aGUgc3lzdGVtIGNsb2NrIG11c3QgYnkgNTAlIGR1dHkKKyAgKiAgICAgICAgICAgICBjeWNsZSkuCisgICogICAgICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDbG9jayhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2xvY2tTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9DS01PREUsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGluc3RhbmNlIGNsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgQ0tNT0RFICAgICAgICAgTExfQURDX0dldENsb2NrCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgQXN5bmNocm9ub3VzIGNsb2NrIHByZXNjYWxlciBjYW4gYmUgcmV0cmlldmVkIHVzaW5nCisgICogICAgICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfR2V0Q29tbW9uQ2xvY2soKS5cbgorICAqICAgICAgICAgKDIpIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIGhhcyBzb21lIGNsb2NrIHJhdGlvIGNvbnN0cmFpbnRzOgorICAqICAgICAgICAgICAgIFRoaXMgY29uZmlndXJhdGlvbiBtdXN0IGJlIGVuYWJsZWQgb25seSBpZiBQQ0xLIGhhcyBhIDUwJQorICAqICAgICAgICAgICAgIGR1dHkgY2xvY2sgY3ljbGUgKEFQQiBwcmVzY2FsZXIgY29uZmlndXJlZCBpbnNpZGUgdGhlIFJDQworICAqICAgICAgICAgICAgIG11c3QgYmUgYnlwYXNzZWQgYW5kIHRoZSBzeXN0ZW0gY2xvY2sgbXVzdCBieSA1MCUgZHV0eQorICAqICAgICAgICAgICAgIGN5Y2xlKS4KKyAgKiAgICAgICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRDbG9jayhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9DS01PREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAgKiAgICAgICAgIG9yIGRpZmZlcmVudGlhbCAoZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGUpLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBzZXQgY2FsaWJyYXRpb24gcGFyYW1ldGVycworICAqICAgICAgICAgd2l0aG91dCBoYXZpbmcgdG8gcGVyZm9ybSBhIG5ldyBjYWxpYnJhdGlvbiB1c2luZworICAqICAgICAgICAgQHJlZiBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQsIHdpdGhvdXQgY2FsaWJyYXRpb24gb24gZ29pbmcsIHdpdGhvdXQgY29udmVyc2lvbgorICAqICAgICAgICAgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENBTEZBQ1QgIENBTEZBQ1QgICAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENhbGlicmF0aW9uRmFjdG9yIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENhbGlicmF0aW9uRmFjdG9yKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3RvcikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DQUxGQUNULAorICAgICAgICAgICAgIEFEQ19DQUxGQUNUX0NBTEZBQ1QsCisgICAgICAgICAgICAgQ2FsaWJyYXRpb25GYWN0b3IpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY2FsaWJyYXRpb24gZmFjdG9yIGluIHRoZSBtb2RlIHNpbmdsZS1lbmRlZAorICAqICAgICAgICAgb3IgZGlmZmVyZW50aWFsIChmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZSkuCisgICogQG5vdGUgICBDYWxpYnJhdGlvbiBmYWN0b3JzIGFyZSBzZXQgYnkgaGFyZHdhcmUgYWZ0ZXIgcGVyZm9ybWluZworICAqICAgICAgICAgYSBjYWxpYnJhdGlvbiBydW4gdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbigpLgorICAqIEBybXRvbGwgQ0FMRkFDVCAgQ0FMRkFDVCAgICAgICAgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DQUxGQUNULCBBRENfQ0FMRkFDVF9DQUxGQUNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyByZXNvbHV0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgUkVTICAgICAgICAgICAgTExfQURDX1NldFJlc29sdXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSZXNvbHV0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldFJlc29sdXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJlc29sdXRpb24pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9SRVMsIFJlc29sdXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgcmVzb2x1dGlvbi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAcm10b2xsIENGR1IxICAgIFJFUyAgICAgICAgICAgIExMX0FEQ19HZXRSZXNvbHV0aW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldFJlc29sdXRpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfUkVTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAqIEBub3RlICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzCisgICogICAgICAgICBkZXBlbmRlbmNpZXMgdG8gQURDIHJlc29sdXRpb25zLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgQUxJR04gICAgICAgICAgTExfQURDX1NldERhdGFBbGlnbm1lbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBEYXRhQWxpZ25tZW50IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fUklHSFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0RGF0YUFsaWdubWVudChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgRGF0YUFsaWdubWVudCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX0FMSUdOLCBEYXRhQWxpZ25tZW50KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICogQG5vdGUgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQHJtdG9sbCBDRkdSMSAgICBBTElHTiAgICAgICAgICBMTF9BRENfR2V0RGF0YUFsaWdubWVudAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fUklHSFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9MRUZUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfQUxJR04pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGxvdyBwb3dlciBtb2RlLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoKKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiOiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLAorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMgb2NjdXJyZW5jZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIG1pbmltdW0gbmVjZXNzYXJ5CisgICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiAgICAgICAgICAgTmV3IEFEQyBjb252ZXJzaW9uIHN0YXJ0cyBvbmx5IHdoZW4gdGhlIHByZXZpb3VzCisgICogICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiBkYXRhIChmb3IgQURDIGdyb3VwIHJlZ3VsYXIpCisgICogICAgICAgICAgIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLgorICAqICAgICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIEFEQyByZW1haW5zIGlkbGU6IGRvZXMgbm90IHBlcmZvcm1zIGFueQorICAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLgorICAqICAgICAgICAgICBUaGlzIG1vZGUgYWxsb3dzIHRvIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIEFEQyBjb252ZXJzaW9ucworICAqICAgICAgICAgICB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHNvZnR3YXJlIHRoYXQgcmVhZHMgdGhlIGRhdGEuCisgICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kKKyAgKiAgICAgICAgICAgYXBwbGljYXRpb25zLgorICAqICAgICAgICAgICBIb3cgdG8gdXNlIHRoaXMgbG93IHBvd2VyIG1vZGU6CisgICogICAgICAgICAgIC0gRG8gbm90IHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEgc2luY2UgdGhlc2UgbW9kZXMKKyAgKiAgICAgICAgICAgICBoYXZlIHRvIGNsZWFyIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZyB0byBmcmVlIHRoZQorICAqICAgICAgICAgICAgIElSUSB2ZWN0b3Igc2VxdWVuY2VyLgorICAqICAgICAgICAgICAtIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24sCisgICogICAgICAgICAgICAgMi4gTGF0ZXIgb24sIHdoZW4gY29udmVyc2lvbiBkYXRhIGlzIG5lZWRlZDogcG9sbCBmb3IgZW5kIG9mCisgICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kCisgICogICAgICAgICAgICAgcmV0cmlldmUgQURDIGNvbnZlcnNpb24gZGF0YS4gVGhpcyB3aWxsIHRyaWcgYW5vdGhlcgorICAqICAgICAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0LgorICAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gcG93ZXItb2ZmIiAoZmVhdHVyZSBhdmFpbGFibGUgb24KKyAgKiAgICAgICAgICAgdGhpcyBkZXZpY2UgaWYgcGFyYW1ldGVyIExMX0FEQ19MUF9BVVRPUE9XRVJPRkYgaXMgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgdGhlIEFEQyBhdXRvbWF0aWNhbGx5IHBvd2Vycy1vZmYgYWZ0ZXIgYSBjb252ZXJzaW9uIGFuZAorICAqICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQKKyAgKiAgICAgICAgICAgKHdpdGggc3RhcnR1cCB0aW1lIGJldHdlZW4gdHJpZ2dlciBhbmQgc3RhcnQgb2Ygc2FtcGxpbmcpLgorICAqICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIuCisgICogQG5vdGUgICBXaXRoIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IiwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgcmVhZAorICAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQorICAqICAgICAgICAgb2YgZGVsYXkgZHVyaW5nIHdoaWNoIEFEQyB3YXMgaWRsZS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgbWF5IGJlIG91dGRhdGVkOiBkb2VzIG5vdAorICAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBXQUlUICAgICAgICAgICBMTF9BRENfU2V0TG93UG93ZXJNb2RlXG4KKyAgKiAgICAgICAgIENGR1IxICAgIEFVVE9GRiAgICAgICAgIExMX0FEQ19TZXRMb3dQb3dlck1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9QT1dFUk9GRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPV0FJVF9BVVRPUE9XRVJPRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRMb3dQb3dlck1vZGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IExvd1Bvd2VyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgKEFEQ19DRkdSMV9XQUlUIHwgQURDX0NGR1IxX0FVVE9GRiksIExvd1Bvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBsb3cgcG93ZXIgbW9kZToKKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBsb3cgcG93ZXIgbW9kZXM6CisgICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IjogRHluYW1pYyBsb3cgcG93ZXIgbW9kZSwKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zIG9jY3VycmVuY2VzIGFyZSBsaW1pdGVkIHRvIHRoZSBtaW5pbXVtIG5lY2Vzc2FyeQorICAqICAgICAgICAgICBpbiBvcmRlciB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uCisgICogICAgICAgICAgIE5ldyBBREMgY29udmVyc2lvbiBzdGFydHMgb25seSB3aGVuIHRoZSBwcmV2aW91cworICAqICAgICAgICAgICB1bml0YXJ5IGNvbnZlcnNpb24gZGF0YSAoZm9yIEFEQyBncm91cCByZWd1bGFyKQorICAqICAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgYnkgdXNlciBzb2Z0d2FyZS4KKyAgKiAgICAgICAgICAgSW4gdGhlIG1lYW50aW1lLCBBREMgcmVtYWlucyBpZGxlOiBkb2VzIG5vdCBwZXJmb3JtcyBhbnkKKyAgKiAgICAgICAgICAgb3RoZXIgY29udmVyc2lvbi4KKyAgKiAgICAgICAgICAgVGhpcyBtb2RlIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5IGFkYXB0IHRoZSBBREMgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICAgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IHJlYWRzIHRoZSBkYXRhLgorICAqICAgICAgICAgICBNb3Jlb3ZlciwgdGhpcyBhdm9pZHMgcmlzayBvZiBvdmVycnVuIGZvciBsb3cgZnJlcXVlbmN5CisgICogICAgICAgICAgIGFwcGxpY2F0aW9ucy4KKyAgKiAgICAgICAgICAgSG93IHRvIHVzZSB0aGlzIGxvdyBwb3dlciBtb2RlOgorICAqICAgICAgICAgICAtIERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIHNpbmNlIHRoZXNlIG1vZGVzCisgICogICAgICAgICAgICAgaGF2ZSB0byBjbGVhciBpbW1lZGlhdGVseSB0aGUgRU9DIGZsYWcgdG8gZnJlZSB0aGUKKyAgKiAgICAgICAgICAgICBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgKiAgICAgICAgICAgLSBEbyB1c2Ugd2l0aCBwb2xsaW5nOiAxLiBTdGFydCBjb252ZXJzaW9uLAorICAqICAgICAgICAgICAgIDIuIExhdGVyIG9uLCB3aGVuIGNvbnZlcnNpb24gZGF0YSBpcyBuZWVkZWQ6IHBvbGwgZm9yIGVuZCBvZgorICAqICAgICAgICAgICAgIGNvbnZlcnNpb24gIHRvIGVuc3VyZSB0aGF0IGNvbnZlcnNpb24gaXMgY29tcGxldGVkIGFuZAorICAqICAgICAgICAgICAgIHJldHJpZXZlIEFEQyBjb252ZXJzaW9uIGRhdGEuIFRoaXMgd2lsbCB0cmlnIGFub3RoZXIKKyAgKiAgICAgICAgICAgICBBREMgY29udmVyc2lvbiBzdGFydC4KKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHBvd2VyLW9mZiIgKGZlYXR1cmUgYXZhaWxhYmxlIG9uCisgICogICAgICAgICAgIHRoaXMgZGV2aWNlIGlmIHBhcmFtZXRlciBMTF9BRENfTFBfQVVUT1BPV0VST0ZGIGlzIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHRoZSBBREMgYXV0b21hdGljYWxseSBwb3dlcnMtb2ZmIGFmdGVyIGEgY29udmVyc2lvbiBhbmQKKyAgKiAgICAgICAgICAgYXV0b21hdGljYWxseSB3YWtlcyB1cCB3aGVuIGEgbmV3IGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkCisgICogICAgICAgICAgICh3aXRoIHN0YXJ0dXAgdGltZSBiZXR3ZWVuIHRyaWdnZXIgYW5kIHN0YXJ0IG9mIHNhbXBsaW5nKS4KKyAgKiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBjb21iaW5lZCB3aXRoIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLgorICAqIEBub3RlICAgV2l0aCBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIHJlYWQKKyAgKiAgICAgICAgIGlzIGNvcnJlc3BvbmRpbmcgdG8gcHJldmlvdXMgQURDIGNvbnZlcnNpb24gc3RhcnQsIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGRlbGF5IGR1cmluZyB3aGljaCBBREMgd2FzIGlkbGUuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIG1heSBiZSBvdXRkYXRlZDogZG9lcyBub3QKKyAgKiAgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgdm9sdGFnZSBsZXZlbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIEFEQyBjaGFubmVsLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgV0FJVCAgICAgICAgICAgTExfQURDX0dldExvd1Bvd2VyTW9kZVxuCisgICogICAgICAgICBDRkdSMSAgICBBVVRPRkYgICAgICAgICBMTF9BRENfR2V0TG93UG93ZXJNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9QT1dFUk9GRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9BVVRPV0FJVF9BVVRPUE9XRVJPRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0TG93UG93ZXJNb2RlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgKEFEQ19DRkdSMV9XQUlUIHwgQURDX0NGR1IxX0FVVE9GRikpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIHRyaWdnZXIgZnJlcXVlbmN5IG1vZGUuCisgICogQG5vdGUgICBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBtdXN0IGJlIHNldCB0byBsb3cgZnJlcXVlbmN5IHdoZW4KKyAgKiAgICAgICAgIGEgZHVyYXRpb24gaXMgZXhjZWVkZWQgYmVmb3JlIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQKKyAgKiAgICAgICAgIChiZXR3ZWVuIEFEQyBlbmFibGUgYW5kIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQKKyAgKiAgICAgICAgIG9yIGJldHdlZW4gdHdvIEFEQyBjb252ZXJzaW9uIHN0YXJ0IHRyaWdnZXIgZXZlbnQpLgorICAqICAgICAgICAgRHVyYXRpb24gdmFsdWU6IFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidElkbGUiLgorICAqIEBub3RlICAgV2hlbiBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZSBpcyBzZXQgdG8gbG93IGZyZXF1ZW5jeSwgCisgICogICAgICAgICBzb21lIHJlYXJtIGN5Y2xlcyBhcmUgaW5zZXJ0ZWQgYmVmb3JlIHBlcmZvcm1pbmcgQURDIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIHN0YXJ0LCBpbmR1Y2luZyBhIGRlbGF5IG9mIDIgQURDIGNsb2NrIGN5Y2xlcy4KKyAgKiBAbm90ZSAgIFVzYWdlIG9mIEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIHdpdGggQURDIGxvdyBwb3dlciBtb2RlOgorICAqICAgICAgICAgLSBMb3cgcG93ZXIgbW9kZSBhdXRvIHdhaXQ6IE9ubHkgdGhlIGZpcnN0IEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHN0YXJ0IHRyaWdnZXIgaW5zZXJ0cyB0aGUgcmVhcm0gZGVsYXkuCisgICogICAgICAgICAtIExvdyBwb3dlciBtb2RlIGF1dG8gcG93ZXItb2ZmOiBBREMgdHJpZ2dlciBmcmVxdWVuY3kgbW9kZQorICAqICAgICAgICAgICBpcyBkaXNjYXJkZWQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMiAgICBMRlRSSUcgICAgICAgICBMTF9BRENfU2V0VHJpZ2dlckZyZXF1ZW5jeU1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VyRnJlcXVlbmN5TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19UUklHR0VSX0ZSRVFfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19UUklHR0VSX0ZSRVFfTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0VHJpZ2dlckZyZXF1ZW5jeU1vZGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJGcmVxdWVuY3lNb2RlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfTEZUUklHLCBUcmlnZ2VyRnJlcXVlbmN5TW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgTEZUUklHICAgICAgICAgTExfQURDX0dldFRyaWdnZXJGcmVxdWVuY3lNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfVFJJR0dFUl9GUkVRX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfVFJJR0dFUl9GUkVRX0xPVworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRUcmlnZ2VyRnJlcXVlbmN5TW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9MRlRSSUcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2FtcGxpbmcgdGltZSBjb21tb24gdG8gYSBncm91cCBvZiBjaGFubmVscy4KKyAgKiBAbm90ZSAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzYW1wbGluZyB0aW1lIHNjb3BlIGlzIG9uIEFEQyBpbnN0YW5jZToKKyAgKiAgICAgICAgIFNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgIChvbiBzb21lIG90aGVyIFNUTTMyIGZhbWlsaWVzLCBzYW1wbGluZyB0aW1lIGlzIGNoYW5uZWwgd2lzZSkKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwgVGVtcFNlbnNvciwgLi4uKSB0byBiZQorICAqICAgICAgICAgY29udmVydGVkOgorICAqICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUKKyAgKiAgICAgICAgIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgIHNldHRpbmcpLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMgKHBhcmFtZXRlcnMgVFNfdnJlZmludCwKKyAgKiAgICAgICAgIFRTX3RlbXAsIC4uLikuCisgICogQG5vdGUgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZS4KKyAgKiAgICAgICAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBwcm9jZXNzaW5nIHRpbWUgaXM6CisgICogICAgICAgICAtIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzCisgICogICAgICAgICAtIDEwLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzCisgICogICAgICAgICAtIDguNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDggYml0cworICAqICAgICAgICAgLSA2LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA2IGJpdHMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKSwgYSBzYW1wbGluZyB0aW1lIG1pbmltdW0gdmFsdWUKKyAgKiAgICAgICAgIGlzIHJlcXVpcmVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIFNNUFIgICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVsc1xuCisgICogQHJtdG9sbCBTTVBSICAgICBTTVAyICAgICAgICAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ2hhbm5lbHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTYW1wbGluZ1RpbWVZIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzIKKyAgKiBAcGFyYW0gIFNhbXBsaW5nVGltZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMUNZQ0xFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzNDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfN0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xOUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8zOUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV83OUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xNjBDWUNMRVNfNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldFNhbXBsaW5nVGltZUNvbW1vbkNoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBTYW1wbGluZ1RpbWVZLCB1aW50MzJfdCBTYW1wbGluZ1RpbWUpCit7CisgIE1PRElGWV9SRUcoQURDeC0+U01QUiwKKyAgICAgICAgICAgICBBRENfU01QUl9TTVAxIDw8IChTYW1wbGluZ1RpbWVZICYgQURDX1NBTVBMSU5HX1RJTUVfU01QX1NISUZUX01BU0spLAorICAgICAgICAgICAgIFNhbXBsaW5nVGltZSA8PCAoU2FtcGxpbmdUaW1lWSAmIEFEQ19TQU1QTElOR19USU1FX1NNUF9TSElGVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHNhbXBsaW5nIHRpbWUgY29tbW9uIHRvIGEgZ3JvdXAgb2YgY2hhbm5lbHMuCisgICogQG5vdGUgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2FtcGxpbmcgdGltZSBzY29wZSBpcyBvbiBBREMgaW5zdGFuY2U6CisgICogICAgICAgICBTYW1wbGluZyB0aW1lIGNvbW1vbiB0byBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAob24gc29tZSBvdGhlciBTVE0zMiBmYW1pbGllcywgc2FtcGxpbmcgdGltZSBpcyBjaGFubmVsIHdpc2UpCisgICogQG5vdGUgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIEFEQyBwcm9jZXNzaW5nIHRpbWUgb2YKKyAgKiAgICAgICAgIHRoaXMgU1RNMzIgc2VyaWUuCisgICogQHJtdG9sbCBTTVBSICAgICBTTVAxICAgICAgICAgICBMTF9BRENfR2V0U2FtcGxpbmdUaW1lQ29tbW9uQ2hhbm5lbHNcbgorICAqIEBybXRvbGwgU01QUiAgICAgU01QMiAgICAgICAgICAgTExfQURDX0dldFNhbXBsaW5nVGltZUNvbW1vbkNoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2FtcGxpbmdUaW1lWSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfMUNZQ0xFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzNDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfN0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xOUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8zOUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV83OUNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xNjBDWUNMRVNfNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2FtcGxpbmdUaW1lWSkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKEFEQ3gtPlNNUFIsIEFEQ19TTVBSX1NNUDEgPDwgKFNhbXBsaW5nVGltZVkgJiBBRENfU0FNUExJTkdfVElNRV9TTVBfU0hJRlRfTUFTSykpKQorICAgICAgICAgICAgICAgICAgICA+PiAoU2FtcGxpbmdUaW1lWSAmIEFEQ19TQU1QTElOR19USU1FX1NNUF9TSElGVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCByZWd1bGFyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZToKKyAgKiAgICAgICAgIGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwKKyAgKiAgICAgICAgIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgdHJpZ2dlciBzb3VyY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlcgorICAqICAgICAgICAgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZSAKKyAgKiAgICAgICAgIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlcgorICAqICAgICAgICAgU1RNMzIgZmFtaWxpZXMgaGF2aW5nIHRoaXMgc2V0dGluZyBzZXQgYnkgSFcgZGVmYXVsdCB2YWx1ZSkuCisgICogICAgICAgICBJbiBjYXNlIG9mIG5lZWQgdG8gbW9kaWZ5IHRyaWdnZXIgZWRnZSwgdXNlCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlIG11c3QgYmUgc2V0CisgICogICAgICAgICBpbiBmdW5jdGlvbiBvZiBmcmVxdWVuY3kgb2YgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gCisgICogICAgICAgICBAcmVmIExMX0FEQ19TZXRUcmlnZ2VyRnJlcXVlbmN5TW9kZSgpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZVxuCisgICogICAgICAgICBDRkdSMSAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTZfVFJHTyAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMQorICAqCisgICogICAgICAgICAoMSkgT24gU1RNMzJHMCwgcGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgVHJpZ2dlclNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX0VYVEVOIHwgQURDX0NGR1IxX0VYVFNFTCwgVHJpZ2dlclNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6CisgICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXIgZXZlbnQsCisgICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICogQG5vdGUgICBUbyBkZXRlcm1pbmUgd2hldGhlciBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIGlzCisgICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGV4dGVybmFsLCB3aXRob3V0IGRldGFpbAorICAqICAgICAgICAgb2Ygd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgKGVxdWl2YWxlbnQgdG8gCisgICogICAgICAgICAiaWYoTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKEFEQzEpID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkiKQorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0LgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENGR1IxICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZVxuCisgICogICAgICAgICBDRkdSMSAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTyAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNM19UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08gICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08gICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEKKyAgKgorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UgPSBSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX0VYVFNFTCB8IEFEQ19DRkdSMV9FWFRFTik7CisgIAorICAvKiBWYWx1ZSBmb3Igc2hpZnQgb2YgezA7IDQ7IDg7IDEyfSBkZXBlbmRpbmcgb24gdmFsdWUgb2YgYml0ZmllbGQgICAgICAgICAgKi8KKyAgLyogY29ycmVzcG9uZGluZyB0byBBRENfQ0ZHUjFfRVhURU4gezA7IDE7IDI7IDN9LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIHVpbnQzMl90IFNoaWZ0RXh0ZW4gPSAoKFRyaWdnZXJTb3VyY2UgJiBBRENfQ0ZHUjFfRVhURU4pID4+IChBRENfUkVHX1RSSUdfRVhURU5fQklUT0ZGU0VUX1BPUyAtIDJVTCkpOworICAKKyAgLyogU2V0IGJpdGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gQURDX0NGR1IxX0VYVEVOIGFuZCBBRENfQ0ZHUjFfRVhUU0VMICAgICAgICovCisgIC8qIHRvIG1hdGNoIHdpdGggdHJpZ2dlcnMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKChUcmlnZ2VyU291cmNlCisgICAgICAgICAgICYgKEFEQ19SRUdfVFJJR19TT1VSQ0VfTUFTSyA+PiBTaGlmdEV4dGVuKSAmIEFEQ19DRkdSMV9FWFRTRUwpCisgICAgICAgICAgfCAoKEFEQ19SRUdfVFJJR19FREdFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUjFfRVhURU4pCisgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAgKiAgICAgICAgIG9yIGV4dGVybmFsLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZSgpLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgIjAiIGlmIHRyaWdnZXIgc291cmNlIGV4dGVybmFsIHRyaWdnZXIKKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0cmlnZ2VyIHNvdXJjZSBTVyBzdGFydC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhURU4pID09IChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUjFfRVhURU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAgKiBAbm90ZSAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRXh0ZXJuYWxUcmlnZ2VyRWRnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkdGQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJFZGdlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBFeHRlcm5hbFRyaWdnZXJFZGdlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRVhURU4sIEV4dGVybmFsVHJpZ2dlckVkZ2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuCisgICogQG5vdGUgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyRWRnZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFRyaWdnZXJFZGdlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMSwgQURDX0NGR1IxX0VYVEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBjb25maWd1cmF0aW9uIGZsZXhpYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMKKyAgKiAgICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiBhcmUKKyAgKiAgICAgICAgIGF2YWlsYWJsZToKKyAgKiAgICAgICAgIC0gc2VxdWVuY2VyIGNvbmZpZ3VyZWQgdG8gZnVsbHkgY29uZmlndXJhYmxlOgorICAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAgKiAgICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uCisgICogICAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiAgICAgICAgIC0gc2VxdWVuY2VyIGNvbmZpZ3VyZWQgdG8gbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIuCisgICogICAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uCisgICogICAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgQ0hTRUxSTU9EICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDb25maWd1cmFiaWxpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9GSVhFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0NPTkZJR1VSQUJMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENvbmZpZ3VyYWJpbGl0eSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX0NIU0VMUk1PRCwgQ29uZmlndXJhYmlsaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGNvbmZpZ3VyYXRpb24gZmxleGliaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgYm90aCBtb2RlcworICAqICAgICAgICAgImZ1bGx5IGNvbmZpZ3VyYWJsZSIgb3IgIm5vdCBmdWxseSBjb25maWd1cmFibGUiIGFyZQorICAqICAgICAgICAgYXZhaWxhYmxlOgorICAqICAgICAgICAgLSBzZXF1ZW5jZXIgY29uZmlndXJlZCB0byBmdWxseSBjb25maWd1cmFibGU6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgICBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwgYXJlIGNvbmZpZ3VyYWJsZS4KKyAgKiAgICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICAqICAgICAgICAgLSBzZXF1ZW5jZXIgY29uZmlndXJlZCB0byBub3QgZnVsbHkgY29uZmlndXJhYmxlOgorICAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgICogICAgICAgICAgIGFyZSBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiAgICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkuCisgICogQHJtdG9sbCBDRkdSICAgICBDSFNFTFJNT0QgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRklYRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9DT05GSUdVUkFCTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNvbmZpZ3VyYWJsZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9DSFNFTFJNT0QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZmVhdHVyZXM6CisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIuCisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIG5vdCBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIuCisgICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZSBpcworICAqICAgICAgICAgICAgIGRlZmluZWQgYnkgbnVtYmVyIG9mIGNoYW5uZWxzIHNldCBpbiB0aGUgc2VxdWVuY2UsCisgICogICAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIuCisgICogICAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSBsb3dlc3QgY2hhbm5lbCBudW1iZXIgdG8KKyAgKiAgICAgICAgICAgICBoaWdoZXN0IGNoYW5uZWwgbnVtYmVyKS4KKyAgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpIi4KKyAgKiAgICAgICAgICAgVG8gc2V0IHNjYW4gZGlyZWN0aW9uIGRpZmZlcmVudGx5LCByZWZlciB0byBmdW5jdGlvbgorICAqICAgICAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyU2NhbkRpcmVjdGlvbigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMKKyAgKiAgICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiAKKyAgKiAgICAgICAgIGFyZSBhdmFpbGFibGUsIHRoZXkgY2FuIGJlIGNob3NlbiB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgY2FsbGluZyBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKQorICAqICAgICAgICAgb3IgQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCksCisgICogICAgICAgICBpdCBpcyBtYW5kYXRvcnkgdG8gd2FpdCBmb3IgdGhlIGFzc2VydGlvbiBvZiBDQ1JEWSBmbGFnCisgICogICAgICAgICB1c2luZyBAcmVmIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQ0NSRFkoKS4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgcGVyZm9ybWluZyBzb21lIGFjdGlvbnMgKGNvbmZpZ3VyYXRpb24gdXBkYXRlLAorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQsIC4uLiApIHdpbGwgYmUgaWdub3JlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KKyAgKiBAbm90ZSAgIFNlcXVlbmNlciBkaXNhYmxlZCBpcyBlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6CisgICogICAgICAgICBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENIU0VMUiAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRMiAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRMyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNiAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNROCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2VxdWVuY2VyTmJSYW5rcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzhSQU5LUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MpCit7CisgIFNFVF9CSVQoQURDeC0+Q0hTRUxSLCBTZXF1ZW5jZXJOYlJhbmtzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZmVhdHVyZXM6CisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlczoKKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIi4KKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlci4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UgaXMKKyAgKiAgICAgICAgICAgICBkZWZpbmVkIGJ5IG51bWJlciBvZiBjaGFubmVscyBzZXQgaW4gdGhlIHNlcXVlbmNlLAorICAqICAgICAgICAgICAgIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyLgorICAqICAgICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gbG93ZXN0IGNoYW5uZWwgbnVtYmVyIHRvCisgICogICAgICAgICAgICAgaGlnaGVzdCBjaGFubmVsIG51bWJlcikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIuCisgICogICAgICAgICAgVG8gc2V0IHNjYW4gZGlyZWN0aW9uIGRpZmZlcmVudGx5LCByZWZlciB0byBmdW5jdGlvbgorICAqICAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJTY2FuRGlyZWN0aW9uKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgYm90aCBtb2RlcworICAqICAgICAgICAgImZ1bGx5IGNvbmZpZ3VyYWJsZSIgb3IgIm5vdCBmdWxseSBjb25maWd1cmFibGUiIAorICAqICAgICAgICAgYXJlIGF2YWlsYWJsZSwgdGhleSBjYW4gYmUgY2hvc2VuIHVzaW5nCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuCisgICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgICogQHJtdG9sbCBDSFNFTFIgICBTUTEgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTIgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTQgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTUgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTcgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aFxuCisgICogICAgICAgICBDSFNFTFIgICBTUTggICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgQ2hhbm5lbHNSYW5rcyA9IFJFQURfQklUKEFEQ3gtPkNIU0VMUiwgQURDX0NIU0VMUl9TUV9BTEwpOworICByZWdpc3RlciB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGggPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV84UkFOS1M7CisgIHJlZ2lzdGVyIHVpbnQzMl90IFJhbmtJbmRleDsKKyAgCisgIC8qIFBhcnNlIHJlZ2lzdGVyIGZvciBlbmQgb2Ygc2VxdWVuY2UgaWRlbnRpZmllciAqLworICBmb3IoUmFua0luZGV4ID0gMFVMOyBSYW5rSW5kZXggPCAoMzJVIC0gNFUpOyBSYW5rSW5kZXgrPTRVKQorICB7CisgICAgaWYoKENoYW5uZWxzUmFua3MgJiAoQURDX0NIU0VMUl9TUTIgPDwgUmFua0luZGV4KSkgPT0gKEFEQ19DSFNFTFJfU1EyIDw8IFJhbmtJbmRleCkpCisgICAgeworICAgICAgU2VxdWVuY2VyTGVuZ3RoID0gKEFEQ19DSFNFTFJfU1EyIDw8IFJhbmtJbmRleCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBTZXF1ZW5jZXJMZW5ndGg7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBzY2FuIGRpcmVjdGlvbi4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHBhcmFtZXRlciByZWxldmFudCBvbmx5IGlzIHNlcXVlbmNlciBpcyBzZXQKKyAgKiAgICAgICAgIHRvIG1vZGUgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKS4KKyAgKiBAbm90ZSAgIE9uIHNvbWUgb3RoZXIgU1RNMzIgZmFtaWxpZXMsIHRoaXMgc2V0dGluZyBpcyBub3QgYXZhaWxhYmxlIGFuZAorICAqICAgICAgICAgdGhlIGRlZmF1bHQgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIFNDQU5ESVIgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyU2NhbkRpcmVjdGlvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNjYW5EaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJUl9GT1JXQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVJfQkFDS1dBUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyU2NhbkRpcmVjdGlvbihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2NhbkRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMSwgQURDX0NGR1IxX1NDQU5ESVIsIFNjYW5EaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBwYXJhbWV0ZXIgcmVsZXZhbnQgb25seSBpcyBzZXF1ZW5jZXIgaXMgc2V0CisgICogICAgICAgICB0byBtb2RlIG5vdCBmdWxseSBjb25maWd1cmFibGUsCisgICogICAgICAgICByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuCisgICogQG5vdGUgICBPbiBzb21lIG90aGVyIFNUTTMyIGZhbWlsaWVzLCB0aGlzIHNldHRpbmcgaXMgbm90IGF2YWlsYWJsZSBhbmQKKyAgKiAgICAgICAgIHRoZSBkZWZhdWx0IHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQuCisgICogQHJtdG9sbCBDRkdSMSAgICBTQ0FORElSICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclNjYW5EaXJlY3Rpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElSX0ZPUldBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJUl9CQUNLV0FSRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyU2NhbkRpcmVjdGlvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9TQ0FORElSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6CisgICogICAgICAgICBzZXF1ZW5jZSBzdWJkaXZpZGVkIGFuZCBzY2FuIGNvbnZlcnNpb25zIGludGVycnVwdGVkIGV2ZXJ5IHNlbGVjdGVkCisgICogICAgICAgICBudW1iZXIgb2YgcmFua3MuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgCisgICogICAgICAgICBjb250aW51b3VzIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBDRkdSMSAgICBESVNDRU4gICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnRcbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlcURpc2NvbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcURpc2NvbnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9ESVNDRU4sIFNlcURpc2NvbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRElTQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgc2NhbiBzZXF1ZW5jZSByYW5rLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICAqICAgICAgICAgLSBDaGFubmVscyBvcmRlcmluZyBpbnRvIGVhY2ggcmFuayBvZiBzY2FuIHNlcXVlbmNlOgorICAqICAgICAgICAgICB3aGF0ZXZlciBjaGFubmVsIGNhbiBiZSBwbGFjZWQgaW50byB3aGF0ZXZlciByYW5rLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGlzCisgICogICAgICAgICBmdWxseSBjb25maWd1cmFibGU6IHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuaworICAqICAgICAgICAgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgY2FsbGluZyBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKQorICAqICAgICAgICAgb3IgQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCksCisgICogICAgICAgICBpdCBpcyBtYW5kYXRvcnkgdG8gd2FpdCBmb3IgdGhlIGFzc2VydGlvbiBvZiBDQ1JEWSBmbGFnCisgICogICAgICAgICB1c2luZyBAcmVmIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQ0NSRFkoKS4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgcGVyZm9ybWluZyBzb21lIGFjdGlvbnMgKGNvbmZpZ3VyYXRpb24gdXBkYXRlLAorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQsIC4uLiApIHdpbGwgYmUgaWdub3JlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENIU0VMUiAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1EyICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBDSFNFTFIgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1E1ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBDSFNFTFIgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1E4ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184CisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJHMCwgcGFyYW1ldGVyIGNhbiBiZSBzZXQgaW4gQURDIGdyb3VwIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIG9ubHkgaWYgc2VxdWVuY2VyIGlzIHNldCBpbiBtb2RlICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiwKKyAgKiAgICAgICAgICAgICByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJDaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgICAgICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiUmFuayIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmsiIGFuZCAiQ2hhbm5lbCIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAqLworICAvKiBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DSFNFTFIsCisgICAgICAgICAgICAgQURDX0NIU0VMUl9TUTEgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSwKKyAgICAgICAgICAgICAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTS19TRVEpID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSA8PCAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkCisgICogICAgICAgICBzY2FuIHNlcXVlbmNlIHJhbmsuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgaXMKKyAgKiAgICAgICAgIGZ1bGx5IGNvbmZpZ3VyYWJsZTogc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rCisgICogICAgICAgICBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwgYXJlIGNvbmZpZ3VyYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIFVzYWdlIG9mIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlcjoKKyAgKiAgICAgICAgIC0gVG8gcmVpbmplY3QgdGhpcyBjaGFubmVsIGludG8gYW5vdGhlciBmdW5jdGlvbiBMTF9BRENfeHh4OgorICAqICAgICAgICAgICB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXIgaXMgb25seSBwYXJ0bHkgZm9ybWF0dGVkIG9uIGRlZmluaXRpb24KKyAgKiAgICAgICAgICAgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeC4gVGhlcmVmb3JlLCBpdCBoYXMgdG8gYmUgY29tcGFyZWQKKyAgKiAgICAgICAgICAgd2l0aCBwYXJ0cyBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94IG9yIHVzaW5nCisgICogICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqICAgICAgICAgICBUaGVuIHRoZSBzZWxlY3RlZCBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggY2FuIGJlIHVzZWQKKyAgKiAgICAgICAgICAgYXMgcGFyYW1ldGVyIGZvciBhbm90aGVyIGZ1bmN0aW9uLgorICAqICAgICAgICAgLSBUbyBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0OgorICAqICAgICAgICAgICBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIHRoZSBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgICAgQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiBAcm10b2xsIENIU0VMUiAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1EyICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBDSFNFTFIgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1E1ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBDSFNFTFIgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgQ0hTRUxSICAgU1E4ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICgyKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgKDIpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAoMikKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLlxuCisgICogICAgICAgICAoMikgRm9yIEFEQyBjaGFubmVsIHJlYWQgYmFjayBmcm9tIEFEQyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgICBjb21wYXJpc29uIHdpdGggaW50ZXJuYWwgY2hhbm5lbCBwYXJhbWV0ZXIgdG8gYmUgZG9uZQorICAqICAgICAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYW5rKQoreworICByZXR1cm4gKHVpbnQzMl90KSAoKFJFQURfQklUKEFEQ3gtPkNIU0VMUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0hTRUxSX1NRMSA8PCAoUmFuayAmIEFEQ19SRUdfUkFOS19JRF9TUVJYX01BU0spKQorICAgICAgICAgICAgICAgICAgICAgID4+IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICkgPDwgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKQorICAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiByYW5rIGNvcnJlc3BvbmRpbmcgdG8KKyAgKiAgICAgICAgIGNoYW5uZWwgbnVtYmVyLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtczoKKyAgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIKKyAgKiAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiAgICAgICAgIC0gU2V0IGNoYW5uZWxzIHNlbGVjdGVkIGJ5IG92ZXJ3cml0aW5nIHRoZSBjdXJyZW50IHNlcXVlbmNlcgorICAqICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMKKyAgKiAgICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiAKKyAgKiAgICAgICAgIGFyZSBhdmFpbGFibGUsIHRoZXkgY2FuIGJlIGNob3NlbiB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoIHNldHRpbmcgIm5vdCBmdWxseSBjb25maWd1cmFibGUiLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKQorICAqICAgICAgICAgYW5kIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsCisgICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlCisgICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIENIU0VMUiAgIENIU0VMMCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDIgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMyAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw0ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDUgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw3ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDggICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDExICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTIgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE0ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTUgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNiAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE3ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTggICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBXUklURV9SRUcoQURDeC0+Q0hTRUxSLCAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBBZGQgY2hhbm5lbCB0byBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiByYW5rIGNvcnJlc3BvbmRpbmcgdG8KKyAgKiAgICAgICAgIGNoYW5uZWwgbnVtYmVyLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtczoKKyAgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIKKyAgKiAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiAgICAgICAgIC0gU2V0IGNoYW5uZWxzIHNlbGVjdGVkIGJ5IGFkZGluZyB0aGVtIHRvIHRoZSBjdXJyZW50IHNlcXVlbmNlcgorICAqICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMKKyAgKiAgICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiAKKyAgKiAgICAgICAgIGFyZSBhdmFpbGFibGUsIHRoZXkgY2FuIGJlIGNob3NlbiB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoIHNldHRpbmcgIm5vdCBmdWxseSBjb25maWd1cmFibGUiLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKQorICAqICAgICAgICAgYW5kIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsCisgICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlCisgICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIENIU0VMUiAgIENIU0VMMCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDIgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMyAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw0ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDUgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw3ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDggICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDExICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTIgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE0ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTUgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGRcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNiAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZFxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE3ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoQWRkXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTggICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hBZGQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTRVRfQklUKEFEQ3gtPkNIU0VMUiwgKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVtb3ZlIGNoYW5uZWwgdG8gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gcmFuayBjb3JyZXNwb25kaW5nIHRvCisgICogICAgICAgICBjaGFubmVsIG51bWJlci4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXM6CisgICogICAgICAgICAtIENoYW5uZWxzIG9yZGVyaW5nIGludG8gZWFjaCByYW5rIG9mIHNjYW4gc2VxdWVuY2U6CisgICogICAgICAgICAgIHJhbmsgb2YgZWFjaCBjaGFubmVsIGlzIGZpeGVkIGJ5IGNoYW5uZWwgSFcgbnVtYmVyCisgICogICAgICAgICAgIChjaGFubmVsIDAgZml4ZWQgb24gcmFuayAwLCBjaGFubmVsIDEgZml4ZWQgb24gcmFuazEsIC4uLikuCisgICogICAgICAgICAtIFNldCBjaGFubmVscyBzZWxlY3RlZCBieSByZW1vdmluZyB0aGVtIHRvIHRoZSBjdXJyZW50IHNlcXVlbmNlcgorICAqICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGJvdGggbW9kZXMKKyAgKiAgICAgICAgICJmdWxseSBjb25maWd1cmFibGUiIG9yICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiAKKyAgKiAgICAgICAgIGFyZSBhdmFpbGFibGUsIHRoZXkgY2FuIGJlIGNob3NlbiB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoIHNldHRpbmcgIm5vdCBmdWxseSBjb25maWd1cmFibGUiLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKQorICAqICAgICAgICAgYW5kIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4KKyAgKiBAbm90ZSAgIERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBwYWNrYWdlcywgc29tZSBjaGFubmVscyBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRvIG1lYXN1cmUgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsCisgICogICAgICAgICBUZW1wU2Vuc29yLCAuLi4pLCBtZWFzdXJlbWVudCBwYXRocyB0byBpbnRlcm5hbCBjaGFubmVscyBtdXN0IGJlCisgICogICAgICAgICBlbmFibGVkIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIENIU0VMUiAgIENIU0VMMCAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDIgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMyAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw0ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDUgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNiAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw3ICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDggICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOSAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMCAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDExICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTIgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE0ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTUgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW1cbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNiAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbVxuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE3ICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoUmVtXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTggICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hSZW0KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBDTEVBUl9CSVQoQURDeC0+Q0hTRUxSLCAoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2U6IGNoYW5uZWwgb24gcmFuayBjb3JyZXNwb25kaW5nIHRvCisgICogICAgICAgICBjaGFubmVsIG51bWJlci4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXM6CisgICogICAgICAgICAtIENoYW5uZWxzIG9yZGVyIHJlYWRpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgcmFuayBvZiBlYWNoIGNoYW5uZWwgaXMgZml4ZWQgYnkgY2hhbm5lbCBIVyBudW1iZXIKKyAgKiAgICAgICAgICAgKGNoYW5uZWwgMCBmaXhlZCBvbiByYW5rIDAsIGNoYW5uZWwgMSBmaXhlZCBvbiByYW5rMSwgLi4uKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBib3RoIG1vZGVzCisgICogICAgICAgICAiZnVsbHkgY29uZmlndXJhYmxlIiBvciAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIgCisgICogICAgICAgICBhcmUgYXZhaWxhYmxlLCB0aGV5IGNhbiBiZSBjaG9zZW4gdXNpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKS4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2l0aCBzZXR0aW5nICJub3QgZnVsbHkgY29uZmlndXJhYmxlIi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkKKyAgKiAgICAgICAgIGFuZCBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyTGVuZ3RoKCkuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgT25lIG9yIHNldmVyYWwgdmFsdWVzIGNhbiBiZSByZXRyaWV2ZWQuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX0NIQU5ORUxfNCB8IExMX0FEQ19DSEFOTkVMXzEyIHwgLi4uKQorICAqIEBybXRvbGwgQ0hTRUxSICAgQ0hTRUwwICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwzICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDQgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMNSAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw2ICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDcgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMOCAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUw5ICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEwICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTEgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxMiAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDEzICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTQgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxNSAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVsc1xuCisgICogICAgICAgICBDSFNFTFIgICBDSFNFTDE2ICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckNoYW5uZWxzXG4KKyAgKiAgICAgICAgIENIU0VMUiAgIENIU0VMMTcgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0hTRUxSICAgQ0hTRUwxOCAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDaGFubmVscworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIFNUTTMyRzAsIHBhcmFtZXRlciBjYW4gYmUgc2V0IGluIEFEQyBncm91cCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBvbmx5IGlmIHNlcXVlbmNlciBpcyBzZXQgaW4gbW9kZSAibm90IGZ1bGx5IGNvbmZpZ3VyYWJsZSIsCisgICogICAgICAgICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckNvbmZpZ3VyYWJsZSgpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyQ2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IENoYW5uZWxzQml0ZmllbGQgPSAodWludDMyX3QpUkVBRF9CSVQoQURDeC0+Q0hTRUxSLCBBRENfQ0hTRUxSX0NIU0VMKTsKKyAgCisgIHJldHVybiAoICAgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwwKSA+PiBBRENfQ0hTRUxSX0NIU0VMMF9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzApCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxKSA+PiBBRENfQ0hTRUxSX0NIU0VMMV9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzEpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwyKSA+PiBBRENfQ0hTRUxSX0NIU0VMMl9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzIpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwzKSA+PiBBRENfQ0hTRUxSX0NIU0VMM19CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzMpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw0KSA+PiBBRENfQ0hTRUxSX0NIU0VMNF9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzQpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw1KSA+PiBBRENfQ0hTRUxSX0NIU0VMNV9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzUpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw2KSA+PiBBRENfQ0hTRUxSX0NIU0VMNl9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzYpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw3KSA+PiBBRENfQ0hTRUxSX0NIU0VMN19CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzcpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw4KSA+PiBBRENfQ0hTRUxSX0NIU0VMOF9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzgpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUw5KSA+PiBBRENfQ0hTRUxSX0NIU0VMOV9CSVRPRkZTRVRfUE9TKSAqIExMX0FEQ19DSEFOTkVMXzkpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxMCkgPj4gQURDX0NIU0VMUl9DSFNFTDEwX0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTApCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxMSkgPj4gQURDX0NIU0VMUl9DSFNFTDExX0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTEpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxMikgPj4gQURDX0NIU0VMUl9DSFNFTDEyX0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTIpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxMykgPj4gQURDX0NIU0VMUl9DSFNFTDEzX0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTMpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxNCkgPj4gQURDX0NIU0VMUl9DSFNFTDE0X0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTQpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxNSkgPj4gQURDX0NIU0VMUl9DSFNFTDE1X0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTUpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxNikgPj4gQURDX0NIU0VMUl9DSFNFTDE2X0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTYpCisgICAgICAgICAgIHwgKCgoQ2hhbm5lbHNCaXRmaWVsZCAmIEFEQ19DSFNFTFJfQ0hTRUwxNykgPj4gQURDX0NIU0VMUl9DSFNFTDE3X0JJVE9GRlNFVF9QT1MpICogTExfQURDX0NIQU5ORUxfMTcpCisjaWYgZGVmaW5lZChBRENfQ0NSX1ZCQVRFTikKKyAgICAgICAgICAgfCAoKChDaGFubmVsc0JpdGZpZWxkICYgQURDX0NIU0VMUl9DSFNFTDE4KSA+PiBBRENfQ0hTRUxSX0NIU0VMMThfQklUT0ZGU0VUX1BPUykgKiBMTF9BRENfQ0hBTk5FTF8xOCkKKyNlbmRpZgorICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICAqICAgICAgICAgLSBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nCisgICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIAorICAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgQ09OVCAgICAgICAgICAgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbnRpbnVvdXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENvbnRpbnVvdXMpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9DT05ULCBDb250aW51b3VzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlOgorICAqICAgICAgICAgLSBzaW5nbGUgbW9kZTogb25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlOiBhZnRlciB0aGUgZmlyc3QgdHJpZ2dlciwgZm9sbG93aW5nCisgICogICAgICAgICAgIGNvbnZlcnNpb25zIGxhdW5jaGVkIHN1Y2Nlc3NpdmVseSBhdXRvbWF0aWNhbGx5LgorICAqIEBybXRvbGwgQ0ZHUjEgICAgQ09OVCAgICAgICAgICAgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX1NJTkdMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRDb250aW51b3VzTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9DT05UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IKKyAgKiAgICAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlLgorICAqIEBub3RlICAgSWYgdHJhbnNmZXIgYnkgRE1BIHNlbGVjdGVkLCBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0cworICAqICAgICAgICAgbW9kZToKKyAgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgICogICAgICAgICAgIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAgKiBAbm90ZSAgIElmIEFEQyBETUEgcmVxdWVzdHMgbW9kZSBpcyBzZXQgdG8gdW5saW1pdGVkIGFuZCBETUEgaXMgc2V0IHRvCisgICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBkYXRhIEFEQyB3aWxsIHJhaXNlIGFuIG92ZXJydW4gZXJyb3IKKyAgKiAgICAgICAgKG92ZXJydW4gZmxhZyBhbmQgaW50ZXJydXB0aW9uIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRE1BRU4gICAgICAgICAgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlclxuCisgICogICAgICAgICBDRkdSMSAgICBETUFDRkcgICAgICAgICBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRE1BVHJhbnNmZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgRE1BVHJhbnNmZXIpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9ETUFFTiB8IEFEQ19DRkdSMV9ETUFDRkcsIERNQVRyYW5zZmVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvcgorICAqICAgICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUuCisgICogQG5vdGUgICBJZiB0cmFuc2ZlciBieSBETUEgc2VsZWN0ZWQsIHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3RzCisgICogICAgICAgICBtb2RlOgorICAqICAgICAgICAgLSBMaW1pdGVkIG1vZGUgKE9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQKKyAgKiAgICAgICAgICAgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuCisgICogICAgICAgICAtIFVubGltaXRlZCBtb2RlOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHVubGltaXRlZCwKKyAgKiAgICAgICAgICAgd2hhdGV2ZXIgbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIGNpcmN1bGFyLgorICAqIEBub3RlICAgSWYgQURDIERNQSByZXF1ZXN0cyBtb2RlIGlzIHNldCB0byB1bmxpbWl0ZWQgYW5kIERNQSBpcyBzZXQgdG8KKyAgKiAgICAgICAgIG1vZGUgbm9uLWNpcmN1bGFyOgorICAqICAgICAgICAgd2hlbiBETUEgdHJhbnNmZXJzIHNpemUgd2lsbCBiZSByZWFjaGVkLCBETUEgd2lsbCBzdG9wIHRyYW5zZmVycyBvZgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb25zIGRhdGEgQURDIHdpbGwgcmFpc2UgYW4gb3ZlcnJ1biBlcnJvcgorICAqICAgICAgICAgKG92ZXJydW4gZmxhZyBhbmQgaW50ZXJydXB0aW9uIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgRE1BRU4gICAgICAgICAgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlclxuCisgICogICAgICAgICBDRkdSMSAgICBETUFDRkcgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4gfCBBRENfQ0ZHUjFfRE1BQ0ZHKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjoKKyAgKiAgICAgICAgIGRhdGEgcHJlc2VydmVkIG9yIG92ZXJ3cml0dGVuLgorICAqIEBub3RlICAgQ29tcGF0aWJpbGl0eSB3aXRoIGRldmljZXMgd2l0aG91dCBmZWF0dXJlIG92ZXJydW46CisgICogICAgICAgICBvdGhlciBkZXZpY2VzIHdpdGhvdXQgdGhpcyBmZWF0dXJlIGhhdmUgYSBiZWhhdmlvcgorICAqICAgICAgICAgZXF1aXZhbGVudCB0byBkYXRhIG92ZXJ3cml0dGVuLgorICAqICAgICAgICAgVGhlIGRlZmF1bHQgc2V0dGluZyBvZiBvdmVycnVuIGlzIGRhdGEgcHJlc2VydmVkLgorICAqICAgICAgICAgVGhlcmVmb3JlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCBkZXZpY2VzLCBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIG92ZXJydW4gc2hvdWxkIGJlIHNldCB0byBkYXRhIG92ZXJ3cml0dGVuLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgT1ZSTU9EICAgICAgICAgTExfQURDX1JFR19TZXRPdmVycnVuCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3ZlcnJ1biBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRPdmVycnVuKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPdmVycnVuKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLCBBRENfQ0ZHUjFfT1ZSTU9ELCBPdmVycnVuKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOgorICAqICAgICAgICAgZGF0YSBwcmVzZXJ2ZWQgb3Igb3ZlcndyaXR0ZW4uCisgICogQHJtdG9sbCBDRkdSMSAgICBPVlJNT0QgICAgICAgICBMTF9BRENfUkVHX0dldE92ZXJydW4KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0T3ZlcnJ1bihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjEsIEFEQ19DRkdSMV9PVlJNT0QpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9DaGFubmVscyBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGNoYW5uZWxzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgc2FtcGxpbmcgdGltZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwKKyAgKiAgICAgICAgIFVuaXQ6IEFEQyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgICBPbiB0aGlzIGRldmljZSwgc2FtcGxpbmcgdGltZSBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgaW50ZXJuYWwgY2hhbm5lbCAoVnJlZkludCwgVGVtcFNlbnNvciwgLi4uKSB0byBiZQorICAqICAgICAgICAgY29udmVydGVkOgorICAqICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUKKyAgKiAgICAgICAgIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgIHNldHRpbmcpLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMgKHBhcmFtZXRlcnMgVFNfdnJlZmludCwKKyAgKiAgICAgICAgIFRTX3RlbXAsIC4uLikuCisgICogQG5vdGUgICBDb252ZXJzaW9uIHRpbWUgaXMgdGhlIGFkZGl0aW9uIG9mIHNhbXBsaW5nIHRpbWUgYW5kIHByb2Nlc3NpbmcgdGltZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIEFEQyBwcm9jZXNzaW5nIHRpbWUgb2YKKyAgKiAgICAgICAgIHRoaXMgU1RNMzIgc2VyaWUuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyBjb252ZXJzaW9uIG9mIGludGVybmFsIGNoYW5uZWwgKFZyZWZJbnQsCisgICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLiksIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlCisgICogICAgICAgICBpcyByZXF1aXJlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBTTVBSICAgICBTTVBTRUwwICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwyICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwzICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw0ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw1ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw2ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw3ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw4ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUw5ICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxMCAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxMSAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxMiAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxMyAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxNCAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxNSAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxNiAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxNyAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSICAgICBTTVBTRUwxOCAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJHMCwgcGFyYW1ldGVyIGNhbiBiZSBzZXQgaW4gQURDIGdyb3VwIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIG9ubHkgaWYgc2VxdWVuY2VyIGlzIHNldCBpbiBtb2RlICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiwKKyAgKiAgICAgICAgICAgICByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuCisgICogQHBhcmFtICBTYW1wbGluZ1RpbWVZIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTYW1wbGluZ1RpbWVZKQoreworICAvKiBQYXJhbWV0ZXIgIkNoYW5uZWwiIGlzIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlIGNvbnRhaW5pbmcgICAgICAgICAgICAgICAgKi8KKyAgLyogb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+U01QUiwKKyAgICAgICAgICAgICAoQ2hhbm5lbCA8PCBBRENfU01QUl9TTVBTRUwwX0JJVE9GRlNFVF9QT1MpLAorICAgICAgICAgICAgIChDaGFubmVsIDw8IEFEQ19TTVBSX1NNUFNFTDBfQklUT0ZGU0VUX1BPUykgJiAoU2FtcGxpbmdUaW1lWSAmIEFEQ19TQU1QTElOR19USU1FX0NIX01BU0spCisgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbAorICAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgZGV2aWNlLCBzYW1wbGluZyB0aW1lIGlzIG9uIGNoYW5uZWwgc2NvcGU6IGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBBREMgcHJvY2Vzc2luZyB0aW1lIG9mCisgICogICAgICAgICB0aGlzIFNUTTMyIHNlcmllLgorICAqIEBybXRvbGwgU01QUiAgICAgU01QU0VMMCAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMSAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMiAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMyAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMNCAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMNSAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMNiAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMNyAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMOCAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMOSAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTAgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTEgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTIgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTMgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTQgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTUgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTYgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTcgICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWVcbgorICAqICAgICAgICAgU01QUiAgICAgU01QU0VMMTggICAgICAgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2ICAgICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcgICAgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gU1RNMzJHMCwgcGFyYW1ldGVyIGNhbiBiZSBzZXQgaW4gQURDIGdyb3VwIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIG9ubHkgaWYgc2VxdWVuY2VyIGlzIHNldCBpbiBtb2RlICJub3QgZnVsbHkgY29uZmlndXJhYmxlIiwKKyAgKiAgICAgICAgICAgICByZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENoYW5uZWxTYW1wbGluZ1RpbWUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3Qgc21wciA9IFJFQURfUkVHKEFEQ3gtPlNNUFIpOworICAKKyAgLyogUmV0cmlldmUgc2FtcGxpbmcgdGltZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAgICAgICAgICAgICovCisgIC8qIGFuZCBzaGlmdCBpdCB0byBwb3NpdGlvbiAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyAgcmVnaXN0ZXIgdWludDMyX3Qgc21wX2NoYW5uZWxfcG9zYml0MCA9ICgoc21wciAmIEFEQ19TQU1QTElOR19USU1FX0NIX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gKCgoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICsgQURDX1NNUFJfU01QU0VMMF9CSVRPRkZTRVRfUE9TKSAmIDB4MUZVTCkpOworICAKKyAgLyogU2VsZWN0IHNhbXBsaW5nIHRpbWUgYml0ZmllbGQgZGVwZW5kaW5nIG9uIHNhbXBsaW5nIHRpbWUgYml0IHZhbHVlIDAgb3IgMS4gICovCisgIHJldHVybiggICh+KHNtcF9jaGFubmVsX3Bvc2JpdDApICogTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMSkKKyAgICAgICAgIHwgKHNtcF9jaGFubmVsX3Bvc2JpdDAgKiBMTF9BRENfU0FNUExJTkdUSU1FX0NPTU1PTl8yKSAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0FuYWxvZ1dhdGNoZG9nIENvbmZpZ3VyYXRpb24gb2YgQURDIHRyYW5zdmVyc2FsIHNjb3BlOiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsczoKKyAgKiAgICAgICAgIGEgc2luZ2xlIGNoYW5uZWwsIG11bHRpcGxlIGNoYW5uZWxzIG9yIGFsbCBjaGFubmVscywKKyAgKiAgICAgICAgIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgT25jZSBtb25pdG9yZWQgY2hhbm5lbHMgYXJlIHNlbGVjdGVkLCBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG5lZWQgdG8gZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvcgorICAqICAgICAgICAgd2l0aCBhbmFsb2cgd2F0Y2hkb2cgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBkZWZpbml0aW9uLAorICAqICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMKKyAgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOgorICAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4KKyAgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikKKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUjEgICAgQVdEMUNIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSMSAgICBBV0QxU0dMICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENGR1IxICAgIEFXRDFFTiAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQVdEMkNSICAgQVdEMkNIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBBV0QzQ1IgICBBV0QzQ0ggICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICAqIEBwYXJhbSAgQVdEQ2hhbm5lbEdyb3VwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFRworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSwgdWludDMyX3QgQVdEQ2hhbm5lbEdyb3VwKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RDaGFubmVsR3JvdXAiIHdpdGggYml0cyBwb3NpdGlvbiAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIgIkFXRHkiLiAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIkFXRENoYW5uZWxHcm91cCIgYW5kICJBV0R5IiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgICAgICAqLworICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZzsKKyAgCisgIGlmKEFXRHkgPT0gTExfQURDX0FXRDEpCisgIHsKKyAgICBwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+Q0ZHUjEsIDBVTCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPkFXRDJDUiwgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spKSA+PiAoQURDX0FXRF9DUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgKyAxVUwpKTsKKyAgfQorICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICAoQVdEeSAmIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSyksCisgICAgICAgICAgICAgQVdEQ2hhbm5lbEdyb3VwICYgQVdEeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmVkIGNoYW5uZWwuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIEFwcGxpY2FibGUgb25seSB3aGVuIHRoZSBhbmFsb2cgd2F0Y2hkb2cgaXMgc2V0IHRvIG1vbml0b3IKKyAgKiAgICAgICAgICAgb25lIGNoYW5uZWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqICAgICAgICAgLSBBV0QgZmxleGlibGUgKGluc3RhbmNlcyBBV0QyLCBBV0QzKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGZsZXhpYmxlIG9uIGNoYW5uZWxzIG1vbml0b3JlZCwgc2VsZWN0aW9uIGlzCisgICogICAgICAgICAgICAgY2hhbm5lbCB3aXNlLCBmcm9tIGZyb20gMSB0byBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgICAgU3BlY2lmaWNpdHkgb2YgdGhpcyBhbmFsb2cgd2F0Y2hkb2c6IE11bHRpcGxlIGNoYW5uZWxzIGNhbgorICAqICAgICAgICAgICAgIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZToKKyAgKiAgICAgICAgICAgICAoTExfQURDX0FXRF9DSEFOTkVMNF9SRUdfSU5KIHwgTExfQURDX0FXRF9DSEFOTkVMNV9SRUdfSU5KIHwgLi4uKQorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IG5vdCBzZWxlY3Rpb24gcG9zc2libGUgKG1vbml0b3Jpbmcgb24gYm90aAorICAqICAgICAgICAgICAgIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkuCisgICogICAgICAgICAgICAgQ2hhbm5lbHMgc2VsZWN0ZWQgYXJlIG1vbml0b3JlZCBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6CisgICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHX0lOSiAoZG8gbm90IHVzZSBwYXJhbWV0ZXJzCisgICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHIGFuZCBMTF9BRENfQVdEX0NIQU5ORUx4eF9JTkopCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IxICAgIEFXRDFDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUjEgICAgQVdEMVNHTCAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSMSAgICBBV0QxRU4gICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIEFXRDJDUiAgIEFXRDJDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQVdEM0NSICAgQVdEM0NIICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVscworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzICgxKQorICAqICAgICAgICAgCisgICogICAgICAgICAoMSkgT24gdGhpcyBBV0QgbnVtYmVyLCBtb25pdG9yZWQgY2hhbm5lbCBjYW4gYmUgcmV0cmlldmVkCisgICogICAgICAgICAgICAgaWYgb25seSAxIGNoYW5uZWwgaXMgcHJvZ3JhbW1lZCAob3Igbm9uZSBvciBhbGwgY2hhbm5lbHMpLgorICAqICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJldHJpZXZlIG1vbml0b3JlZCBjaGFubmVsIGlmCisgICogICAgICAgICAgICAgbXVsdGlwbGUgY2hhbm5lbHMgYXJlIHByb2dyYW1tZWQgc2ltdWx0YW5lb3VzbHkKKyAgKiAgICAgICAgICAgICBieSBiaXRmaWVsZC4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHkpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5DRkdSMSwgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKEFXRHkgJiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX01BU0spICogQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwpKTsKKyAgCisgIHJlZ2lzdGVyIHVpbnQzMl90IEFuYWxvZ1dETW9uaXRDaGFubmVscyA9IChSRUFEX0JJVCgqcHJlZywgQVdEeSkgJiBBV0R5ICYgQURDX0FXRF9DUl9BTExfQ0hBTk5FTF9NQVNLKTsKKyAgCisgIC8qIElmICJBbmFsb2dXRE1vbml0Q2hhbm5lbHMiID09IDAsIHRoZW4gdGhlIHNlbGVjdGVkIEFXRCBpcyBkaXNhYmxlZCAgICAgICAqLworICAvKiAocGFyYW1ldGVyIHZhbHVlIExMX0FEQ19BV0RfRElTQUJMRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRWxzZSwgdGhlIHNlbGVjdGVkIEFXRCBpcyBlbmFibGVkIGFuZCBpcyBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgICovCisgIC8qIG9yIGEgc2luZ2xlIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihBbmFsb2dXRE1vbml0Q2hhbm5lbHMgIT0gMFVMKQorICB7CisgICAgaWYoQVdEeSA9PSBMTF9BRENfQVdEMSkKKyAgICB7CisgICAgICBpZigoQW5hbG9nV0RNb25pdENoYW5uZWxzICYgQURDX0NGR1IxX0FXRDFTR0wpID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLworICAgICAgICBBbmFsb2dXRE1vbml0Q2hhbm5lbHMgPSAoKCAgQW5hbG9nV0RNb25pdENoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKH4oQURDX0NGR1IxX0FXRDFDSCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKEFuYWxvZ1dETW9uaXRDaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoQW5hbG9nV0RNb25pdENoYW5uZWxzID4+IEFEQ19DRkdSMV9BV0QxQ0hfUG9zKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKChBbmFsb2dXRE1vbml0Q2hhbm5lbHMgJiBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKSA9PSBBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLKQorICAgICAgeworICAgICAgICAvKiBBV0QgbW9uaXRvcmluZyBhIGdyb3VwIG9mIGNoYW5uZWxzICovCisgICAgICAgIEFuYWxvZ1dETW9uaXRDaGFubmVscyA9ICggIEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEFEQ19DRkdSMV9BV0QxRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgLyogQVdEIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAqLworICAgICAgICBBbmFsb2dXRE1vbml0Q2hhbm5lbHMgPSAoICBBbmFsb2dXRE1vbml0Q2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihBbmFsb2dXRE1vbml0Q2hhbm5lbHMpIDw8IEFEQ19DRkdSMV9BV0QxQ0hfUG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIEFuYWxvZ1dETW9uaXRDaGFubmVsczsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIHZhbHVlIG9mIGJvdGggdGhyZXNob2xkcworICAqICAgICAgICAgaGlnaCBhbmQgbG93LgorICAqIEBub3RlICAgSWYgdmFsdWUgb2Ygb25seSBvbmUgdGhyZXNob2xkIGhpZ2ggb3IgbG93IG11c3QgYmUgc2V0LAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcygpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgcmVzb2x1dGlvbiBkaWZmZXJlbnQgb2YgMTIgYml0cywKKyAgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0LgorICAqICAgICAgICAgVXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX1NFVF9USFJFU0hPTERfUkVTT0xVVElPTigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgYXJlIDIga2luZHMgb2YgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpbnN0YW5jZToKKyAgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikKKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOgorICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogQG5vdGUgICBJZiBBREMgb3ZlcnNhbXBsaW5nIGlzIGVuYWJsZWQsIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBhcmUKKyAgKiAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uCisgICogICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZCBzaGlmdCBhcHBsaWNhdGlvbik6CisgICogICAgICAgICBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cykuCisgICogICAgICAgICBFeGFtcGxlczoKKyAgKiAgICAgICAgIC0gT3ZlcnNhbXBsaW5nIHJhdGlvIGFuZCBzaGlmdCBzZWxlY3RlZCB0byBoYXZlIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiAgICAgICAgICAgb24gMTIgYml0cyAocmF0aW8gMTYgYW5kIHNoaWZ0IDQsIG9yIHJhdGlvIDMyIGFuZCBzaGlmdCA1LCAuLi4pOgorICAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbXVzdCBiZSBkaXZpZGVkIGJ5IDE2LgorICAqICAgICAgICAgLSBPdmVyc2FtcGxpbmcgcmF0aW8gYW5kIHNoaWZ0IHNlbGVjdGVkIHRvIGhhdmUgQURDIGNvbnZlcnNpb24gZGF0YQorICAqICAgICAgICAgICBvbiAxNCBiaXRzIChyYXRpbyAxNiBhbmQgc2hpZnQgMiwgb3IgcmF0aW8gMzIgYW5kIHNoaWZ0IDMsIC4uLik6CisgICogICAgICAgICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBtdXN0IGJlIGRpdmlkZWQgYnkgNC4KKyAgKiAgICAgICAgIC0gT3ZlcnNhbXBsaW5nIHJhdGlvIGFuZCBzaGlmdCBzZWxlY3RlZCB0byBoYXZlIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiAgICAgICAgICAgb24gMTYgYml0cyAocmF0aW8gMTYgYW5kIHNoaWZ0IG5vbmUsIG9yIHJhdGlvIDMyIGFuZCBzaGlmdCAxLCAuLi4pOgorICAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbWF0Y2ggZGlyZWN0bHkgdG8gQURDIGRhdGEgcmVnaXN0ZXIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGdyb3VwIHJlZ3VsYXIuCisgICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkTG93VmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSwgdWludDMyX3QgQVdEVGhyZXNob2xkTG93VmFsdWUpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkFXRFRocmVzaG9sZHh4eFZhbHVlIiB3aXRoIGJpdHMgICAgICAqLworICAvKiBwb3NpdGlvbiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAgICAgICAgKi8KKyAgLyogIkFXRHkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIkFXRHkiIGFuZCAiQVdEVGhyZXNob2xkeHh4VmFsdWUiIGFyZSB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSAqLworICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlRSMSwgKCgoQVdEeSAmIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLKSkgPj4gKEFEQ19BV0RfVFJYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TKSkgKyAoKEFEQ19BV0RfQ1IzX1JFR09GRlNFVCAmIEFXRHkpID4+IChBRENfQVdEX0NSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUyArIDFVTCkpKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSwKKyAgICAgICAgICAgICAoQVdEVGhyZXNob2xkSGlnaFZhbHVlIDw8IEFEQ19UUjFfSFQxX0JJVE9GRlNFVF9QT1MpIHwgQVdEVGhyZXNob2xkTG93VmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQKKyAgKiAgICAgICAgIGhpZ2ggb3IgbG93LgorICAqIEBub3RlICAgSWYgdmFsdWVzIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMKKyAgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOgorICAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4KKyAgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikKKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqIEBub3RlICAgSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlCisgICogICAgICAgICBpbXBhY3RlZDogdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbgorICAqICAgICAgICAgb3ZlcnNhbXBsaW5nIGZpbmFsIGNvbXB1dGF0aW9uIChhZnRlciByYXRpbyBhbmQgc2hpZnQgYXBwbGljYXRpb24pOgorICAqICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLgorICAqICAgICAgICAgRXhhbXBsZXM6CisgICogICAgICAgICAtIE92ZXJzYW1wbGluZyByYXRpbyBhbmQgc2hpZnQgc2VsZWN0ZWQgdG8gaGF2ZSBBREMgY29udmVyc2lvbiBkYXRhCisgICogICAgICAgICAgIG9uIDEyIGJpdHMgKHJhdGlvIDE2IGFuZCBzaGlmdCA0LCBvciByYXRpbyAzMiBhbmQgc2hpZnQgNSwgLi4uKToKKyAgKiAgICAgICAgICAgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIG11c3QgYmUgZGl2aWRlZCBieSAxNi4KKyAgKiAgICAgICAgIC0gT3ZlcnNhbXBsaW5nIHJhdGlvIGFuZCBzaGlmdCBzZWxlY3RlZCB0byBoYXZlIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiAgICAgICAgICAgb24gMTQgYml0cyAocmF0aW8gMTYgYW5kIHNoaWZ0IDIsIG9yIHJhdGlvIDMyIGFuZCBzaGlmdCAzLCAuLi4pOgorICAqICAgICAgICAgICBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgbXVzdCBiZSBkaXZpZGVkIGJ5IDQuCisgICogICAgICAgICAtIE92ZXJzYW1wbGluZyByYXRpbyBhbmQgc2hpZnQgc2VsZWN0ZWQgdG8gaGF2ZSBBREMgY29udmVyc2lvbiBkYXRhCisgICogICAgICAgICAgIG9uIDE2IGJpdHMgKHJhdGlvIDE2IGFuZCBzaGlmdCBub25lLCBvciByYXRpbyAzMiBhbmQgc2hpZnQgMSwgLi4uKToKKyAgKiAgICAgICAgICAgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIG1hdGNoIGRpcmVjdGx5IHRvIEFEQyBkYXRhIHJlZ2lzdGVyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgbm90IGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgY2FuIGJlIGRpc2FibGVkLCBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgSFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBIVDMgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgTFQyICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBMVDMgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkc0hpZ2hMb3cgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQVdEeSwgdWludDMyX3QgQVdEVGhyZXNob2xkc0hpZ2hMb3csIHVpbnQzMl90IEFXRFRocmVzaG9sZFZhbHVlKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RUaHJlc2hvbGRWYWx1ZSIgd2l0aCBiaXRzICAgICAgICAgKi8KKyAgLyogcG9zaXRpb24gaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXJzICAgICAgICovCisgIC8qICJBV0RUaHJlc2hvbGRzSGlnaExvdyIgYW5kICJBV0R5Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJBV0R5IiBhbmQgIkFXRFRocmVzaG9sZFZhbHVlIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgICAgKi8KKyAgLyogY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5UUjEsICgoKEFXRHkgJiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSykpID4+IChBRENfQVdEX1RSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykpICsgKChBRENfQVdEX0NSM19SRUdPRkZTRVQgJiBBV0R5KSA+PiAoQURDX0FXRF9DUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgKyAxVUwpKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFXRFRocmVzaG9sZHNIaWdoTG93LAorICAgICAgICAgICAgIEFXRFRocmVzaG9sZFZhbHVlIDw8ICgoQVdEVGhyZXNob2xkc0hpZ2hMb3cgJiBBRENfQVdEX1RSWF9CSVRfSElHSF9NQVNLKSA+PiBBRENfQVdEX1RSWF9CSVRfSElHSF9TSElGVDQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgdmFsdWUgb2YgdGhyZXNob2xkIGhpZ2gsCisgICogICAgICAgICB0aHJlc2hvbGQgbG93IG9yIHJhdyBkYXRhIHdpdGggQURDIHRocmVzaG9sZHMgaGlnaCBhbmQgbG93CisgICogICAgICAgICBjb25jYXRlbmF0ZWQuCisgICogQG5vdGUgICBJZiByYXcgZGF0YSB3aXRoIEFEQyB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdyBpcyByZXRyaWV2ZWQsCisgICogICAgICAgICB0aGUgZGF0YSBvZiBlYWNoIHRocmVzaG9sZCBoaWdoIG9yIGxvdyBjYW4gYmUgaXNvbGF0ZWQKKyAgKiAgICAgICAgIHVzaW5nIGhlbHBlciBtYWNybzoKKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfQU5BTE9HV0RfVEhSRVNIT0xEU19ISUdIX0xPVygpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBBREMgcmVzb2x1dGlvbiBkaWZmZXJlbnQgb2YgMTIgYml0cywKKyAgKiAgICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGRhdGEgcmVxdWlyZSBhIHNwZWNpZmljIHNoaWZ0LgorICAqICAgICAgICAgVXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX0dFVF9USFJFU0hPTERfUkVTT0xVVElPTigpLgorICAqIEBybXRvbGwgVFIxICAgICAgSFQxICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjIgICAgICBIVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMyAgICAgIEhUMyAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIxICAgICAgTFQxICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjIgICAgICBMVDIgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMyAgICAgIExUMyAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QzCisgICogQHBhcmFtICBBV0RUaHJlc2hvbGRzSGlnaExvdyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRFNfSElHSF9MT1cKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93KQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJBV0RUaHJlc2hvbGRWYWx1ZSIgd2l0aCBiaXRzICAgICAgICAgKi8KKyAgLyogcG9zaXRpb24gaW4gcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXJzICAgICAgICovCisgIC8qICJBV0RUaHJlc2hvbGRzSGlnaExvdyIgYW5kICJBV0R5Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzICJBV0R5IiBhbmQgIkFXRFRocmVzaG9sZFZhbHVlIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgICAgKi8KKyAgLyogY29udGFpbmluZyBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBvdGhlciBwdXJwb3NlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5UUjEsICgoKEFXRHkgJiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSykpID4+IChBRENfQVdEX1RSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykpICsgKChBRENfQVdEX0NSM19SRUdPRkZTRVQgJiBBV0R5KSA+PiAoQURDX0FXRF9DUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgKyAxVUwpKSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgqcHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFXRFRocmVzaG9sZHNIaWdoTG93IHwgQURDX1RSMV9MVDEpKQorICAgICAgICAgICAgICAgICAgICA+PiAoKChBV0RUaHJlc2hvbGRzSGlnaExvdyAmIEFEQ19BV0RfVFJYX0JJVF9ISUdIX01BU0spID4+IEFEQ19BV0RfVFJYX0JJVF9ISUdIX1NISUZUNCkgJiB+KEFXRFRocmVzaG9sZHNIaWdoTG93ICYgQURDX1RSMV9MVDEpKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX292ZXJzYW1wbGluZyBDb25maWd1cmF0aW9uIG9mIEFEQyB0cmFuc3ZlcnNhbCBzY29wZTogb3ZlcnNhbXBsaW5nCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIG92ZXJzYW1wbGluZyBzY29wZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IyICAgIE9WU0UgICAgICAgICAgIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdTY29wZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE92c1Njb3BlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdTY29wZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT3ZzU2NvcGUpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9PVlNFLCBPdnNTY29wZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgc2NvcGUuCisgICogQHJtdG9sbCBDRkdSMiAgICBPVlNFICAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2NvcGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgKHRyaWdnZXJlZCBtb2RlKQorICAqICAgICAgICAgb24gdGhlIHNlbGVjdGVkIEFEQyBncm91cC4KKyAgKiBAbm90ZSAgIE51bWJlciBvZiBvdmVyc2FtcGxlZCBjb252ZXJzaW9ucyBhcmUgZG9uZSBlaXRoZXIgaW46CisgICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbworICAqICAgICAgICAgICBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikKKyAgKiAgICAgICAgIC0gZGlzY29udGludW91cyBtb2RlIChlYWNoIGNvbnZlcnNpb24gb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgICogICAgICAgICAgIG5lZWRzIGEgdHJpZ2dlcikKKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IyICAgIFRPVlMgICAgICAgICAgIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdEaXNjb250CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nRGlzY29udCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0NPTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JFR19ESVNDT05UCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T3ZlclNhbXBsaW5nRGlzY29udChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT3ZlclNhbXBsaW5nRGlzY29udCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgQURDX0NGR1IyX1RPVlMsIE92ZXJTYW1wbGluZ0Rpc2NvbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgb3ZlcnNhbXBsaW5nIGRpc2NvbnRpbnVvdXMgbW9kZSAodHJpZ2dlcmVkIG1vZGUpCisgICogICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgQURDIGdyb3VwLgorICAqIEBub3RlICAgTnVtYmVyIG9mIG92ZXJzYW1wbGVkIGNvbnZlcnNpb25zIGFyZSBkb25lIGVpdGhlciBpbjoKKyAgKiAgICAgICAgIC0gY29udGludW91cyBtb2RlIChhbGwgY29udmVyc2lvbnMgb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgICogICAgICAgICAgIGFyZSBkb25lIGZyb20gMSB0cmlnZ2VyKQorICAqICAgICAgICAgLSBkaXNjb250aW51b3VzIG1vZGUgKGVhY2ggY29udmVyc2lvbiBvZiBvdmVyc2FtcGxpbmcgcmF0aW8KKyAgKiAgICAgICAgICAgbmVlZHMgYSB0cmlnZ2VyKQorICAqIEBybXRvbGwgQ0ZHUjIgICAgVE9WUyAgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ0Rpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0NPTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JFR19ESVNDT05UCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ0Rpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfVE9WUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgMiBpdGVtcyBvZiBvdmVyc2FtcGxpbmcgY29uZmlndXJhdGlvbjoKKyAgKiAgICAgICAgIC0gcmF0aW8KKyAgKiAgICAgICAgIC0gc2hpZnQKKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IyICAgIE9WU1MgICAgICAgICAgIExMX0FEQ19Db25maWdPdmVyU2FtcGxpbmdSYXRpb1NoaWZ0XG4KKyAgKiAgICAgICAgIENGR1IyICAgIE9WU1IgICAgICAgICAgIExMX0FEQ19Db25maWdPdmVyU2FtcGxpbmdSYXRpb1NoaWZ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmF0aW8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMjU2CisgICogQHBhcmFtICBTaGlmdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NvbmZpZ092ZXJTYW1wbGluZ1JhdGlvU2hpZnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhdGlvLCB1aW50MzJfdCBTaGlmdCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwgKEFEQ19DRkdSMl9PVlNTIHwgQURDX0NGR1IyX09WU1IpLCAoU2hpZnQgfCBSYXRpbykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvCisgICogQHJtdG9sbCBDRkdSMiAgICBPVlNSICAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nUmF0aW8KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSYXRpbyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT182NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yNTYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1JhdGlvKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU1IpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBzaGlmdAorICAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU2hpZnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU1MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19JbnN0YW5jZSBPcGVyYXRpb24gb24gQURDIGhpZXJhcmNoaWNhbCBzY29wZTogQURDIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDIGluc3RhbmNlIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgYXJlIHRocmVlIHBvc3NpYmlsaXRpZXMgdG8gZW5hYmxlCisgICogICAgICAgICB0aGUgdm9sdGFnZSByZWd1bGF0b3I6CisgICogICAgICAgICAtIGJ5IGVuYWJsaW5nIGl0IG1hbnVhbGx5CisgICogICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX0VuYWJsZUludGVybmFsUmVndWxhdG9yKCkuCisgICogICAgICAgICAtIGJ5IGxhdW5jaGluZyBhIGNhbGlicmF0aW9uCisgICogICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAgKiAgICAgICAgIC0gYnkgZW5hYmxpbmcgdGhlIEFEQworICAqICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19FbmFibGUoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGFmdGVyIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBlbmFibGUsCisgICogICAgICAgICBhIGRlbGF5IGZvciBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3Igc3RhYmlsaXphdGlvbgorICAqICAgICAgICAgaXMgcmVxdWlyZWQgYmVmb3JlIHBlcmZvcm1pbmcgYSBBREMgY2FsaWJyYXRpb24gb3IgQURDIGVuYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidEFEQ1ZSRUdfU1RVUCIuCisgICogICAgICAgICBSZWZlciB0byBsaXRlcmFsIEByZWYgTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURWUkVHRU4gICAgICAgTExfQURDX0VuYWJsZUludGVybmFsUmVndWxhdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUludGVybmFsUmVndWxhdG9yKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFZSRUdFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURWUkVHRU4gICAgICAgTExfQURDX0Rpc2FibGVJbnRlcm5hbFJlZ3VsYXRvcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSW50ZXJuYWxSZWd1bGF0b3IoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9BRFZSRUdFTiB8IEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3Igc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfSXNJbnRlcm5hbFJlZ3VsYXRvckVuYWJsZWQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBpbnRlcm5hbCByZWd1bGF0b3IgaXMgZGlzYWJsZWQsIDE6IGludGVybmFsIHJlZ3VsYXRvciBpcyBlbmFibGVkLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFZSRUdFTikgPT0gKEFEQ19DUl9BRFZSRUdFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGFmdGVyIEFEQyBlbmFibGUsIGEgZGVsYXkgZm9yIAorICAqICAgICAgICAgQURDIGludGVybmFsIGFuYWxvZyBzdGFiaWxpemF0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBwZXJmb3JtaW5nIGEKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0LgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFCLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZCBhbmQgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBREVOICAgICAgICAgICBMTF9BRENfRW5hYmxlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfQURFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIG5vdCBkaXNhYmxlZC4gTXVzdCBiZSBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERElTICAgICAgICAgIExMX0FEQ19EaXNhYmxlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGUoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FERElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBlbmFibGUgc3RhdGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgICogQHJtdG9sbCBDUiAgICAgICBBREVOICAgICAgICAgICBMTF9BRENfSXNFbmFibGVkCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogQURDIGlzIGRpc2FibGVkLCAxOiBBREMgaXMgZW5hYmxlZC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FERU4pID09IChBRENfQ1JfQURFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBkaXNhYmxlIHN0YXRlLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURESVMgICAgICAgICAgTExfQURDX0lzRGlzYWJsZU9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FERElTKSA9PSAoQURDX0NSX0FERElTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAgKiAgICAgICAgIG9yIGRpZmZlcmVudGlhbCAoZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGUpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYSBtaW5pbXVtIG51bWJlciBvZiBBREMgY2xvY2sgY3ljbGVzCisgICogICAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9DQUxJQl9FTkFCTEVfQURDX0NZQ0xFUy4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgdXNhZ2Ugb2YgQURDIHdpdGggRE1BIHRyYW5zZmVyOgorICAqICAgICAgICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIERNQSB0cmFuc2ZlciByZXF1ZXN0IHNob3VsZCBiZSBkaXNhYmxlZAorICAqICAgICAgICAgZHVyaW5nIGNhbGlicmF0aW9uOgorICAqICAgICAgICAgQ2FsaWJyYXRpb24gZmFjdG9yIGlzIGF2YWlsYWJsZSBpbiBkYXRhIHJlZ2lzdGVyCisgICogICAgICAgICBhbmQgYWxzbyB0cmFuc2ZlcmVkIGJ5IERNQS4KKyAgKiAgICAgICAgIFRvIG5vdCBpbnNlcnQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBhbW9uZyBBREMgY29udmVyc2lvbiBkYXRhCisgICogICAgICAgICBpbiBhcnJheSB2YXJpYWJsZSwgRE1BIHRyYW5zZmVyIG11c3QgYmUgZGlzYWJsZWQgZHVyaW5nCisgICogICAgICAgICBjYWxpYnJhdGlvbi4KKyAgKiAgICAgICAgIChETUEgdHJhbnNmZXIgc2V0dGluZyBiYWNrdXAgYW5kIGRpc2FibGUgYmVmb3JlIGNhbGlicmF0aW9uLAorICAqICAgICAgICAgRE1BIHRyYW5zZmVyIHNldHRpbmcgcmVzdG9yZSBhZnRlciBjYWxpYnJhdGlvbi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBAcmVmIExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIoKSwKKyAgKiAgICAgICAgIEByZWYgTExfQURDX1JFR19TZXRETUFUcmFuc2ZlcigpICkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURDQUwgICAgICAgICAgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfQURDQUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY2FsaWJyYXRpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRENBTCAgICAgICAgICBMTF9BRENfSXNDYWxpYnJhdGlvbk9uR29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBjYWxpYnJhdGlvbiBjb21wbGV0ZSwgMTogY2FsaWJyYXRpb24gaW4gcHJvZ3Jlc3MuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQ2FsaWJyYXRpb25PbkdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEQ0FMKSA9PSAoQURDX0NSX0FEQ0FMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIgT3BlcmF0aW9uIG9uIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGdyb3VwIHJlZ3VsYXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoIAorICAqICAgICAgICAgaW50ZXJuYWwgdHJpZ2dlciAoU1cgc3RhcnQpIGFuZCBleHRlcm5hbCB0cmlnZ2VyOgorICAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gc29mdHdhcmUgc3RhcnQsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHdpbGwgc3RhcnQgYXQgbmV4dCB0cmlnZ2VyIGV2ZW50IChvbiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBlZGdlKQorICAqICAgICAgICAgICBmb2xsb3dpbmcgdGhlIEFEQyBzdGFydCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbiBzdG9wIGNvbW1hbmQgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TdGFydENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEU1RBUlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbi4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLAorICAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURTVFAgICAgICAgICAgTExfQURDX1JFR19TdG9wQ29udmVyc2lvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEU1RQKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RBUlQgICAgICAgIExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEU1RBUlQpID09IChBRENfQ1JfQURTVEFSVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3Agc3RhdGUKKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RQICAgICAgICAgIExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBpcyBvbiBnb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhci4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEU1RQKSA9PSAoQURDX0NSX0FEU1RQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIGFsbCBBREMgY29uZmlndXJhdGlvbnM6IGFsbCBBREMgcmVzb2x1dGlvbnMgYW5kCisgICogICAgICAgICBhbGwgb3ZlcnNhbXBsaW5nIGluY3JlYXNlZCBkYXRhIHdpZHRoIChmb3IgZGV2aWNlcworICAqICAgICAgICAgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZykuCisgICogQHJtdG9sbCBEUiAgICAgICBEQVRBICAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9EQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTIgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgREFUQSAgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9EQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTAgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgREFUQSAgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4M0ZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9EQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gOCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBEQVRBICAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhOChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX0RBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiA2IGJpdHMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcKKyAgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAgKiBAcm10b2xsIERSICAgICAgIERBVEEgICAgICAgICAgIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhNgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfREFUQSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgQURDIGZsYWcgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKSA9PSAoTExfQURDX0ZMQUdfQURSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWFkeS4KKyAgKiBAbm90ZSAgIER1cmF0aW9uIG9mIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHk6IENDUkRZIGhhbmRzaGFrZQorICAqICAgICAgICAgcmVxdWlyZXMgMUFQQiArIDIgQURDICsgMyBBUEIgY3ljbGVzIGFmdGVyIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQuCisgICogQHJtdG9sbCBJU1IgICAgICBDQ1JEWSAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0NDUkRZCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQ0NSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQ0NSRFkpID09IChMTF9BRENfRkxBR19DQ1JEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9DICAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgQURDX0lTUl9FT0MpID09IChBRENfSVNSX0VPQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBFT1MgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1MpID09IChMTF9BRENfRkxBR19FT1MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bi4KKyAgKiBAcm10b2xsIElTUiAgICAgIE9WUiAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX09WUikgPT0gKExMX0FEQ19GTEFHX09WUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UuCisgICogQHJtdG9sbCBJU1IgICAgICBFT1NNUCAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TTVApID09IChMTF9BRENfRkxBR19FT1NNUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgQVdEMSAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKSA9PSAoTExfQURDX0ZMQUdfQVdEMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDIuCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QyICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDIpID09IChMTF9BRENfRkxBR19BV0QyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDMgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMykgPT0gKExMX0FEQ19GTEFHX0FXRDMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPQ0FMICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DQUwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19FT0NBTChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT0NBTCkgPT0gKExMX0FEQ19GTEFHX0VPQ0FMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkuCisgICogQHJtdG9sbCBJU1IgICAgICBDQ1JEWSAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0NDUkRZCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19DQ1JEWShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQ0NSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPQyAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBFT1MgICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnJ1bi4KKyAgKiBAcm10b2xsIElTUiAgICAgIE9WUiAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19PVlIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX09WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UuCisgICogQHJtdG9sbCBJU1IgICAgICBFT1NNUCAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TTVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAxLgorICAqIEBybXRvbGwgSVNSICAgICAgQVdEMSAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDIgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDMuCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QzICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPQ0FMICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfRU9DQUwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPQ0FMKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT0NBTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgcmVhZHkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfRW5hYmxlSVRfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWFkeS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9DQ1JEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9DQ1JEWShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19GTEFHX0NDUkRZKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJRVIgICAgICBFT0NJRSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9TSUUgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDIGdyb3VwIHJlZ3VsYXIgaW50ZXJydXB0aW9uIG92ZXJydW4uCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9PVlIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9TTVBJRSAgICAgICAgTExfQURDX0VuYWJsZUlUX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDFJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDIuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQVdEMyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24uCisgICogQHJtdG9sbCBJRVIgICAgICBFT0NBTElFICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9DQUwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9DQUwoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DQUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyByZWFkeS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0NDUkRZCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9DQ1JEWShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0ZMQUdfQ0NSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJRVIgICAgICBFT0NJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0VPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuLgorICAqIEBybXRvbGwgSUVSICAgICAgT1ZSSUUgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9PVlIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9TTVBJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1NNUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QzKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGVuZCBvZiBjYWxpYnJhdGlvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0FMSUUgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9DQUwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZUlUX0VPQ0FMKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9DQUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIHJlYWR5CisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSkgPT0gKExMX0FEQ19JVF9BRFJEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQ0NSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0NDUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19GTEFHX0NDUkRZKSA9PSAoTExfQURDX0ZMQUdfQ0NSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBFT0NJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPQykgPT0gKExMX0FEQ19JVF9FT0MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TKSA9PSAoTExfQURDX0lUX0VPUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4KKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIE9WUklFICAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9PVlIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKSA9PSAoTExfQURDX0lUX09WUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZworICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9TTVBJRSAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TTVApID09IChMTF9BRENfSVRfRU9TTVApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDFJRSAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QxKSA9PSAoTExfQURDX0lUX0FXRDEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAyCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QySUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQVdEMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMikgPT0gKExMX0FEQ19JVF9BV0QyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMworICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDMpID09IChMTF9BRENfSVRfQVdEMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBlbmQgb2YgY2FsaWJyYXRpb24KKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0FMSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT0NBTAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9DQUwoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPQ0FMKSA9PSAoTExfQURDX0lUX0VPQ0FMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBhbmQgbXVsdGltb2RlICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKTsKK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpOworCisvKiBEZS1pbml0aWFsaXphdGlvbiBvZiBBREMgaW5zdGFuY2UgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlIGFuZCBBREMgZ3JvdXAgcmVndWxhciAqLworRXJyb3JTdGF0dXMgTExfQURDX1JFR19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBREMxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfQURDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfYnVzLmggYi9JbmMvc3RtMzJnMHh4X2xsX2J1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWU5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX2J1cy5oCkBAIC0wLDAgKzEsMTE2MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9idXMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQlVTIExMIG1vZHVsZS4KKworICBAdmVyYmF0aW0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSQ0MgTGltaXRhdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQSBkZWxheSBiZXR3ZWVuIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsZSBhbmQgdGhlIGVmZmVjdGl2ZSBwZXJpcGhlcmFsCisgICAgICBlbmFibGluZyBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgcGVyaXBoZXJhbCByZWFkL3dyaXRlCisgICAgICBmcm9tL3RvIHJlZ2lzdGVycy4KKyAgICAgICgrKSBUaGlzIGRlbGF5IGRlcGVuZHMgb24gdGhlIHBlcmlwaGVyYWwgbWFwcGluZy4KKyAgICAgICAgKCsrKSBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIDEgZHVtbXkgcmVhZCBpcyBuZWNlc3NhcnkKKworICAgIFsuLl0KKyAgICAgIFdvcmthcm91bmRzOgorICAgICAgKCMpIEZvciBBSEIgJiBBUEIgcGVyaXBoZXJhbHMsIGEgZHVtbXkgcmVhZCB0byB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciBoYXMgYmVlbgorICAgICAgICAgIGluc2VydGVkIGluIGVhY2ggTExfe0JVU31fR1JQe3h9X0VuYWJsZUNsb2NrKCkgZnVuY3Rpb24uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfQlVTX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX0JVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMIEJVUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBCVVMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCMV9HUlAxX1BFUklQSCAgQUhCMSBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgMHhGRkZGRkZGRlUKKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExICAgICAgICAgICBSQ0NfQUhCRU5SX0RNQTFFTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNIICAgICAgICAgIFJDQ19BSEJFTlJfRkxBU0hFTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0gICAgICAgICAgIFJDQ19BSEJTTUVOUl9TUkFNU01FTgorI2lmIGRlZmluZWQoQ1JDKQorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyAgICAgICAgICAgIFJDQ19BSEJFTlJfQ1JDRU4KKyNlbmRpZgorI2lmIGRlZmluZWQoQUVTKQorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSWVAgICAgICAgICAgIFJDQ19BSEJFTlJfQUVTRU4KKyNlbmRpZiAvKiBBRVMgKi8KKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgICAgICAgICAgICBSQ0NfQUhCRU5SX1JOR0VOCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMV9HUlAxX1BFUklQSCAgQVBCMSBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgMHhGRkZGRkZGRlUKKyNpZiBkZWZpbmVkKFRJTTIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMiAgICAgICAgICAgUkNDX0FQQkVOUjFfVElNMkVOCisjZW5kaWYgLyogVElNMiAqLworI2lmIGRlZmluZWQoVElNMykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zICAgICAgICAgICBSQ0NfQVBCRU5SMV9USU0zRU4KKyNlbmRpZiAvKiBUSU0zICovCisjaWYgZGVmaW5lZChUSU02KQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgICAgICAgICAgIFJDQ19BUEJFTlIxX1RJTTZFTgorI2VuZGlmIC8qIFRJTTYgKi8KKyNpZiBkZWZpbmVkKFRJTTcpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAgICAgICAgICAgUkNDX0FQQkVOUjFfVElNN0VOCisjZW5kaWYgLyogVElNNyAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQyAgICAgICAgICAgIFJDQ19BUEJFTlIxX1JUQ0FQQkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERyAgICAgICAgICAgUkNDX0FQQkVOUjFfV1dER0VOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAgICAgICAgICAgUkNDX0FQQkVOUjFfU1BJMkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyICAgICAgICAgUkNDX0FQQkVOUjFfVVNBUlQyRU4KKyNpZiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMgICAgICAgICBSQ0NfQVBCRU5SMV9VU0FSVDNFTgorI2VuZGlmCisjaWYgZGVmaW5lZChVU0FSVDQpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0ICAgICAgICAgUkNDX0FQQkVOUjFfVVNBUlQ0RU4KKyNlbmRpZiAvKiBVU0FSVDQgKi8KKyNpZiBkZWZpbmVkKExQVUFSVDEpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMSAgICAgICAgUkNDX0FQQkVOUjFfTFBVQVJUMUVOCisjZW5kaWYKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxICAgICAgICAgICBSQ0NfQVBCRU5SMV9JMkMxRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyICAgICAgICAgICBSQ0NfQVBCRU5SMV9JMkMyRU4KKyNpZiBkZWZpbmVkKENFQykKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgICAgICAgICAgICBSQ0NfQVBCRU5SMV9DRUNFTgorI2VuZGlmIC8qIENFQyAqLworI2lmIGRlZmluZWQoVUNQRDEpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDEgICAgICAgICAgUkNDX0FQQkVOUjFfVUNQRDFFTgorI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMikKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMiAgICAgICAgICBSQ0NfQVBCRU5SMV9VQ1BEMkVOCisjZW5kaWYKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9EQkdNQ1UgICAgICAgICBSQ0NfQVBCRU5SMV9EQkdFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUiAgICAgICAgICAgIFJDQ19BUEJFTlIxX1BXUkVOCisjaWYgZGVmaW5lZChEQUMxKQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgICAgICAgICAgIFJDQ19BUEJFTlIxX0RBQzFFTgorI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0yICAgICAgICAgUkNDX0FQQkVOUjFfTFBUSU0yRU4KKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0xKQorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSAgICAgICAgIFJDQ19BUEJFTlIxX0xQVElNMUVOCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjJfR1JQMV9QRVJJUEggIEFQQjIgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgIDB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHICAgICAgICAgUkNDX0FQQkVOUjJfU1lTQ0ZHRU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xICAgICAgICAgICBSQ0NfQVBCRU5SMl9USU0xRU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxICAgICAgICAgICBSQ0NfQVBCRU5SMl9TUEkxRU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEgICAgICAgICBSQ0NfQVBCRU5SMl9VU0FSVDFFTgorI2lmIGRlZmluZWQoVElNMTQpCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTQgICAgICAgICAgUkNDX0FQQkVOUjJfVElNMTRFTgorI2VuZGlmIC8qIFRJTTE0ICovCisjaWYgZGVmaW5lZChUSU0xNSkKKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSAgICAgICAgICBSQ0NfQVBCRU5SMl9USU0xNUVOCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTE2KQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2ICAgICAgICAgIFJDQ19BUEJFTlIyX1RJTTE2RU4KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNMTcpCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcgICAgICAgICAgUkNDX0FQQkVOUjJfVElNMTdFTgorI2VuZGlmIC8qIFRJTTE3ICovCisjaWYgZGVmaW5lZChBREMpCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDICAgICAgICAgICAgUkNDX0FQQkVOUjJfQURDRU4KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfSU9QX0dSUDFfUEVSSVBIICBJT1AgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JT1BfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgIDB4RkZGRkZGRkZVCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQSAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPQUVOCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQiAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPQkVOCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQyAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPQ0VOCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRCAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPREVOCisjaWYgZGVmaW5lZChHUElPRSkKKyNkZWZpbmUgTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9FICAgICAgICAgICBSQ0NfSU9QRU5SX0dQSU9FRU4KKyNlbmRpZiAvKiBHUElPRSAqLworI2lmIGRlZmluZWQoR1BJT0YpCisjZGVmaW5lIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRiAgICAgICAgICAgUkNDX0lPUEVOUl9HUElPRkVOCisjZW5kaWYgLyogR1BJT0YgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBCVVNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEJVUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIxIEFIQjEKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQUhCRU5SICAgICAgIERNQTFFTiAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIEFFU0VOICAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBSTkdFTiAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSWVAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgICgqKQorICAqIEBub3RlICAgKCopIFJORyAmIENSWVAgUGVyaXBoZXJhbHMgYXZhaWxhYmxlIG9ubHkgb24gU1RNMzJHMDgxeHgKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQkVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFIQkVOUiAgICAgICBETUExRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgRkxBU0hFTiAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIENSQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBBRVNFTiAgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgUk5HRU4gICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAoKikKKyAgKiBAbm90ZSAgICgqKSBSTkcgJiBDUllQIFBlcmlwaGVyYWxzIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRzA4MXh4CisgICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpID09IFBlcmlwaHMpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFIQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBSEJFTlIgICAgICAgRE1BMUVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCRU5SICAgICAgIENSQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEJFTlIgICAgICAgQUVTRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQkVOUiAgICAgICBSTkdFTiAgICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAoKikKKyAgKiBAbm90ZSAgICgqKSBSTkcgJiBDUllQIFBlcmlwaGVyYWxzIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRzA4MXh4CisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEJFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIEFIQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBSEJSU1RSICAgICAgRE1BMVJTVCAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgRkxBU0hSU1QgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgQ1JDUlNUICAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgQUVTUlNUICAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgUk5HUlNUICAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldAorKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSWVAgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9STkcgICgqKQorICAqIEBub3RlICAgKCopIFJORyAmIENSWVAgUGVyaXBoZXJhbHMgYXZhaWxhYmxlIG9ubHkgb24gU1RNMzJHMDgxeHgKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QUhCUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQUhCUlNUUiAgICAgIERNQTFSU1QgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgRkxBU0hSU1QgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQlJTVFIgICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCUlNUUiAgICAgIEFFU1JTVCAgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEJSU1RSICAgICAgUk5HUlNUICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAoKikKKyAgKiBAbm90ZSAgICgqKSBSTkcgJiBDUllQIFBlcmlwaGVyYWxzIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRzA4MXh4CisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICAqIEBybXRvbGwgQUhCU01FTlIgICAgIERNQTFTTUVOICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBGTEFTSFNNRU4gICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgU1JBTVNNRU4gICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBBRVNTTUVOICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgUk5HU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAoKikKKyAgKiBAbm90ZSAgICgqKSBSTkcgJiBDUllQIFBlcmlwaGVyYWxzIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRzA4MXh4CisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCU01FTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQlNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICAqIEBybXRvbGwgQUhCU01FTlIgICAgIERNQTFTTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgRkxBU0hTTUVOICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBTUkFNU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQUhCU01FTlIgICAgIENSQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBSEJTTUVOUiAgICAgQUVTU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFIQlNNRU5SICAgICBSTkdTTUVOICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUllQICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfUk5HICAoKikKKyAgKiBAbm90ZSAgICgqKSBSTkcgJiBDUllQIFBlcmlwaGVyYWxzIGF2YWlsYWJsZSBvbmx5IG9uIFNUTTMyRzA4MXh4CisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEJTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FQQjEgQVBCMQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBUEJFTlIxICAgICAgVElNMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFRJTTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBUSU02RU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVElNN0VOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFJUQ0FQQkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVU0FSVDNFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVVNBUlQ0RU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIExQVUFSVDFFTiAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBJMkMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgSTJDMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIENFQ0VOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVQ1BEMUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVUNQRDJFTiAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIERCR0VOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBQV1JFTiAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgREFDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIExQVElNMkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQyICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMSAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEgICgxKQorICAqIEBub3RlIFBlcmlwaGVyYWwgbWFya2VkIHdpdGggKDEpIGFyZSBub3QgYXZhaWxhYmxlIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCRU5SMSwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCRU5SMSwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFQQkVOUjEgICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVElNM0VOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFRJTTZFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgUlRDQVBCRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFdXREdFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVVNBUlQyRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFVTQVJUM0VOICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVU0FSVDRFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgTFBVQVJUMUVOICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIEkyQzFFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBJMkMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgQ0VDRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFVDUEQxRU4gICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVQ1BEMkVOICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgREJHRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFBXUkVOICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBEQUMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgTFBUSU0yRU4gICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIExQVElNMUVOICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMiAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDQgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NFQyAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDIgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RCR01DVQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0yICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSAgKDEpCisgICogQG5vdGUgUGVyaXBoZXJhbCBtYXJrZWQgd2l0aCAoMSkgYXJlIG5vdCBhdmFpbGFibGUgYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFQQkVOUjEsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQkVOUjEgICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFRJTTNFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVElNNkVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBUSU03RU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFJUQ0FQQkVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgV1dER0VOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBTUEkyRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIFVTQVJUMkVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVVNBUlQzRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVU0FSVDRFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIExQVUFSVDFFTiAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBJMkMyRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIENFQ0VOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgVUNQRDFFTiAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBVQ1BEMkVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIERCR0VOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgUFdSRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjEgICAgICBEQUMxRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMSAgICAgIExQVElNMkVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIxICAgICAgTFBUSU0xRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMiAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDQgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NFQyAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDIgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RCR01DVQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0yICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSAgKDEpCisgICogQG5vdGUgUGVyaXBoZXJhbCBtYXJrZWQgd2l0aCAoMSkgYXJlIG5vdCBhdmFpbGFibGUgYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQkVOUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEJSU1RSMSAgICAgVElNMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVElNM1JTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVElNNlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVElNN1JTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgUlRDUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgV1dER1JTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgU1BJMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVVNBUlQyUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVVNBUlQzUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVVNBUlQ0UlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgTFBVQVJUMVJTVCAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgSTJDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgSTJDMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgQ0VDUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVUNQRDFSU1QgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVUNQRDJSU1QgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgREJHUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgUFdSUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgREFDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgTFBUSU0yUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgTFBUSU0xUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMiAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU03ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDQgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMSAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NFQyAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMSAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDIgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RCR01DVQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0yICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSAgKDEpCisgICogQG5vdGUgUGVyaXBoZXJhbCBtYXJrZWQgd2l0aCAoMSkgYXJlIG5vdCBhdmFpbGFibGUgYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QVBCUlNUUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQlJTVFIxICAgICBUSU0yUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIFRJTTNSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVElNNlJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBUSU03UlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIFJUQ1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgV1dER1JTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBTUEkyUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIFVTQVJUMlJTVCAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVVNBUlQzUlNUICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBVU0FSVDRSU1QgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIExQVUFSVDFSU1QgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgSTJDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBJMkMyUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIENFQ1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgVUNQRDFSU1QgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBVQ1BEMlJTVCAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIERCR1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgUFdSUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIxICAgICBEQUMxUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjEgICAgIExQVElNMlJTVCAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMSAgICAgTFBUSU0xUlNUICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNiAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9SVEMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFVBUlQxICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ0VDICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQxICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMiAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREJHTUNVCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9QV1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTIgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xICAoMSkKKyAgKiBAbm90ZSBQZXJpcGhlcmFsIG1hcmtlZCB3aXRoICgxKSBhcmUgbm90IGF2YWlsYWJsZSBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCUlNUUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgICogQHJtdG9sbCBBUEJTTUVOUjEgICAgVElNMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFRJTTNTTUVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBUSU02U01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVElNN1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFJUQ0FQQlNNRU4gICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBXV0RHU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgU1BJMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFVTQVJUMlNNRU4gICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBVU0FSVDNTTUVOICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVVNBUlQ0U01FTiAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIExQVUFSVDFTTUVOICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBJMkMxU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgSTJDMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIENFQ1NNRU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBVQ1BEMVNNRU4gICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVUNQRDJTTUVOICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIERCR1NNRU4gICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBQV1JTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgREFDMVNNRU4gICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIExQVElNMlNNRU4gICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBMUFRJTTFTTUVOICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQyICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMSAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEgICgxKQorICAqIEBub3RlIFBlcmlwaGVyYWwgbWFya2VkIHdpdGggKDEpIGFyZSBub3QgYXZhaWxhYmxlIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCU01FTlIxLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEJTTUVOUjEsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgICogQHJtdG9sbCBBUEJTTUVOUjEgICAgVElNMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBUSU0zU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFRJTTZTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVElNN1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBSVENBUEJTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFdXREdTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgU1BJMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBVU0FSVDJTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFVTQVJUM1NNRU4gICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVVNBUlQ0U01FTiAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBMUFVBUlQxU01FTiAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIEkyQzFTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgSTJDMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBDRUNTTUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFVDUEQxU01FTiAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgVUNQRDJTTUVOICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBEQkdTTUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIFBXUlNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjEgICAgREFDMVNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMSAgICBMUFRJTTJTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIxICAgIExQVElNMVNNRU4gICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU02ICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDMgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQ0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVUFSVDEgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DRUMgICAgICgxKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDEgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQyICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9EQkdNQ1UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1BXUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfREFDMSAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMiAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEgICgxKQorICAqIEBub3RlIFBlcmlwaGVyYWwgbWFya2VkIHdpdGggKDEpIGFyZSBub3QgYXZhaWxhYmxlIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEJTTUVOUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BUEIyIEFQQjIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBUEIyIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCRU5SMiAgICAgIFNZU0NGR0VOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgU1BJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xNEVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgVElNMTVFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbiAoKikKKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xNkVOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgVElNMTdFTiAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIEFEQ0VOICAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDCisgICogQG5vdGUgKCopIHBlcmlwaGVyYWwgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQkVOUjIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQkVOUjIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBUEJFTlIyICAgICAgU1lTQ0ZHRU4gICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgVVNBUlQxRU4gICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFRJTTE0RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xNUVOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuICgqKQorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgQURDRU4gICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMKKyAgKiBAbm90ZSAoKikgcGVyaXBoZXJhbCBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBTdGF0ZSBvZiBQZXJpcGhzICgxIG9yIDApLgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEJFTlIyLCBQZXJpcGhzKSA9PSAoUGVyaXBocykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBUEJFTlIyICAgICAgU1lTQ0ZHRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgVVNBUlQxRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBUSU0xNEVOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFRJTTE1RU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuICgqKQorICAqICAgICAgICAgQVBCRU5SMiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEJFTlIyICAgICAgVElNMTdFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQkVOUjIgICAgICBBRENFTiAgICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMKKyAgKiBAbm90ZSAoKikgcGVyaXBoZXJhbCBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEJFTlIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQVBCUlNUUjIgICAgIFNZU0NGR1JTVCAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFRJTTFSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFNQSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFVTQVJUMVJTVCAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFRJTTE0UlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFRJTTE1UlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbiAoKikKKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBUSU0xNlJTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBUSU0xN1JTVCAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBBRENSU1QgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TWVNDRkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BREMKKyAgKiBAbm90ZSAoKikgcGVyaXBoZXJhbCBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChSQ0MtPkFQQlJTVFIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFQQjIgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEJSU1RSMiAgICAgU1lTQ0ZHUlNUICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBUSU0xUlNUICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFNQSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMiAgICAgVVNBUlQxUlNUICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBUSU0xNFJTVCAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFRJTTE1UlNUICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuICgqKQorICAqICAgICAgICAgQVBCUlNUUjIgICAgIFRJTTE2UlNUICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEJSU1RSMiAgICAgVElNMTdSU1QgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQlJTVFIyICAgICBBRENSU1QgICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQworICAqIEBub3RlICgqKSBwZXJpcGhlcmFsIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQlJTVFIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICAqIEBybXRvbGwgQVBCU01FTlIyICAgIFNZU0NGR1NNRU4gICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMiAgICBUSU0xU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjIgICAgU1BJMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIyICAgIFVTQVJUMVNNRU4gICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMiAgICBUSU0xNFNNRU4gICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjIgICAgVElNMTVTTUVOICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbiAoKikKKyAgKiAgICAgICAgIEFQQlNNRU5SMiAgICBUSU0xNlNNRU4gICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjIgICAgVElNMTdTTUVOICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIyICAgIEFEQ1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU3RvcFNsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1lTQ0ZHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfQURDCisgICogQG5vdGUgKCopIHBlcmlwaGVyYWwgbm90IGF2YWlsYWJsZSBvbiBhbGwgZGV2aWNlcyAKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BUEJTTUVOUjIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQlNNRU5SMiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFQQjIgcGVyaXBoZXJhbCBjbG9ja3MgaW4gU2xlZXAgYW5kIFN0b3AgbW9kZXMKKyAgKiBAcm10b2xsIEFQQlNNRU5SMiAgICBTWVNDRkdTTUVOICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIyICAgIFRJTTFTTUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjIgICAgU1BJMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMiAgICBVU0FSVDFTTUVOICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIyICAgIFRJTTE0U01FTiAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBBUEJTTUVOUjIgICAgVElNMTVTTUVOICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4gKCopCisgICogICAgICAgICBBUEJTTUVOUjIgICAgVElNMTZTTUVOICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIEFQQlNNRU5SMiAgICBUSU0xN1NNRU4gICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgQVBCU01FTlIyICAgIEFEQ1NNRU4gICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NZU0NGRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTUgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FEQworICAqIEBub3RlICgqKSBwZXJpcGhlcmFsIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQlNNRU5SMiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0lPUCBJT1AKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJT1AgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBJT1BFTlIgICAgICAgR1BJT0FFTiAgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0JFTiAgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0NFTiAgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0RFTiAgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0ZFTiAgICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPklPUEVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+SU9QRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIElPUCBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBJT1BFTlIgICAgICAgR1BJT0FFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0JFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0NFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0RFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0ZFTiAgICAgICBMTF9JT1BfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIFBlcmlwaHMgKDEgb3IgMCkuCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lPUF9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+SU9QRU5SLCBQZXJpcGhzKSA9PSBQZXJpcGhzKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJT1AgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBJT1BFTlIgICAgICAgR1BJT0FFTiAgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9CRU4gICAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIElPUEVOUiAgICAgICBHUElPQ0VOICAgICAgIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBJT1BFTlIgICAgICAgR1BJT0RFTiAgICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgSU9QRU5SICAgICAgIEdQSU9GRU4gICAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5JT1BFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSU9QIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgSU9QUlNUUiAgICAgIEdQSU9BUlNUICAgICAgTExfSU9QX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0JSU1QgICAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIElPUFJTVFIgICAgICBHUElPQ1JTVCAgICAgIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgSU9QUlNUUiAgICAgIEdQSU9EUlNUICAgICAgTExfSU9QX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0ZSU1QgICAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5JT1BSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIElPUCBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIElPUFJTVFIgICAgICBHUElPQVJTVCAgICAgIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0JSU1QgICAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgSU9QUlNUUiAgICAgIEdQSU9DUlNUICAgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIElPUFJTVFIgICAgICBHUElPRFJTVCAgICAgIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBJT1BSU1RSICAgICAgR1BJT0ZSU1QgICAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSU9QX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lPUF9HUlAxX1BFUklQSF9HUElPRgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lPUF9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5JT1BSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSU9QIHBlcmlwaGVyYWwgY2xvY2tzIGluIFNsZWVwIGFuZCBTdG9wIG1vZGVzCisgICogQHJtdG9sbCBJT1BTTUVOUiAgICAgR1BJT0FTTUVOICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0JTTUVOICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0NTTUVOICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0RTTUVOICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0ZTTUVOICAgICBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9FbmFibGVDbG9ja1N0b3BTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPklPUFNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5JT1BTTUVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElPUCBwZXJpcGhlcmFsIGNsb2NrcyBpbiBTbGVlcCBhbmQgU3RvcCBtb2RlcworICAqIEBybXRvbGwgSU9QU01FTlIgICAgIEdQSU9BU01FTiAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIElPUFNNRU5SICAgICBHUElPQlNNRU4gICAgIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcFxuCisgICogICAgICAgICBJT1BTTUVOUiAgICAgR1BJT0NTTUVOICAgICBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXBcbgorICAqICAgICAgICAgSU9QU01FTlIgICAgIEdQSU9EU01FTiAgICAgTExfSU9QX0dSUDFfRGlzYWJsZUNsb2NrU3RvcFNsZWVwXG4KKyAgKiAgICAgICAgIElPUFNNRU5SICAgICBHUElPRlNNRU4gICAgIExMX0lPUF9HUlAxX0Rpc2FibGVDbG9ja1N0b3BTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JT1BfR1JQMV9QRVJJUEhfR1BJT0YKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JT1BfR1JQMV9EaXNhYmxlQ2xvY2tTdG9wU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+SU9QU01FTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9CVVNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9jb21wLmggYi9JbmMvc3RtMzJnMHh4X2xsX2NvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFiMTZkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9jb21wLmgKQEAgLTAsMCArMSw4NjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfY29tcC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDT01QIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfQ09NUF9ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9DT01QX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChDT01QMSkgfHwgZGVmaW5lZCAoQ09NUDIpCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTCBDT01QCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX1ByaXZhdGVfQ29uc3RhbnRzIENPTVAgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBwYWlyIG9mIGNvbXBhcmF0b3JzIGluc3RhbmNlcyB3aW5kb3cgbW9kZTogICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbHMgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVB4X0lOUFVUX1BMVVNfQ09NTU9OICAgICAgICAgKi8KKy8qIHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAoY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBiaXRzIHVzZWQgaW4gZGlmZmVyZW50IHJlZ2lzdGVycykgICAgICAgICAgICAgICAqLworLyogLSBDb21wYXJhdG9yIGluc3RhbmNlIHNlbGVjdGVkIGFzIG1hc3RlciBmb3Igd2luZG93IG1vZGUgOiByZWdpc3RlciBvZmZzZXQgKi8KKy8qIC0gV2luZG93IG1vZGUgZW5hYmxlIG9yIGRpc2FibGU6IGJpdCB2YWx1ZSAqLworI2RlZmluZSBMTF9DT01QX1dJTkRPV01PREVfQ09NUF9PRERfUkVHT0ZGU0VUX01BU0sgICgweDAwMDAwMDAwVUwpIC8qIFJlZ2lzdGVyIG9mIENPTVAgaW5zdGFuY2Ugb2RkIChDT01QMV9DU1IsIC4uLikgZGVmaW5lZCBhcyByZWZlcmVuY2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSyAoMHgwMDAwMDAwMVVMKSAvKiBSZWdpc3RlciBvZiBDT01QIGluc3RhbmNlIGV2ZW4gKENPTVAyX0NTUiwgLi4uKSBvZmZzZXQgdnMgcmVnaXN0ZXIgb2YgQ09NUCBpbnN0YW5jZSBvZGQgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBYX1JFR09GRlNFVF9NQVNLICAgICAoTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfT0REX1JFR09GRlNFVF9NQVNLIHwgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSykKKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBYX1NFVFRJTkdfTUFTSyAgICAgICAoQ09NUF9DU1JfV0lOTU9ERSkKKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dPVVRQVVRfQ09NUFhfU0VUVElOR19NQVNLICAgICAoQ09NUF9DU1JfV0lOT1VUKQorI2RlZmluZSBMTF9DT01QX1dJTkRPV09VVFBVVF9CT1RIX1NFVFRJTkdfTUFTSyAgICAgIChDT01QX0NTUl9XSU5PVVQgPDwgMVVMKQorI2RlZmluZSBMTF9DT01QX1dJTkRPV09VVFBVVF9CT1RIX1BPU19WU19XSU5ET1cgICAgICgxVUwpCisKKy8qIENPTVAgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjZGVmaW5lIExMX0NPTVBfV0lORE9XTU9ERV9CSVRPRkZTRVRfUE9TICAgKDExVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKENPTVBfQ1NSX1dJTk1PREUpICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX0xFVkVMX0JJVE9GRlNFVF9QT1MgKDMwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKENPTVBfQ1NSX1ZBTFVFKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX1ByaXZhdGVfTWFjcm9zIENPTVAgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERyaXZlciBtYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiBzZXQgYSBwb2ludGVyIHRvCisgICogICAgICAgICBhIHJlZ2lzdGVyIGZyb20gYSByZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIGFuIG9mZnNldAorICAqICAgICAgICAgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19PRkZGU0VUX18gT2Zmc2V0IHRvIGJlIGFwcGxpZWQgKHVuaXQ6IG51bWJlciBvZiByZWdpc3RlcnMpLgorICAqIEByZXR2YWwgUG9pbnRlciB0byByZWdpc3RlciBhZGRyZXNzCisgICovCisjZGVmaW5lIF9fQ09NUF9QVFJfUkVHX09GRlNFVChfX1JFR19fLCBfX1JFR19PRkZGU0VUX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSAoKHVpbnQzMl90KSgmKF9fUkVHX18pKSArICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVUwpKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIENPTVBfTExfRVNfSU5JVCBDT01QIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIENPTVAgaW5zdGFuY2UuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQb3dlck1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19QT1dFUk1PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldFBvd2VyTW9kZSgpLiAqLworCisgIHVpbnQzMl90IElucHV0UGx1czsgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9QTFVTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dFBsdXMoKS4gKi8KKworICB1aW50MzJfdCBJbnB1dE1pbnVzOyAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfSU5QVVRfTUlOVVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0TWludXMoKS4gKi8KKworICB1aW50MzJfdCBJbnB1dEh5c3RlcmVzaXM7ICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBpbnB1dCBtaW51cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9IWVNURVJFU0lTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRJbnB1dEh5c3RlcmVzaXMoKS4gKi8KKworICB1aW50MzJfdCBPdXRwdXRQb2xhcml0eTsgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX09VVFBVVF9QT0xBUklUWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkoKS4gKi8KKworICB1aW50MzJfdCBPdXRwdXRCbGFua2luZ1NvdXJjZTsgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgYmxhbmtpbmcgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX09VVFBVVF9CTEFOS0lOR19TT1VSQ0UKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldE91dHB1dEJsYW5raW5nU291cmNlKCkuICovCisKK30gTExfQ09NUF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9Db25zdGFudHMgQ09NUCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfQ09NTU9OX1dJTkRPV01PREUgQ29tcGFyYXRvciBjb21tb24gbW9kZXMgLSBXaW5kb3cgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfV0lORE9XTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2luZG93IG1vZGUgZGlzYWJsZTogQ29tcGFyYXRvcnMgMSBhbmQgMiBhcmUgaW5kZXBlbmRlbnQgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OIChDT01QX0NTUl9XSU5NT0RFIHwgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSykgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAxIGFuZCBDT01QMiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAxIGlucHV0IHBsdXMgKENPTVAyIGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAyX0lOUFVUX1BMVVNfQ09NTU9OIChDT01QX0NTUl9XSU5NT0RFIHwgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfT0REX1JFR09GRlNFVF9NQVNLKSAgLyohPCBXaW5kb3cgbW9kZSBlbmFibGU6IENvbXBhcmF0b3JzIGluc3RhbmNlcyBwYWlyIENPTVAxIGFuZCBDT01QMiBoYXZlIHRoZWlyIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvZ2V0aGVyLiBUaGUgY29tbW9uIGlucHV0IGlzIENPTVAyIGlucHV0IHBsdXMgKENPTVAxIGlucHV0IHBsdXMgaXMgbm8gbW9yZSBhY2Nlc3NpYmxlKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19DT01NT05fV0lORE9XT1VUUFVUIENvbXBhcmF0b3IgY29tbW9uIG1vZGVzIC0gV2luZG93IG91dHB1dAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfV0lORE9XT1VUUFVUX0VBQ0hfQ09NUCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbmRvdyBvdXRwdXQgZGVmYXVsdCBtb2RlOiBDb21wYXJhdG9ycyBvdXRwdXQgYXJlIGluZGljYXRpbmcgZWFjaCB0aGVpciBvd24gc3RhdGUuIFRvIGtub3cgd2luZG93IG1vZGUgc3RhdGU6IGVhY2ggY29tcGFyYXRvciBvdXRwdXQgbXVzdCBiZSByZWFkLCBpZiAiKChDT01QeCBleGNsdXNpdmUgb3IgQ09NUHkpID09IDEpIiB0aGVuIG1vbml0b3JlZCBzaWduYWwgaXMgd2l0aGluIGNvbXBhcmF0b3JzIHdpbmRvdy4gVGhlIHNhbWUgd2F5LCBpZiBib3RoIGNvbXBhcmF0b3JzIG91dHB1dCBhcmUgaGlnaCwgdGhlbiBtb25pdG9yZWQgc2lnbmFsIGlzIGJlbG93IHdpbmRvdy4gKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDEgICAgICAgICAgICAgICAgICAgKENPTVBfQ1NSX1dJTk9VVCB8IExMX0NPTVBfV0lORE9XTU9ERV9DT01QX09ERF9SRUdPRkZTRVRfTUFTSykgIC8qITwgV2luZG93IG91dHB1dCBzeW50aGV0aXplZCBvbiBDT01QMSBvdXRwdXQ6IENPTVAxIG91dHB1dCBpcyBubyBtb3JlIGluZGljYXRpbmcgaXRzIG93biBzdGF0ZSwgYnV0IGdsb2JhbCB3aW5kb3cgbW9kZSBzdGF0ZSAobG9naWNhbCBoaWdoIG1lYW5zIG1vbml0b3JlZCBzaWduYWwgaXMgd2l0aGluIGNvbXBhcmF0b3JzIHdpbmRvdykuICovCisjZGVmaW5lIExMX0NPTVBfV0lORE9XT1VUUFVUX0NPTVAyICAgICAgICAgICAgICAgICAgIChDT01QX0NTUl9XSU5PVVQgfCBMTF9DT01QX1dJTkRPV01PREVfQ09NUF9FVkVOX1JFR09GRlNFVF9NQVNLKSAvKiE8IFdpbmRvdyBvdXRwdXQgc3ludGhldGl6ZWQgb24gQ09NUDIgb3V0cHV0OiBDT01QMiBvdXRwdXQgaXMgbm8gbW9yZSBpbmRpY2F0aW5nIGl0cyBvd24gc3RhdGUsIGJ1dCBnbG9iYWwgd2luZG93IG1vZGUgc3RhdGUgKGxvZ2ljYWwgaGlnaCBtZWFucyBtb25pdG9yZWQgc2lnbmFsIGlzIHdpdGhpbiBjb21wYXJhdG9ycyB3aW5kb3cpLiAqLworI2RlZmluZSBMTF9DT01QX1dJTkRPV09VVFBVVF9CT1RIICAgICAgICAgICAgICAgICAgICAoQ09NUF9DU1JfV0lOT1VUIHwgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSyB8IExMX0NPTVBfV0lORE9XT1VUUFVUX0JPVEhfU0VUVElOR19NQVNLKSAgICAgIC8qITwgV2luZG93IG91dHB1dCBzeW50aGV0aXplZCBvbiBib3RoIENPTVAxIGFuZCBDT01QMiBvdXRwdXQ6IENPTVAxIGFuZCBDT01QMiBvdXRwdXRzIGFyZSBubyBtb3JlIGluZGljYXRpbmcgdGhlaXIgb3duIHN0YXRlLCBidXQgZ2xvYmFsIHdpbmRvdyBtb2RlIHN0YXRlIChsb2dpY2FsIGhpZ2ggbWVhbnMgbW9uaXRvcmVkIHNpZ25hbCBpcyB3aXRoaW4gY29tcGFyYXRvcnMgd2luZG93KS4gVGhpcyBpcyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRvbiAodGVjaG5pY2FsbHkgcG9zc2libGUgYnV0IG5vdCByZWxldmFudCBmcm9tIGFwcGxpY2F0aW9uIHBvaW50IG9mIHZpZXc6IDIgY29tcGFyYXRvcnMgb3V0cHV0IHVzZWQgZm9yIHRoZSBzYW1lIHNpZ25hbCBsZXZlbCksIHN0YW5kYXJkIGNvbmZpZ3VyYXRvbiBmb3Igd2luZG93IG1vZGUgaXMgb25lIG9mIHRoZSAzIHNldHRpbmdzIGFib3ZlLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX1BPV0VSTU9ERSBDb21wYXJhdG9yIG1vZGVzIC0gUG93ZXIgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gaGlnaCBzcGVlZCAqLworI2RlZmluZSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCAgIChDT01QX0NTUl9QV1JNT0RFXzApICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBwb3dlciBtb2RlIHRvIG1lZGl1bSBzcGVlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX1BMVVMgQ29tcGFyYXRvciBpbnB1dHMgLSBJbnB1dCBwbHVzIChpbnB1dCBub24taW52ZXJ0aW5nKSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8xICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8xIChwaW4gUEM1IGZvciBDT01QMSwgcGluIFBCNCBmb3IgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19JTzIgICAgICAgICAgKENPTVBfQ1NSX0lOUFNFTF8wKSAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzIgKHBpbiBQQjIgZm9yIENPTVAxLCBwaW4gUEI2IGZvciBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0lPMyAgICAgICAgICAoQ09NUF9DU1JfSU5QU0VMXzEpICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMyAocGluIFBBMSBmb3IgQ09NUDEsIHBpbiBQQTMgZm9yIENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX01JTlVTIENvbXBhcmF0b3IgaW5wdXRzIC0gSW5wdXQgbWludXMgKGlucHV0IGludmVydGluZykgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMS80IFZyZWZJbnQgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDEvMiBWcmVmSW50ICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfSU5NU0VMXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAzLzQgVnJlZkludCAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gVnJlZkludCAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMSAoREFDX09VVDEpICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8yICAgICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9JTk1TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBEQUMxIGNoYW5uZWwgMiAoREFDX09VVDIpICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8yIHwgQ09NUF9DU1JfSU5NU0VMXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQTkgZm9yIENPTVAxLCBwaW4gUEIzIGZvciBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19JTzIgICAgICAgICAoICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEM0IGZvciBDT01QMSwgcGluIFBCNyBmb3IgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zICAgICAgICAgKENPTVBfQ1NSX0lOTVNFTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIElPMyAocGluIFBBMCBmb3IgQ09NUDEsIHBpbiBQQTIgZm9yIENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX0lOUFVUX0hZU1RFUkVTSVMgQ29tcGFyYXRvciBpbnB1dCAtIEh5c3RlcmVzaXMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORSAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gaHlzdGVyZXNpcyAqLworI2RlZmluZSBMTF9DT01QX0hZU1RFUkVTSVNfTE9XICAgICAgICAgICggICAgICAgICAgICAgICAgICBDT01QX0NTUl9IWVNUXzApIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBsb3cgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX01FRElVTSAgICAgICAoQ09NUF9DU1JfSFlTVF8xICAgICAgICAgICAgICAgICAgKSAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgbWVkaXVtICovCisjZGVmaW5lIExMX0NPTVBfSFlTVEVSRVNJU19ISUdIICAgICAgICAgKENPTVBfQ1NSX0hZU1RfMSB8IENPTVBfQ1NSX0hZU1RfMCkgLyohPCBIeXN0ZXJlc2lzIGxldmVsIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19PVVRQVVRfUE9MQVJJVFkgQ29tcGFyYXRvciBvdXRwdXQgLSBPdXRwdXQgcG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCAgICgweDAwMDAwMDAwVUwpICAgICAgICAgIC8qITwgQ09NUCBvdXRwdXQgcG9sYXJpdHkgaXMgbm90IGludmVydGVkOiBjb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIHBsdXMgKG5vbi1pbnZlcnRpbmcpIGlucHV0IGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgbWludXMgKGludmVydGluZykgaW5wdXQgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRQT0xfSU5WRVJURUQgICAgICAoQ09NUF9DU1JfUE9MQVJJVFkpICAgICAvKiE8IENPTVAgb3V0cHV0IHBvbGFyaXR5IGlzIGludmVydGVkOiBjb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgcGx1cyAobm9uLWludmVydGluZykgaW5wdXQgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIG1pbnVzIChpbnZlcnRpbmcpIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX0JMQU5LSU5HX1NPVVJDRSBDb21wYXJhdG9yIG91dHB1dCAtIEJsYW5raW5nIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfTk9ORSAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgIC8qITxDb21wYXJhdG9yIG91dHB1dCB3aXRob3V0IGJsYW5raW5nICovCisvKiBOb3RlOiBPdXRwdXQgYmxhbmtpbmcgc291cmNlIGNvbW1vbiB0byBhbGwgQ09NUCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNCAgICAgICAgKENPTVBfQ1NSX0JMQU5LSU5HXzApICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMSBPQzQgKGNvbW1vbiB0byBhbGwgQ09NUCBpbnN0YW5jZXM6IENPTVAxLCBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSAgICAgICAgKENPTVBfQ1NSX0JMQU5LSU5HXzEpICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMSBPQzUgKGNvbW1vbiB0byBhbGwgQ09NUCBpbnN0YW5jZXM6IENPTVAxLCBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMyAgICAgICAgKENPTVBfQ1NSX0JMQU5LSU5HXzIpICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMiBPQzMgKGNvbW1vbiB0byBhbGwgQ09NUCBpbnN0YW5jZXM6IENPTVAxLCBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DMyAgICAgICAgKENPTVBfQ1NSX0JMQU5LSU5HXzMpICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMyBPQzMgKGNvbW1vbiB0byBhbGwgQ09NUCBpbnN0YW5jZXM6IENPTVAxLCBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzIgICAgICAgKENPTVBfQ1NSX0JMQU5LSU5HXzQpICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCBibGFua2luZyBzb3VyY2UgVElNMTUgT0MyIChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX0xFVkVMIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfTE9XICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGxvdyAoaWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgb3RoZXJ3aXNlIHRvIGJlIGNvbXBsZW1lbnRlZCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfSElHSCAgICAgICAoMHgwMDAwMDAwMVVMKSAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGhpZ2ggKGlmIHRoZSBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIG90aGVyd2lzZSB0byBiZSBjb21wbGVtZW50ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBDT01QIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBDT01QIHBlcmlwaGVyYWwgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIENPTVAgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKworLyogRGVsYXkgZm9yIGNvbXBhcmF0b3Igc3RhcnR1cCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERlbGF5IHJlcXVpcmVkIHRvIHJlYWNoIHByb3BhZ2F0aW9uIGRlbGF5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U1RBUlQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfREVMQVlfU1RBUlRVUF9VUyAgICAgICAgICAoIDgwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisKKy8qIERlbGF5IGZvciBjb21wYXJhdG9yIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBWb2x0YWdlIHNjYWxlciBpcyB1c2VkIHdoZW4gc2VsZWN0aW5nIGNvbXBhcmF0b3IgaW5wdXQgICAgICAgICAgICAgICAqLworLyogICAgICAgYmFzZWQgb24gVnJlZkludDogVnJlZkludCBvciBzdWJkaXZpc2lvbiBvZiBWcmVmSW50LiAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVF9TQ0FMRVIiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTICggMjAwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgdm9sdGFnZSBzY2FsZXIgc3RhYmlsaXphdGlvbiB0aW1lICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfTWFjcm9zIENPTVAgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiB3cml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ09NUCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0NPTVBfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENPTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0NPTVBfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VNX0hFTFBFUl9NQUNSTyBDT01QIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENPTVAgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgICBzZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcy4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkNPTVB4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIF9fQ09NUHhfXyBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBDT01QIGNvbW1vbiBpbnN0YW5jZSBvciB2YWx1ZSAiMCIgaWYgdGhlcmUgaXMgbm8gQ09NUCBjb21tb24gaW5zdGFuY2UuCisgICovCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ09NUDEyX0NPTU1PTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09NUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfQ29uZmlndXJhdGlvbl9jb21wYXJhdG9yX2NvbW1vbiBDb25maWd1cmF0aW9uIG9mIENPTVAgaGllcmFyY2hpY2FsIHNjb3BlOiBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ1NSICAgICAgV0lOTU9ERSAgICAgICAgTExfQ09NUF9TZXRDb21tb25XaW5kb3dNb2RlCisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIFdpbmRvd01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QMl9JTlBVVF9QTFVTX0NPTU1PTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRDb21tb25XaW5kb3dNb2RlKENPTVBfQ29tbW9uX1R5cGVEZWYgKkNPTVB4eV9DT01NT04sIHVpbnQzMl90IFdpbmRvd01vZGUpCit7CisgIC8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIHdpbmRvdyBtb2RlIGNhbiBiZSBzZXQgZnJvbSBvbmUgb2YgdGhlIHBhaXIgICAqLworICAvKiAgICAgICBvZiBDT01QIGluc3RhbmNlczogQ09NUDEgb3IgQ09NUDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQ09NUF9QVFJfUkVHX09GRlNFVChDT01QeHlfQ09NTU9OLT5DU1JfT0RELCAoV2luZG93TW9kZSAmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QWF9SRUdPRkZTRVRfTUFTSykpOworCisgIC8qIENsZWFyIHRoZSBwb3RlbnRpYWwgcHJldmlvdXMgc2V0dGluZyBvZiB3aW5kb3cgbW9kZSAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnX2NsZWFyID0gX19DT01QX1BUUl9SRUdfT0ZGU0VUKENPTVB4eV9DT01NT04tPkNTUl9PREQsICh+KFdpbmRvd01vZGUgJiBMTF9DT01QX1dJTkRPV01PREVfQ09NUFhfUkVHT0ZGU0VUX01BU0spICYgMHgxVUwpKTsKKyAgQ0xFQVJfQklUKCpwcmVnX2NsZWFyLAorICAgICAgICAgICAgQ09NUF9DU1JfV0lOTU9ERQorICAgICAgICAgICApOworCisgIC8qIFNldCB3aW5kb3cgbW9kZSAqLworICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIENPTVBfQ1NSX1dJTk1PREUsCisgICAgICAgICAgICAgKFdpbmRvd01vZGUgJiBMTF9DT01QX1dJTkRPV01PREVfQ09NUFhfU0VUVElOR19NQVNLKQorICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2luZG93IG1vZGUgb2YgYSBwYWlyIG9mIGNvbXBhcmF0b3JzIGluc3RhbmNlcworICAqICAgICAgICAgKDIgY29uc2VjdXRpdmUgQ09NUCBpbnN0YW5jZXMgb2RkIGFuZCBldmVuIENPTVA8eD4gYW5kIENPTVA8eCsxPikuCisgICogQHJtdG9sbCBDU1IgICAgICBXSU5NT0RFICAgICAgICBMTF9DT01QX0dldENvbW1vbldpbmRvd01vZGUKKyAgKiBAcGFyYW0gIENPTVB4eV9DT01NT04gQ29tcGFyYXRvciBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0NPTVBfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QMl9JTlBVVF9QTFVTX0NPTU1PTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0Q29tbW9uV2luZG93TW9kZShDT01QX0NvbW1vbl9UeXBlRGVmICpDT01QeHlfQ09NTU9OKQoreworICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCB3aW5kb3cgbW9kZSBjYW4gYmUgc2V0IGZyb20gb25lIG9mIHRoZSBwYWlyICAgKi8KKyAgLyogICAgICAgb2YgQ09NUCBpbnN0YW5jZXM6IENPTVAxIG9yIENPTVAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ2lzdGVyIGNvbnN0IHVpbnQzMl90IHdpbmRvd19tb2RlX2NvbXBfb2RkID0gKHVpbnQzMl90KVJFQURfQklUKENPTVB4eV9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk1PREUpOworICByZWdpc3RlciBjb25zdCB1aW50MzJfdCB3aW5kb3dfbW9kZV9jb21wX2V2ZW4gPSAodWludDMyX3QpUkVBRF9CSVQoQ09NUHh5X0NPTU1PTi0+Q1NSX0VWRU4sIENPTVBfQ1NSX1dJTk1PREUpOworCisgIHJldHVybiAodWludDMyX3QpKHdpbmRvd19tb2RlX2NvbXBfb2RkCisgICAgICAgICAgICAgICAgICAgIHwgd2luZG93X21vZGVfY29tcF9ldmVuCisgICAgICAgICAgICAgICAgICAgIHwgKCh3aW5kb3dfbW9kZV9jb21wX2V2ZW4gPj4gTExfQ09NUF9XSU5ET1dNT0RFX0JJVE9GRlNFVF9QT1MpICogTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB3aW5kb3cgb3V0cHV0IG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ1NSICAgICAgV0lOT1VUICAgICAgICAgTExfQ09NUF9TZXRDb21tb25XaW5kb3dPdXRwdXQKKyAgKiBAcGFyYW0gIENPTVB4eV9DT01NT04gQ29tcGFyYXRvciBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0NPTVBfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgV2luZG93T3V0cHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dPVVRQVVRfRUFDSF9DT01QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV09VVFBVVF9DT01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XT1VUUFVUX0JPVEgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0Q29tbW9uV2luZG93T3V0cHV0KENPTVBfQ29tbW9uX1R5cGVEZWYgKkNPTVB4eV9DT01NT04sIHVpbnQzMl90IFdpbmRvd091dHB1dCkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQ09NUF9QVFJfUkVHX09GRlNFVChDT01QeHlfQ09NTU9OLT5DU1JfT0RELCAoV2luZG93T3V0cHV0ICYgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBYX1JFR09GRlNFVF9NQVNLKSk7CisKKyAgLyogQ2xlYXIgdGhlIHBvdGVudGlhbCBwcmV2aW91cyBzZXR0aW5nIG9mIHdpbmRvdyBvdXRwdXQgb24gdGhlIHJlbGV2YW50IGNvbXBhcmF0b3IgaW5zdGFuY2UgKi8KKyAgLyogKGNsZWFyIGJpdCBvZiB3aW5kb3cgb3V0cHV0IHVubGVzcyBzcGVjaWZpYyBjYXNlIG9mIHNldHRpbmcgb2YgY29tcGFyYXRvciBib3RoIG91dHB1dCBzZWxlY3RlZCkgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZ19jbGVhciA9IF9fQ09NUF9QVFJfUkVHX09GRlNFVChDT01QeHlfQ09NTU9OLT5DU1JfT0RELCAofihXaW5kb3dPdXRwdXQgJiBMTF9DT01QX1dJTkRPV01PREVfQ09NUFhfUkVHT0ZGU0VUX01BU0spICYgMHgxVUwpKTsKKyAgTU9ESUZZX1JFRygqcHJlZ19jbGVhciwKKyAgICAgICAgICAgICBDT01QX0NTUl9XSU5PVVQsCisgICAgICAgICAgICAgKChXaW5kb3dPdXRwdXQgJiBMTF9DT01QX1dJTkRPV09VVFBVVF9CT1RIX1NFVFRJTkdfTUFTSykgPj4gTExfQ09NUF9XSU5ET1dPVVRQVVRfQk9USF9QT1NfVlNfV0lORE9XKQorICAgICAgICAgICAgKTsKKworICAvKiBTZXQgd2luZG93IG91dHB1dCAqLworICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIENPTVBfQ1NSX1dJTk9VVCwKKyAgICAgICAgICAgICAoV2luZG93T3V0cHV0ICYgTExfQ09NUF9XSU5ET1dPVVRQVVRfQ09NUFhfU0VUVElOR19NQVNLKQorICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2luZG93IG91dHB1dCBvZiBhIHBhaXIgb2YgY29tcGFyYXRvcnMgaW5zdGFuY2VzCisgICogICAgICAgICAoMiBjb25zZWN1dGl2ZSBDT01QIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFdJTk1PREUgICAgICAgIExMX0NPTVBfR2V0Q29tbW9uV2luZG93T3V0cHV0CisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dPVVRQVVRfRUFDSF9DT01QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV09VVFBVVF9DT01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XT1VUUFVUX0JPVEgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldENvbW1vbldpbmRvd091dHB1dChDT01QX0NvbW1vbl9UeXBlRGVmICpDT01QeHlfQ09NTU9OKQoreworICByZWdpc3RlciBjb25zdCB1aW50MzJfdCB3aW5kb3dfb3V0cHV0X2NvbXBfb2RkID0gKHVpbnQzMl90KVJFQURfQklUKENPTVB4eV9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk9VVCk7CisgIHJlZ2lzdGVyIGNvbnN0IHVpbnQzMl90IHdpbmRvd19vdXRwdXRfY29tcF9ldmVuID0gKHVpbnQzMl90KVJFQURfQklUKENPTVB4eV9DT01NT04tPkNTUl9FVkVOLCBDT01QX0NTUl9XSU5PVVQpOworCisgIC8qIENvbnN0cnVjdCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIExMX0NPTVBfV0lORE9XT1VUUFVUX3h4eCAqLworICByZXR1cm4gKHVpbnQzMl90KSh3aW5kb3dfb3V0cHV0X2NvbXBfb2RkCisgICAgICAgICAgICAgICAgICAgIHwgd2luZG93X291dHB1dF9jb21wX2V2ZW4KKyAgICAgICAgICAgICAgICAgICAgfCAoKHdpbmRvd19vdXRwdXRfY29tcF9ldmVuID4+IENPTVBfQ1NSX1dJTk9VVF9Qb3MpICogTExfQ09NUF9XSU5ET1dNT0RFX0NPTVBfRVZFTl9SRUdPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgfCAod2luZG93X291dHB1dF9jb21wX29kZCArIHdpbmRvd19vdXRwdXRfY29tcF9ldmVuKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3JfbW9kZXMgQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIG1vZGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAqIEBybXRvbGwgQ1NSICAgICAgUFdSTU9ERSAgICAgICAgTExfQ09NUF9TZXRQb3dlck1vZGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldFBvd2VyTW9kZShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBQb3dlck1vZGUpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgQ09NUF9DU1JfUFdSTU9ERSwgUG93ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnN0YW5jZSBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAqIEBybXRvbGwgQ1NSICAgICAgUFdSTU9ERSAgICAgICAgTExfQ09NUF9HZXRQb3dlck1vZGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldFBvd2VyTW9kZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9QV1JNT0RFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3JfaW5wdXRzIENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBpbnB1dHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0cyBtaW51cyAoaW52ZXJ0aW5nKSBhbmQgcGx1cyAobm9uLWludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBhIHZvbHRhZ2Ugc2NhbGVyIGlzIHVzZWQKKyAgKiAgICAgICAgIHdoZW4gQ09NUCBpbnB1dCBpcyBiYXNlZCBvbiBWcmVmSW50IChWcmVmSW50IG9yIHN1YmRpdmlzaW9uCisgICogICAgICAgICBvZiBWcmVmSW50KToKKyAgKiAgICAgICAgIFZvbHRhZ2Ugc2NhbGVyIHJlcXVpcmVzIGEgZGVsYXkgZm9yIHZvbHRhZ2Ugc3RhYmlsaXphdGlvbi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidFNUQVJUX1NDQUxFUiIuCisgICogQHJtdG9sbCBDU1IgICAgICBJTk1TRUwgICAgICAgICBMTF9DT01QX0NvbmZpZ0lucHV0c1xuCisgICogICAgICAgICBDU1IgICAgICBJTlBTRUwgICAgICAgICBMTF9DT01QX0NvbmZpZ0lucHV0c1xuCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE1pbnVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMKKyAgKiBAcGFyYW0gIElucHV0UGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9Db25maWdJbnB1dHMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRNaW51cywgdWludDMyX3QgSW5wdXRQbHVzKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsCisgICAgICAgICAgICAgQ09NUF9DU1JfSU5NU0VMIHwgQ09NUF9DU1JfSU5QU0VMLAorICAgICAgICAgICAgIElucHV0TWludXMgfCBJbnB1dFBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgSU5QU0VMICAgICAgICAgTExfQ09NUF9TZXRJbnB1dFBsdXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIElucHV0UGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dFBsdXMoQ09NUF9UeXBlRGVmICpDT01QeCwgdWludDMyX3QgSW5wdXRQbHVzKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0lOUFNFTCwgSW5wdXRQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgIElOUFNFTCAgICAgICAgIExMX0NPTVBfR2V0SW5wdXRQbHVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0SW5wdXRQbHVzKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0lOUFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIChpbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYSB2b2x0YWdlIHNjYWxlciBpcyB1c2VkCisgICogICAgICAgICB3aGVuIENPTVAgaW5wdXQgaXMgYmFzZWQgb24gVnJlZkludCAoVnJlZkludCBvciBzdWJkaXZpc2lvbgorICAqICAgICAgICAgb2YgVnJlZkludCk6CisgICogICAgICAgICBWb2x0YWdlIHNjYWxlciByZXF1aXJlcyBhIGRlbGF5IGZvciB2b2x0YWdlIHN0YWJpbGl6YXRpb24uCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRTVEFSVF9TQ0FMRVIiLgorICAqIEBybXRvbGwgQ1NSICAgICAgSU5NU0VMICAgICAgICAgTExfQ09NUF9TZXRJbnB1dE1pbnVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE1pbnVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0SW5wdXRNaW51cyhDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBJbnB1dE1pbnVzKQoreworICBNT0RJRllfUkVHKENPTVB4LT5DU1IsIENPTVBfQ1NSX0lOTVNFTCwgSW5wdXRNaW51cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDU1IgICAgICBJTk1TRUwgICAgICAgICBMTF9DT01QX0dldElucHV0TWludXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfSU5NU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5zdGFuY2UgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEhZU1QgICAgICAgICAgIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dEh5c3RlcmVzaXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IElucHV0SHlzdGVyZXNpcykKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9IWVNULCBJbnB1dEh5c3RlcmVzaXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIGh5c3RlcmVzaXMgbW9kZSBvZiB0aGUgbWludXMgKGludmVydGluZykgaW5wdXQuCisgICogQHJtdG9sbCBDU1IgICAgICBIWVNUICAgICAgICAgICBMTF9DT01QX0dldElucHV0SHlzdGVyZXNpcworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0SHlzdGVyZXNpcyhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9IWVNUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3Jfb3V0cHV0IENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBvdXRwdXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBPTEFSSVRZICAgICAgIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBPdXRwdXRQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9QT0xBUklUWSwgT3V0cHV0UG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBPTEFSSVRZICAgICAgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfUE9MQVJJVFkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBibGFua2luZyBzb3VyY2UuCisgICogQG5vdGUgICBCbGFua2luZyBzb3VyY2UgbWF5IGJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIGJsYW5raW5nIHNvdXJjZSBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEJMQU5LSU5HICAgICAgIExMX0NPTVBfU2V0T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJsYW5raW5nU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNCAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DMyAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzIgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmlsaXR5IGRlcGVuZGluZyBvbiB0aW1lciBhdmFpbGFiaWxpdHkKKyAgKiAgICAgICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRPdXRwdXRCbGFua2luZ1NvdXJjZShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBCbGFua2luZ1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9CTEFOS0lORywgQmxhbmtpbmdTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIGJsYW5raW5nIHNvdXJjZS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIGJsYW5raW5nIHNvdXJjZSBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIEJsYW5raW5nIHNvdXJjZSBtYXkgYmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgQkxBTktJTkcgICAgICAgTExfQ09NUF9HZXRPdXRwdXRCbGFua2luZ1NvdXJjZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M0ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTNfT0MzICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMiAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFiaWxpdHkgZGVwZW5kaW5nIG9uIHRpbWVyIGF2YWlsYWJpbGl0eQorICAqICAgICAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRPdXRwdXRCbGFua2luZ1NvdXJjZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9CTEFOS0lORykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfT3BlcmF0aW9uIE9wZXJhdGlvbiBvbiBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsZSBmcm9tIG9mZiBzdGF0ZSwgY29tcGFyYXRvciByZXF1aXJlcyBhIGRlbGF5CisgICogICAgICAgICB0byByZWFjaCByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlQiLgorICAqIEBybXRvbGwgQ1NSICAgICAgRU4gICAgICAgICAgICAgTExfQ09NUF9FbmFibGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfRW5hYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIFNFVF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEVOICAgICAgICAgICAgIExMX0NPTVBfRGlzYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9EaXNhYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIENMRUFSX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgZW5hYmxlIHN0YXRlCisgICogICAgICAgICAoMDogQ09NUCBpcyBkaXNhYmxlZCwgMTogQ09NUCBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1NSICAgICAgRU4gICAgICAgICAgICAgTExfQ09NUF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0lzRW5hYmxlZChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9FTikgPT0gKENPTVBfQ1NSX0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIE9uY2UgbG9ja2VkLCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGluIHJlYWQtb25seS4KKyAgKiBAbm90ZSAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHJtdG9sbCBDU1IgICAgICBMT0NLICAgICAgICAgICBMTF9DT01QX0xvY2sKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfTG9jayhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICBTRVRfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0xPQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGxvY2sgc3RhdGUKKyAgKiAgICAgICAgICgwOiBDT01QIGlzIHVubG9ja2VkLCAxOiBDT01QIGlzIGxvY2tlZCkuCisgICogQG5vdGUgICBPbmNlIGxvY2tlZCwgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZCBpbiByZWFkLW9ubHkuCisgICogQG5vdGUgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBybXRvbGwgQ1NSICAgICAgTE9DSyAgICAgICAgICAgTExfQ09NUF9Jc0xvY2tlZAorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfSXNMb2NrZWQoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfTE9DSykgPT0gKENPTVBfQ1NSX0xPQ0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBsZXZlbC4KKyAgKiBAbm90ZSAgIFRoZSBjb21wYXJhdG9yIG91dHB1dCBsZXZlbCBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBwb2xhcml0eQorICAqICAgICAgICAgKFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eSgpKS4KKyAgKiAgICAgICAgIElmIHRoZSBjb21wYXJhdG9yIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cworICAqICAgICAgICAgICAgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgSWYgdGhlIGNvbXBhcmF0b3IgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcm10b2xsIENTUiAgICAgIFZBTFVFICAgICAgICAgIExMX0NPTVBfUmVhZE91dHB1dExldmVsCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgPj4gTExfQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KTsKK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX0NPTVBfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9jb3J0ZXguaCBiL0luYy9zdG0zMmcweHhfbGxfY29ydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhODdiOQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfY29ydGV4LmgKQEAgLTAsMCArMSw1ODcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfY29ydGV4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENPUlRFWCBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBDT1JURVggZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBTWVNUSUNLIGNvbmZpZ3VyYXRpb24gdXNlZCBieSBAcmVmIExMX21EZWxheSBhbmQgQHJlZiBMTF9Jbml0MW1zVGljaworICAgICAgICAgIGZ1bmN0aW9ucworICAgICAgKCspIExvdyBwb3dlciBtb2RlIGNvbmZpZ3VyYXRpb24gKFNDQiByZWdpc3RlciBvZiBDb3J0ZXgtTUNVKQorICAgICAgKCspIE1QVSBBUEkgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgcmVnaW9ucworICAgICAgKCspIEFQSSB0byBhY2Nlc3MgdG8gTUNVIGluZm8gKENQVUlEIHJlZ2lzdGVyKQorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX0NPUlRFWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9DT1JURVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTEwgQ09SVEVYCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIENPUlRFWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DTEtTT1VSQ0VfSENMSyBTWVNUSUNLIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4qLworI2RlZmluZSBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLICAgICAgICAgIFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrICAvKiE8IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBfX01QVV9QUkVTRU5UCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NUUkxfSEZOTUlfUFJJVkRFRiBNUFUgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9DVFJMX0hGTk1JX1BSSVZERUZfTk9ORSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpc2FibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IQVJERkFVTFRfTk1JICAgICAgICAgIE1QVV9DVFJMX0hGTk1JRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGVzIHRoZSBvcGVyYXRpb24gb2YgTVBVIGR1cmluZyBoYXJkIGZhdWx0LCBOTUksIGFuZCBGQVVMVE1BU0sgaGFuZGxlcnMgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUICAgICBNUFVfQ1RSTF9QUklWREVGRU5BX01zayAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIHByaXZpbGVnZWQgc29mdHdhcmUgYWNjZXNzIHRvIGRlZmF1bHQgbWVtb3J5IG1hcCAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGICAgICAgICAgIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCBNUFVfQ1RSTF9QUklWREVGRU5BX01zaykgLyohPCBFbmFibGUgTk1JIGFuZCBwcml2aWxlZ2VkIFNXIGFjY2VzcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OIE1QVSBSZWdpb24gTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIwICAgICAgICAgICAgICAweDAwVSAvKiE8IFJFR0lPTiBOdW1iZXIgMCAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjEgICAgICAgICAgICAgIDB4MDFVIC8qITwgUkVHSU9OIE51bWJlciAxICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMiAgICAgICAgICAgICAgMHgwMlUgLyohPCBSRUdJT04gTnVtYmVyIDIgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIzICAgICAgICAgICAgICAweDAzVSAvKiE8IFJFR0lPTiBOdW1iZXIgMyAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjQgICAgICAgICAgICAgIDB4MDRVIC8qITwgUkVHSU9OIE51bWJlciA0ICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNSAgICAgICAgICAgICAgMHgwNVUgLyohPCBSRUdJT04gTnVtYmVyIDUgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI2ICAgICAgICAgICAgICAweDA2VSAvKiE8IFJFR0lPTiBOdW1iZXIgNiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjcgICAgICAgICAgICAgIDB4MDdVIC8qITwgUkVHSU9OIE51bWJlciA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19SRUdJT05fU0laRSBNUFUgUmVnaW9uIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2QiAgICAgICAgICAgICgweDA3VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyQiAgICAgICAgICAgICgweDA4VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA1MTJCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMUtCICAgICAgICAgICAgICgweDA5VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yS0IgICAgICAgICAgICAgKDB4MEFVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDJLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzRLQiAgICAgICAgICAgICAoMHgwQlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCICAgICAgICAgICAgICgweDBDVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA4S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xNktCICAgICAgICAgICAgKDB4MERVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDE2S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8zMktCICAgICAgICAgICAgKDB4MEVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDMyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV82NEtCICAgICAgICAgICAgKDB4MEZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDY0S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xMjhLQiAgICAgICAgICAgKDB4MTBVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOEtCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2S0IgICAgICAgICAgICgweDExVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyNTZLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzUxMktCICAgICAgICAgICAoMHgxMlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNTEyS0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xTUIgICAgICAgICAgICAgKDB4MTNVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDFNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzJNQiAgICAgICAgICAgICAoMHgxNFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNE1CICAgICAgICAgICAgICgweDE1VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV84TUIgICAgICAgICAgICAgKDB4MTZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDhNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzE2TUIgICAgICAgICAgICAoMHgxN1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTZNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzMyTUIgICAgICAgICAgICAoMHgxOFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMzJNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzY0TUIgICAgICAgICAgICAoMHgxOVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNjRNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzEyOE1CICAgICAgICAgICAoMHgxQVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTI4TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yNTZNQiAgICAgICAgICAgKDB4MUJVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDI1Nk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyTUIgICAgICAgICAgICgweDFDVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA1MTJNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzFHQiAgICAgICAgICAgICAoMHgxRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMUdCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCICAgICAgICAgICAgICgweDFFVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyR0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV80R0IgICAgICAgICAgICAgKDB4MUZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDRHQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1JFR0lPTl9QUklWSUxFREdFUyBNUFUgUmVnaW9uIFByaXZpbGVnZXMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05PX0FDQ0VTUyAgICAgICAgICAgICgweDAwVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgTm8gYWNjZXNzKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JXICAgICAgICAgICAgICAoMHgwMVUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgKHByaXZpbGVnZWQgYWNjZXNzIG9ubHkpKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JXX1VSTyAgICAgICAgICAoMHgwMlUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgLSBSTyB1c2VyIChXcml0ZSBpbiBhIHVzZXIgcHJvZ3JhbSBnZW5lcmF0ZXMgYSBmYXVsdCkgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyAgICAgICAgICAoMHgwM1UgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJXIHByaXZpbGVnZWQgJiB1c2VyIChGdWxsIGFjY2VzcykgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JPICAgICAgICAgICAgICAoMHgwNVUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJPIHByaXZpbGVnZWQgKHByaXZpbGVnZWQgcmVhZCBvbmx5KSovCisjZGVmaW5lIExMX01QVV9SRUdJT05fUFJJVl9ST19VUk8gICAgICAgICAgKDB4MDZVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBSTyBwcml2aWxlZ2VkICYgdXNlciAocmVhZCBvbmx5KSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfVEVYIE1QVSBURVggTGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMCAgICAgICAgICAgICAgICAgICgweDAwVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMDAgZm9yIFRFWCBiaXRzICovCisjZGVmaW5lIExMX01QVV9URVhfTEVWRUwxICAgICAgICAgICAgICAgICAgKDB4MDFVIDw8IE1QVV9SQVNSX1RFWF9Qb3MpIC8qITwgYjAwMSBmb3IgVEVYIGJpdHMgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDIgICAgICAgICAgICAgICAgICAoMHgwMlUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDEwIGZvciBURVggYml0cyAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMNCAgICAgICAgICAgICAgICAgICgweDA0VSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIxMDAgZm9yIFRFWCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19JTlNUUlVDVElPTl9BQ0NFU1MgTVBVIEluc3RydWN0aW9uIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFICAgMHgwMFUgICAgICAgICAgICAvKiE8IEluc3RydWN0aW9uIGZldGNoZXMgZW5hYmxlZCAqLworI2RlZmluZSBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUgIE1QVV9SQVNSX1hOX01zayAgLyohPCBJbnN0cnVjdGlvbiBmZXRjaGVzIGRpc2FibGVkKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1NIQVJFQUJMRV9BQ0NFU1MgTVBVIFNoYXJlYWJsZSBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSAgICAgICAgICAgIE1QVV9SQVNSX1NfTXNrICAgLyohPCBTaGFyZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9TSEFSRUFCTEUgICAgICAgIDB4MDBVICAgICAgICAgICAgLyohPCBOb3QgU2hhcmVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NBQ0hFQUJMRV9BQ0NFU1MgTVBVIENhY2hlYWJsZSBBY2Nlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX0NBQ0hFQUJMRSAgICAgICAgICAgIE1QVV9SQVNSX0NfTXNrICAgLyohPCBDYWNoZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUgICAgICAgIDB4MDBVICAgICAgICAgICAgLyohPCBOb3QgQ2FjaGVhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0JVRkZFUkFCTEVfQUNDRVNTIE1QVSBCdWZmZXJhYmxlIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfQlVGRkVSQUJMRSAgICAgICAgICAgTVBVX1JBU1JfQl9Nc2sgICAvKiE8IEJ1ZmZlcmFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworI2RlZmluZSBMTF9NUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFICAgICAgIDB4MDBVICAgICAgICAgICAgLyohPCBOb3QgQnVmZmVyYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09SVEVYIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX1NZU1RJQ0sgU1lTVElDSworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIFN5c3RpY2sgY291bnRlciBmbGFnIGlzIGFjdGl2ZSBvciBub3QuCisgICogQG5vdGUgICBJdCBjYW4gYmUgdXNlZCBpbiB0aW1lb3V0IGZ1bmN0aW9uIG9uIGFwcGxpY2F0aW9uIHNpZGUuCisgICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ09VTlRGTEFHICAgICBMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcodm9pZCkKK3sKKyAgcmV0dXJuICgoKFN5c1RpY2stPkNUUkwgJiBTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykgPT0gKFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgQ0xLU09VUkNFICAgICBMTF9TWVNUSUNLX1NldENsa1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19TZXRDbGtTb3VyY2UodWludDMyX3QgU291cmNlKQoreworICBpZiAoU291cmNlID09IExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspCisgIHsKKyAgICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspOworICB9CisgIGVsc2UKKyAgeworICAgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDTEtTT1VSQ0UgICAgIExMX1NZU1RJQ0tfR2V0Q2xrU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0dldENsa1NvdXJjZSh2b2lkKQoreworICByZXR1cm4gUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFN5c1RpY2sgZXhjZXB0aW9uIHJlcXVlc3QKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfRW5hYmxlSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfRW5hYmxlSVQodm9pZCkKK3sKKyAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdAorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19EaXNhYmxlSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU1RJQ0tfRGlzYWJsZUlUKHZvaWQpCit7CisgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLCBTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiB0aGUgU1lTVElDSyBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBUSUNLSU5UICAgICAgIExMX1NZU1RJQ0tfSXNFbmFibGVkSVQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNUSUNLX0lzRW5hYmxlZElUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zaykgPT0gKFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTE9XX1BPV0VSX01PREUgTE9XIFBPV0VSIE1PREUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIHNsZWVwIGFzIGl0cyBsb3cgcG93ZXIgbW9kZQorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQREVFUCAgICAgTExfTFBNX0VuYWJsZVNsZWVwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlU2xlZXAodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3NvciB1c2VzIGRlZXAgc2xlZXAgYXMgaXRzIGxvdyBwb3dlciBtb2RlCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBERUVQICAgICBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlRGVlcFNsZWVwKHZvaWQpCit7CisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgc2xlZXAtb24tZXhpdCB3aGVuIHJldHVybmluZyBmcm9tIEhhbmRsZXIgbW9kZSB0byBUaHJlYWQgbW9kZS4KKyAgKiBAbm90ZSAgIFNldHRpbmcgdGhpcyBiaXQgdG8gMSBlbmFibGVzIGFuIGludGVycnVwdC1kcml2ZW4gYXBwbGljYXRpb24gdG8gYXZvaWQgcmV0dXJuaW5nIHRvIGFuCisgICogICAgICAgICBlbXB0eSBtYWluIGFwcGxpY2F0aW9uLgorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQT05FWElUICAgTExfTFBNX0VuYWJsZVNsZWVwT25FeGl0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogU2V0IFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERvIG5vdCBzbGVlcCB3aGVuIHJldHVybmluZyB0byBUaHJlYWQgbW9kZS4KKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUE9ORVhJVCAgIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGVkIGV2ZW50cyBhbmQgYWxsIGludGVycnVwdHMsIGluY2x1ZGluZyBkaXNhYmxlZCBpbnRlcnJ1cHRzLCBjYW4gd2FrZXVwIHRoZQorICAqICAgICAgICAgcHJvY2Vzc29yLgorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0VuYWJsZUV2ZW50T25QZW5kCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRW5hYmxlRXZlbnRPblBlbmQodm9pZCkKK3sKKyAgLyogU2V0IFNFVkVPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE9ubHkgZW5hYmxlZCBpbnRlcnJ1cHRzIG9yIGV2ZW50cyBjYW4gd2FrZXVwIHRoZSBwcm9jZXNzb3IsIGRpc2FibGVkIGludGVycnVwdHMgYXJlCisgICogICAgICAgICBleGNsdWRlZAorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNFVkVPTlBFTkQgICAgTExfTFBNX0Rpc2FibGVFdmVudE9uUGVuZAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0Rpc2FibGVFdmVudE9uUGVuZCh2b2lkKQoreworICAvKiBDbGVhciBTRVZFT05QRU5EIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9NQ1VfSU5GTyBNQ1UgSU5GTworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEltcGxlbWVudGVyIGNvZGUKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBJTVBMRU1FTlRFUiAgIExMX0NQVUlEX0dldEltcGxlbWVudGVyCisgICogQHJldHZhbCBWYWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gMHg0MSBmb3IgQVJNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0SW1wbGVtZW50ZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX0lNUExFTUVOVEVSX01zaykgPj4gU0NCX0NQVUlEX0lNUExFTUVOVEVSX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFZhcmlhbnQgbnVtYmVyIChUaGUgciB2YWx1ZSBpbiB0aGUgcm5wbiBwcm9kdWN0IHJldmlzaW9uIGlkZW50aWZpZXIpCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgVkFSSUFOVCAgICAgICBMTF9DUFVJRF9HZXRWYXJpYW50CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgwOiByZXZpc2lvbiAwKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFZhcmlhbnQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX1ZBUklBTlRfTXNrKSA+PiBTQ0JfQ1BVSURfVkFSSUFOVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBcmNoaXRlY3R1cmUgbnVtYmVyCisgICogQHJtdG9sbCBTQ0JfQ1BVSUQgICAgQVJDSElURUNUVVJFICBMTF9DUFVJRF9HZXRBcmNoaXRlY3R1cmUKKyAgKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweEMgZm9yIENvcnRleC1NMCsgZGV2aWNlcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldEFyY2hpdGVjdHVyZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfQVJDSElURUNUVVJFX01zaykgPj4gU0NCX0NQVUlEX0FSQ0hJVEVDVFVSRV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQYXJ0IG51bWJlcgorICAqIEBybXRvbGwgU0NCX0NQVUlEICAgIFBBUlROTyAgICAgICAgTExfQ1BVSURfR2V0UGFyTm8KKyAgKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweEM2MCBmb3IgQ29ydGV4LU0wKworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFBhck5vKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9QQVJUTk9fTXNrKSA+PiBTQ0JfQ1BVSURfUEFSVE5PX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJldmlzaW9uIG51bWJlciAoVGhlIHAgdmFsdWUgaW4gdGhlIHJucG4gcHJvZHVjdCByZXZpc2lvbiBpZGVudGlmaWVyLCBpbmRpY2F0ZXMgcGF0Y2ggcmVsZWFzZSkKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBSRVZJU0lPTiAgICAgIExMX0NQVUlEX0dldFJldmlzaW9uCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgxOiBwYXRjaCAxKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFJldmlzaW9uKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9SRVZJU0lPTl9Nc2spID4+IFNDQl9DUFVJRF9SRVZJU0lPTl9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgX19NUFVfUFJFU0VOVAorLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTVBVIE1QVQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE1QVSB3aXRoIGlucHV0IG9wdGlvbnMKKyAgKiBAcm10b2xsIE1QVV9DVFJMICAgICBFTkFCTEUgICAgICAgIExMX01QVV9FbmFibGUKKyAgKiBAcGFyYW0gIE9wdGlvbnMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IQVJERkFVTFRfTk1JCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0VuYWJsZSh1aW50MzJfdCBPcHRpb25zKQoreworICAvKiBFbmFibGUgdGhlIE1QVSovCisgIFdSSVRFX1JFRyhNUFUtPkNUUkwsIChNUFVfQ1RSTF9FTkFCTEVfTXNrIHwgT3B0aW9ucykpOworICAvKiBFbnN1cmUgTVBVIHNldHRpbmdzIHRha2UgZWZmZWN0cyAqLworICBfX0RTQigpOworICAvKiBTZXF1ZW5jZSBpbnN0cnVjdGlvbiBmZXRjaGVzIHVzaW5nIHVwZGF0ZSBzZXR0aW5ncyAqLworICBfX0lTQigpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTVBVCisgICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0Rpc2FibGUodm9pZCkKK3sKKyAgLyogTWFrZSBzdXJlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBhcmUgZG9uZSAqLworICBfX0RNQigpOworICAvKiBEaXNhYmxlIE1QVSovCisgIFdSSVRFX1JFRyhNUFUtPkNUUkwsIDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBNUFUgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIE1QVV9DVFJMICAgICBFTkFCTEUgICAgICAgIExMX01QVV9Jc0VuYWJsZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9NUFVfSXNFbmFibGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKE1QVS0+Q1RSTCwgTVBVX0NUUkxfRU5BQkxFX01zaykgPT0gKE1QVV9DVFJMX0VOQUJMRV9Nc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGEgTVBVIHJlZ2lvbgorICAqIEBybXRvbGwgTVBVX1JBU1IgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0VuYWJsZVJlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBFbmFibGUgdGhlIE1QVSByZWdpb24gKi8KKyAgU0VUX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGEgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQkFSICAgICBSRUdJT04gICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JCQVIgICAgIEFERFIgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgWE4gICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBBUCAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFMgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgQyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBCICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFNJWkUgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHBhcmFtICBBZGRyZXNzIFZhbHVlIG9mIHJlZ2lvbiBiYXNlIGFkZHJlc3MKKyAgKiBAcGFyYW0gIFN1YlJlZ2lvbkRpc2FibGUgU3ViLXJlZ2lvbiBkaXNhYmxlIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYKKyAgKiBAcGFyYW0gIEF0dHJpYnV0ZXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1NkIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xS0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV84S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTZLQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8zMktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMjU2S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyS0IKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMU1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzJNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV80TUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2TUIKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzEyOE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMk1CCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFHQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yR0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNEdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OT19BQ0NFU1Mgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUlcgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUldfVVJPIG9yIEByZWYgTExfTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUworICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fUFJJVl9STyBvciBAcmVmIExMX01QVV9SRUdJT05fUFJJVl9ST19VUk8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfVEVYX0xFVkVMMCBvciBAcmVmIExMX01QVV9URVhfTEVWRUwxIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDIgb3IgQHJlZiBMTF9NUFVfVEVYX0xFVkVMNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFIG9yICBAcmVmIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfU0hBUkVBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19DQUNIRUFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX0JVRkZFUkFCTEUgb3IgQHJlZiBMTF9NUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfQ29uZmlnUmVnaW9uKHVpbnQzMl90IFJlZ2lvbiwgdWludDMyX3QgU3ViUmVnaW9uRGlzYWJsZSwgdWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgQXR0cmlidXRlcykKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBTZXQgYmFzZSBhZGRyZXNzICovCisgIFdSSVRFX1JFRyhNUFUtPlJCQVIsIChBZGRyZXNzICYgMHhGRkZGRkZFMFUpKTsKKyAgLyogQ29uZmlndXJlIE1QVSAqLworICBXUklURV9SRUcoTVBVLT5SQVNSLCAoTVBVX1JBU1JfRU5BQkxFX01zayB8IEF0dHJpYnV0ZXMgfCAoU3ViUmVnaW9uRGlzYWJsZSA8PCBNUFVfUkFTUl9TUkRfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYSByZWdpb24KKyAgKiBAcm10b2xsIE1QVV9STlIgICAgICBSRUdJT04gICAgICAgIExMX01QVV9EaXNhYmxlUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBFTkFCTEUgICAgICAgIExMX01QVV9EaXNhYmxlUmVnaW9uCisgICogQHBhcmFtICBSZWdpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfUkVHSU9OX05VTUJFUjcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX01QVV9EaXNhYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBEaXNhYmxlIHRoZSBNUFUgcmVnaW9uICovCisgIENMRUFSX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9DT1JURVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9jcmMuaCBiL0luYy9zdG0zMmcweHhfbGxfY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiNTExNgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfY3JjLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfY3JjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX0NSQ19ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9DUkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JDKQorCisvKiogQGRlZmdyb3VwIENSQ19MTCBDUkMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDUkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfUE9MWUxFTkdUSCBQb2x5bm9taWFsIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDMyIGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzE2QiAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDE2IGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzhCICAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggYml0cyBQb2x5bm9taWFsIHNpemUgKi8KKyNkZWZpbmUgTExfQ1JDX1BPTFlMRU5HVEhfN0IgICAgICAgICAgICAgICAoQ1JDX0NSX1BPTFlTSVpFXzEgfCBDUkNfQ1JfUE9MWVNJWkVfMCkgIC8qITwgNyBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfSU5EQVRBX1JFVkVSU0UgSW5wdXQgRGF0YSBSZXZlcnNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgb3JkZXIgbm90IGFmZmVjdGVkICovCisjZGVmaW5lIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9CWVRFICAgICAgICAgQ1JDX0NSX1JFVl9JTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IERhdGEgYml0IHJldmVyc2FsIGRvbmUgYnkgYnl0ZSAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfSEFMRldPUkQgICAgIENSQ19DUl9SRVZfSU5fMSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGhhbGYtd29yZCAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfV09SRCAgICAgICAgIChDUkNfQ1JfUkVWX0lOXzEgfCBDUkNfQ1JfUkVWX0lOXzApICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IHdvcmQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX09VVERBVEFfUkVWRVJTRSBPdXRwdXQgRGF0YSBSZXZlcnNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9OT05FICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBEYXRhIGJpdCBvcmRlciBub3QgYWZmZWN0ZWQgKi8KKyNkZWZpbmUgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9CSVQgICAgICAgICBDUkNfQ1JfUkVWX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfRGVmYXVsdF9Qb2x5bm9taWFsX1ZhbHVlICAgIERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB2YWx1ZQorICAqIEBicmllZiAgICBOb3JtYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwb2x5bm9taWFsIHZhbHVlIGlzCisgICogICAgICAgICAgIFheMzIgKyBYXjI2ICsgWF4yMyArIFheMjIgKyBYXjE2ICsgWF4xMiArIFheMTEgKyBYXjEwICtYXjggKyBYXjcgKyBYXjUgKyBYXjQgKyBYXjIgKyBYICsgMSAuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0RFRkFVTFRfQ1JDMzJfUE9MWSAgICAgICAgICAweDA0QzExREI3VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUNfRGVmYXVsdF9Jbml0VmFsdWUgICAgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DUkNfREVGQVVMVF9DUkNfSU5JVFZBTFVFICAgICAgIDB4RkZGRkZGRkZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVmYXVsdCBDUkMgY29tcHV0YXRpb24gaW5pdGlhbGl6YXRpb24gdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19MTF9FeHBvcnRlZF9NYWNyb3MgQ1JDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ1JDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9DUkNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIF9fVkFMVUVfXykKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gQ1JDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0NSQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FRl9Db25maWd1cmF0aW9uIENSQyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIENSQyBjYWxjdWxhdGlvbiB1bml0LgorICAqIEBub3RlICAgSWYgUHJvZ3JhbW1hYmxlIEluaXRpYWwgQ1JDIHZhbHVlIGZlYXR1cmUKKyAgKiAgICAgICAgIGlzIGF2YWlsYWJsZSwgYWxzbyBzZXQgdGhlIERhdGEgUmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUKKyAgKiAgICAgICAgIENSQ19JTklUIHJlZ2lzdGVyLCBvdGhlcndpc2UsIHJlc2V0IERhdGEgUmVnaXN0ZXIgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVTRVQgICAgICAgICBMTF9DUkNfUmVzZXRDUkNDYWxjdWxhdGlvblVuaXQKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfUmVzZXRDUkNDYWxjdWxhdGlvblVuaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIFNFVF9CSVQoQ1JDeC0+Q1IsIENSQ19DUl9SRVNFVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNpemUgb2YgdGhlIHBvbHlub21pYWwuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUE9MWVNJWkUgICAgICBMTF9DUkNfU2V0UG9seW5vbWlhbFNpemUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBQb2x5U2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzMyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzE2QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfN0IKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRQb2x5bm9taWFsU2l6ZShDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgUG9seVNpemUpCit7CisgIE1PRElGWV9SRUcoQ1JDeC0+Q1IsIENSQ19DUl9QT0xZU0laRSwgUG9seVNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBzaXplIG9mIHRoZSBwb2x5bm9taWFsLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBPTFlTSVpFICAgICAgTExfQ1JDX0dldFBvbHlub21pYWxTaXplCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8zMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzdCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldFBvbHlub21pYWxTaXplKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUkN4LT5DUiwgQ1JDX0NSX1BPTFlTSVpFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSByZXZlcnNhbCBvZiB0aGUgYml0IG9yZGVyIG9mIHRoZSBpbnB1dCBkYXRhCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVWX0lOICAgICAgICBMTF9DUkNfU2V0SW5wdXREYXRhUmV2ZXJzZU1vZGUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBSZXZlcnNlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfV09SRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldElucHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBSZXZlcnNlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhDUkN4LT5DUiwgQ1JDX0NSX1JFVl9JTiwgUmV2ZXJzZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0eXBlIG9mIHJldmVyc2FsIGZvciBpbnB1dCBkYXRhIGJpdCBvcmRlcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFVl9JTiAgICAgICAgTExfQ1JDX0dldElucHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX1dPUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0SW5wdXREYXRhUmV2ZXJzZU1vZGUoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUkVWX0lOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSByZXZlcnNhbCBvZiB0aGUgYml0IG9yZGVyIG9mIHRoZSBPdXRwdXQgZGF0YQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFVl9PVVQgICAgICAgTExfQ1JDX1NldE91dHB1dERhdGFSZXZlcnNlTW9kZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJldmVyc2VNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX09VVERBVEFfUkVWRVJTRV9CSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IFJldmVyc2VNb2RlKQoreworICBNT0RJRllfUkVHKENSQ3gtPkNSLCBDUkNfQ1JfUkVWX09VVCwgUmV2ZXJzZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcmV2ZXJzYWwgb2YgdGhlIGJpdCBvcmRlciBvZiB0aGUgT3V0cHV0IGRhdGEKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfT1VUICAgICAgIExMX0NSQ19HZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfQklUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldE91dHB1dERhdGFSZXZlcnNlTW9kZShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JDeC0+Q1IsIENSQ19DUl9SRVZfT1VUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUHJvZ3JhbW1hYmxlIGluaXRpYWwgQ1JDIHZhbHVlLgorICAqIEBub3RlICAgSWYgdGhlIENSQyBzaXplIGlzIGxlc3MgdGhhbiAzMiBiaXRzLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworICAqICAgICAgICAgYXJlIHVzZWQgdG8gd3JpdGUgdGhlIGNvcnJlY3QgdmFsdWUKKyAgKiBAbm90ZSAgIExMX0NSQ19ERUZBVUxUX0NSQ19JTklUVkFMVUUgY291bGQgYmUgdXNlZCBhcyB2YWx1ZSBmb3IgSW5pdENyYyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBJTklUICAgICAgICAgSU5JVCAgICAgICAgICBMTF9DUkNfU2V0SW5pdGlhbERhdGEKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbml0Q3JjIFZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gUHJvZ3JhbW1hYmxlIGluaXRpYWwgQ1JDIHZhbHVlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0SW5pdGlhbERhdGEoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IEluaXRDcmMpCit7CisgIFdSSVRFX1JFRyhDUkN4LT5JTklULCBJbml0Q3JjKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBJbml0aWFsIENSQyB2YWx1ZS4KKyAgKiBAbm90ZSAgIElmIHRoZSBDUkMgc2l6ZSBpcyBsZXNzIHRoYW4gMzIgYml0cywgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKyAgKiAgICAgICAgIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGNvcnJlY3QgdmFsdWUKKyAgKiBAcm10b2xsIElOSVQgICAgICAgICBJTklUICAgICAgICAgIExMX0NSQ19HZXRJbml0aWFsRGF0YQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIHByb2dyYW1tZWQgaW4gUHJvZ3JhbW1hYmxlIGluaXRpYWwgQ1JDIHZhbHVlIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldEluaXRpYWxEYXRhKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhDUkN4LT5JTklUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUHJvZ3JhbW1hYmxlIHBvbHlub21pYWwgdmFsdWUKKyAgKiAgICAgICAgIChjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgdG8gYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uKS4KKyAgKiBAbm90ZSAgIExMX0NSQ19ERUZBVUxUX0NSQzMyX1BPTFkgY291bGQgYmUgdXNlZCBhcyB2YWx1ZSBmb3IgUG9seW5vbUNvZWYgcGFyYW1ldGVyLgorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIFJlZmVyZW5jZSBNYW51YWwgYW5kIGV4aXN0aW5nIEVycmF0YSBTaGVldHMsCisgICogICAgICAgICByZWdhcmRpbmcgcG9zc2libGUgbGltaXRhdGlvbnMgZm9yIFBvbHlub21pYWwgdmFsdWVzIHVzYWdlLgorICAqICAgICAgICAgRm9yIGV4YW1wbGUsIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDcsIFheNyArIFheNiArIFheNSArIFheMiArIDEgaXMgd3JpdHRlbiAweDY1CisgICogQHJtdG9sbCBQT0wgICAgICAgICAgUE9MICAgICAgICAgICBMTF9DUkNfU2V0UG9seW5vbWlhbENvZWYKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBQb2x5bm9tQ29lZiBWYWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBQb2x5bm9taWFsIHZhbHVlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0UG9seW5vbWlhbENvZWYoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IFBvbHlub21Db2VmKQoreworICBXUklURV9SRUcoQ1JDeC0+UE9MLCBQb2x5bm9tQ29lZik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgUHJvZ3JhbW1hYmxlIHBvbHlub21pYWwgdmFsdWUKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBSZWZlcmVuY2UgTWFudWFsIGFuZCBleGlzdGluZyBFcnJhdGEgU2hlZXRzLAorICAqICAgICAgICAgcmVnYXJkaW5nIHBvc3NpYmxlIGxpbWl0YXRpb25zIGZvciBQb2x5bm9taWFsIHZhbHVlcyB1c2FnZS4KKyAgKiAgICAgICAgIEZvciBleGFtcGxlLCBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3LCBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxIGlzIHdyaXR0ZW4gMHg2NQorICAqIEBybXRvbGwgUE9MICAgICAgICAgIFBPTCAgICAgICAgICAgTExfQ1JDX0dldFBvbHlub21pYWxDb2VmCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgcHJvZ3JhbW1lZCBpbiBQcm9ncmFtbWFibGUgUG9seW5vbWlhbCB2YWx1ZSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRQb2x5bm9taWFsQ29lZihDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoQ1JDeC0+UE9MKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGdpdmVuIDMyLWJpdCBkYXRhIHRvIHRoZSBDUkMgY2FsY3VsYXRvcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX0ZlZWREYXRhMzIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbkRhdGEgdmFsdWUgdG8gYmUgcHJvdmlkZWQgdG8gQ1JDIGNhbGN1bGF0b3IgYmV0d2VlbiBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19GZWVkRGF0YTMyKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBJbkRhdGEpCit7CisgIFdSSVRFX1JFRyhDUkN4LT5EUiwgSW5EYXRhKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBnaXZlbiAxNi1iaXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19GZWVkRGF0YTE2CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIDE2IGJpdCB2YWx1ZSB0byBiZSBwcm92aWRlZCB0byBDUkMgY2FsY3VsYXRvciBiZXR3ZWVuIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfRmVlZERhdGExNihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDE2X3QgSW5EYXRhKQoreworICBfX0lPIHVpbnQxNl90ICpwUmVnOworCisgIHBSZWcgPSAoX19JTyB1aW50MTZfdCAqKShfX0lPIHZvaWQgKikoJkNSQ3gtPkRSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcm9nYXRpb24gTWlzcmFDMjAxMiBSLjExLjUgKi8KKyAgKnBSZWcgPSBJbkRhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgZ2l2ZW4gOC1iaXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19GZWVkRGF0YTgKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBJbkRhdGEgOCBiaXQgdmFsdWUgdG8gYmUgcHJvdmlkZWQgdG8gQ1JDIGNhbGN1bGF0b3IgYmV0d2VlbiBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19GZWVkRGF0YTgoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQ4X3QgSW5EYXRhKQoreworICAqKHVpbnQ4X3QgX19JTyAqKSgmQ1JDeC0+RFIpID0gKHVpbnQ4X3QpIEluRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiAzMiBiaXRzIHZhbHVlIGlzIHJldHVybmVkLgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhMzIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBDdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQgYXMgc3RvcmVkIGluIENSQ19EUiByZWdpc3RlciAoMzIgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX1JlYWREYXRhMzIoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdC4gMTYgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDE2IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhMTYKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBDdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQgYXMgc3RvcmVkIGluIENSQ19EUiByZWdpc3RlciAoMTYgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQ1JDX1JlYWREYXRhMTYoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDE2X3QpUkVBRF9SRUcoQ1JDeC0+RFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDggYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDggYml0cyBDUkMgcG9seW5vbWlhbCBzaXplIGNvbnRleHQuCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfUmVhZERhdGE4CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDggYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9DUkNfUmVhZERhdGE4KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpUkVBRF9SRUcoQ1JDeC0+RFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDcgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBhIDcgYml0cyBDUkMgcG9seW5vbWlhbCBzaXplIGNvbnRleHQuCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfUmVhZERhdGE3CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDcgYml0cykuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9DUkNfUmVhZERhdGE3KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfUkVHKENSQ3gtPkRSKSAmIDB4N0ZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZGF0YSBzdG9yZWQgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSURSKSByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbiBmb3Igb25lIDMyLWJpdCBsb25nIGRhdGEuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSURSICAgICAgICAgICBMTF9DUkNfUmVhZF9JRFIKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBzdG9yZWQgaW4gQ1JDX0lEUiByZWdpc3RlciAoR2VuZXJhbC1wdXJwb3NlIDMyLWJpdCBkYXRhIHJlZ2lzdGVyKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfUmVhZF9JRFIoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPklEUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3JlIGRhdGEgaW4gdGhlIEluZGVwZW5kZW50IERhdGEoSURSKSByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBsb2NhdGlvbiBmb3Igb25lIDMyLWJpdCBsb25nIGRhdGEuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSURSICAgICAgICAgICBMTF9DUkNfV3JpdGVfSURSCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBDUkNfSURSIHJlZ2lzdGVyICgzMi1iaXQpIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1dyaXRlX0lEUihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgSW5EYXRhKQoreworICAqKCh1aW50MzJfdCBfX0lPICopKCZDUkN4LT5JRFIpKSA9ICh1aW50MzJfdCkgSW5EYXRhOworfQorLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBDUkNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfQ1JDX0RlSW5pdChDUkNfVHlwZURlZiAqQ1JDeCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKENSQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9kYWMuaCBiL0luYy9zdG0zMmcweHhfbGxfZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4ZWFjNAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfZGFjLmgKQEAgLTAsMCArMSwxNzc1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2RhYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBEQUMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9EQUNfSAorI2RlZmluZSBTVE0zMkcweHhfTExfREFDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKERBQzEpCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMIERBQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfTExfUHJpdmF0ZV9Db25zdGFudHMgREFDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogSW50ZXJuYWwgbWFza3MgZm9yIERBQyBjaGFubmVscyBkZWZpbml0aW9uICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0RBQ19DSEFOTkVMX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGJpdHMgcG9zaXRpb24gaW50byByZWdpc3RlcnMgQ1IsIE1DUiwgQ0NSLCBTSEhSLCBTSFJSICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBiaXRzIHBvc2l0aW9uIGludG8gcmVnaXN0ZXIgU1dUUklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgcmVnaXN0ZXIgb2Zmc2V0IG9mIGRhdGEgaG9sZGluZyByZWdpc3RlciBESFJ4ICAgICAgICAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIHJlZ2lzdGVyIG9mZnNldCBvZiBkYXRhIG91dHB1dCByZWdpc3RlciBET1J4ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCByZWdpc3RlciBvZmZzZXQgb2Ygc2FtcGxlLWFuZC1ob2xkIHNhbXBsZSB0aW1lIHJlZ2lzdGVyIFNIU1J4ICAgICovCisjZGVmaW5lIERBQ19DUl9DSDFfQklUT0ZGU0VUICAgICAgICAgICAwVSAgICAvKiBQb3NpdGlvbiBvZiBjaGFubmVsIGJpdHMgaW50byByZWdpc3RlcnMgQ1IsIE1DUiwgQ0NSLCBTSEhSLCBTSFJSIG9mIGNoYW5uZWwgMSAqLworI2RlZmluZSBEQUNfQ1JfQ0gyX0JJVE9GRlNFVCAgICAgICAgICAgMTZVICAgLyogUG9zaXRpb24gb2YgY2hhbm5lbCBiaXRzIGludG8gcmVnaXN0ZXJzIENSLCBNQ1IsIENDUiwgU0hIUiwgU0hSUiBvZiBjaGFubmVsIDIgKi8KKyNkZWZpbmUgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyAgICAgIChEQUNfQ1JfQ0gxX0JJVE9GRlNFVCB8IERBQ19DUl9DSDJfQklUT0ZGU0VUKQorCisjZGVmaW5lIERBQ19TV1RSX0NIMSAgICAgICAgICAgICAgICAgICAoREFDX1NXVFJJR1JfU1dUUklHMSkgLyogQ2hhbm5lbCBiaXQgaW50byByZWdpc3RlciBTV1RSSUdSIG9mIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUgREFDX1NXVFJfQ0gyICAgICAgICAgICAgICAgICAgIChEQUNfU1dUUklHUl9TV1RSSUcyKSAvKiBDaGFubmVsIGJpdCBpbnRvIHJlZ2lzdGVyIFNXVFJJR1Igb2YgY2hhbm5lbCAyLiAqLworI2RlZmluZSBEQUNfU1dUUl9DSFhfTUFTSyAgICAgICAgICAgICAgKERBQ19TV1RSX0NIMSB8IERBQ19TV1RSX0NIMikKKworI2RlZmluZSBEQUNfUkVHX0RIUjEyUjFfUkVHT0ZGU0VUICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgREhSMTJSeCBjaGFubmVsIDEgdGFrZW4gYXMgcmVmZXJlbmNlICovCisjZGVmaW5lIERBQ19SRUdfREhSMTJMMV9SRUdPRkZTRVQgICAgICAweDAwMTAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgREhSMTJMeCBjaGFubmVsIDEgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjAgYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ESFI4UjFfUkVHT0ZGU0VUICAgICAgIDB4MDIwMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBESFI4UnggIGNoYW5uZWwgMSB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyNCBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjEyUjJfUkVHT0ZGU0VUICAgICAgMHgzMDAwMDAwMFUgICAgICAgICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjEyUnggY2hhbm5lbCAyIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDI4IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSMTJMMl9SRUdPRkZTRVQgICAgICAweDAwNDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgREhSMTJMeCBjaGFubmVsIDIgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjAgYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ESFI4UjJfUkVHT0ZGU0VUICAgICAgIDB4MDUwMDAwMDBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBESFI4UnggIGNoYW5uZWwgMiB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyNCBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX01BU0sgMHhGMDAwMDAwMFUKKyNkZWZpbmUgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9NQVNLIDB4MDBGMDAwMDBVCisjZGVmaW5lIERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9NQVNLICAweDBGMDAwMDAwVQorI2RlZmluZSBEQUNfUkVHX0RIUlhfUkVHT0ZGU0VUX01BU0sgICAgKERBQ19SRUdfREhSMTJSWF9SRUdPRkZTRVRfTUFTSyB8IERBQ19SRUdfREhSMTJMWF9SRUdPRkZTRVRfTUFTSyB8IERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9NQVNLKQorCisjZGVmaW5lIERBQ19SRUdfRE9SMV9SRUdPRkZTRVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBET1J4IGNoYW5uZWwgMSB0YWtlbiBhcyByZWZlcmVuY2UgKi8KKyNkZWZpbmUgREFDX1JFR19ET1IyX1JFR09GRlNFVCAgICAgICAgIDB4MDAwMDAwMjBVICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIG9mZnNldCBvZiBET1J4IGNoYW5uZWwgMSB2ZXJzdXMgRE9SeCBjaGFubmVsIDIgKHNoaWZ0ZWQgbGVmdCBvZiA1IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfTUFTSyAgICAoREFDX1JFR19ET1IxX1JFR09GRlNFVCB8IERBQ19SRUdfRE9SMl9SRUdPRkZTRVQpCisjZGVmaW5lIERBQ19SRUdfU0hTUjFfUkVHT0ZGU0VUICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBTSFNSeCBjaGFubmVsIDEgdGFrZW4gYXMgcmVmZXJlbmNlICovCisjZGVmaW5lIERBQ19SRUdfU0hTUjJfUkVHT0ZGU0VUICAgICAgICAweDAwMDAwMDQwVSAgICAgICAgICAgICAvKiBSZWdpc3RlciBvZmZzZXQgb2YgU0hTUnggY2hhbm5lbCAxIHZlcnN1cyBTSFNSeCBjaGFubmVsIDIgKHNoaWZ0ZWQgbGVmdCBvZiA2IGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfU0hTUlhfUkVHT0ZGU0VUX01BU0sgICAoREFDX1JFR19TSFNSMV9SRUdPRkZTRVQgfCBEQUNfUkVHX1NIU1IyX1JFR09GRlNFVCkKKworCisjZGVmaW5lIERBQ19SRUdfREhSX1JFR09GRlNFVF9NQVNLX1BPU0JJVDAgICAgICAgICAweDAwMDAwMDBGVSAgLyogTWFzayBvZiBkYXRhIGhvbGQgcmVnaXN0ZXJzIG9mZnNldCAoREhSMTJSeCwgREhSMTJMeCwgREhSOFJ4LCAuLi4pIHdoZW4gc2hpZnRlZCB0byBwb3NpdGlvbiAwICovCisjZGVmaW5lIERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfTUFTS19QT1NCSVQwICAgICAgICAweDAwMDAwMDAxVSAgLyogTWFzayBvZiBET1J4IHJlZ2lzdGVycyBvZmZzZXQgd2hlbiBzaGlmdGVkIHRvIHBvc2l0aW9uIDAgKi8KKyNkZWZpbmUgREFDX1JFR19TSFNSWF9SRUdPRkZTRVRfTUFTS19QT1NCSVQwICAgICAgIDB4MDAwMDAwMDFVICAvKiBNYXNrIG9mIFNIU1J4IHJlZ2lzdGVycyBvZmZzZXQgd2hlbiBzaGlmdGVkIHRvIHBvc2l0aW9uIDAgKi8KKworI2RlZmluZSBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgICAgICAgICAgIDI4VSAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgcmVnaXN0ZXIgb2Zmc2V0IG9mIERIUjEyUnggY2hhbm5lbCAxIG9yIDIgdmVyc3VzIERIUjEyUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgMjggYml0cykgKi8KKyNkZWZpbmUgREFDX1JFR19ESFIxMkxYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAyMFUgICAvKiBQb3NpdGlvbiBvZiBiaXRzIHJlZ2lzdGVyIG9mZnNldCBvZiBESFIxMkx4IGNoYW5uZWwgMSBvciAyIHZlcnN1cyBESFIxMlJ4IGNoYW5uZWwgMSAoc2hpZnRlZCBsZWZ0IG9mIDIwIGJpdHMpICovCisjZGVmaW5lIERBQ19SRUdfREhSOFJYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgMjRVICAgLyogUG9zaXRpb24gb2YgYml0cyByZWdpc3RlciBvZmZzZXQgb2YgREhSOFJ4ICBjaGFubmVsIDEgb3IgMiB2ZXJzdXMgREhSMTJSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiAyNCBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX0RPUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgICAgICAgICAgICAgICA1VSAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgcmVnaXN0ZXIgb2Zmc2V0IG9mIERPUnggY2hhbm5lbCAxIG9yIDIgdmVyc3VzIERPUnggY2hhbm5lbCAxIChzaGlmdGVkIGxlZnQgb2YgNSBiaXRzKSAqLworI2RlZmluZSBEQUNfUkVHX1NIU1JYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICA2VSAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgcmVnaXN0ZXIgb2Zmc2V0IG9mIFNIU1J4IGNoYW5uZWwgMSBvciAyIHZlcnN1cyBTSFNSeCBjaGFubmVsIDEgKHNoaWZ0ZWQgbGVmdCBvZiA2IGJpdHMpICovCisKKy8qIERBQyByZWdpc3RlcnMgYml0cyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgREFDX0RIUjEyUkRfREFDQzJESFJfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICBEQUNfREhSMTJSRF9EQUNDMkRIUl9Qb3MKKyNkZWZpbmUgREFDX0RIUjEyTERfREFDQzJESFJfQklUT0ZGU0VUX1BPUyAgICAgICAgICAgICAgICBEQUNfREhSMTJMRF9EQUNDMkRIUl9Qb3MKKyNkZWZpbmUgREFDX0RIUjhSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TICAgICAgICAgICAgICAgICBEQUNfREhSOFJEX0RBQ0MyREhSX1BvcworCisvKiBNaXNjZWxsYW5lb3VzIGRhdGEgKi8KKyNkZWZpbmUgREFDX0RJR0lUQUxfU0NBTEVfMTJCSVRTICAgICAgICAgICAgICAgICAgICAgICAgNDA5NVUgIC8qIEZ1bGwtc2NhbGUgZGlnaXRhbCB2YWx1ZSB3aXRoIGEgcmVzb2x1dGlvbiBvZiAxMiBiaXRzICh2b2x0YWdlIHJhbmdlIGRldGVybWluZWQgYnkgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlcyBWcmVmKyBhbmQgVnJlZi0sIHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX1ByaXZhdGVfTWFjcm9zIERBQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRHJpdmVyIG1hY3JvIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2U6IHNldCBhIHBvaW50ZXIgdG8KKyAgKiAgICAgICAgIGEgcmVnaXN0ZXIgZnJvbSBhIHJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggYW4gb2Zmc2V0CisgICogICAgICAgICBpcyBhcHBsaWVkLgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciBiYXNpcyBmcm9tIHdoaWNoIHRoZSBvZmZzZXQgaXMgYXBwbGllZC4KKyAgKiBAcGFyYW0gIF9fUkVHX09GRkZTRVRfXyBPZmZzZXQgdG8gYmUgYXBwbGllZCAodW5pdDogbnVtYmVyIG9mIHJlZ2lzdGVycykuCisgICogQHJldHZhbCBQb2ludGVyIHRvIHJlZ2lzdGVyIGFkZHJlc3MKKyovCisjZGVmaW5lIF9fREFDX1BUUl9SRUdfT0ZGU0VUKF9fUkVHX18sIF9fUkVHX09GRkZTRVRfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQzMl90ICopKCh1aW50MzJfdCkgKCh1aW50MzJfdCkoJihfX1JFR19fKSkgKyAoKF9fUkVHX09GRkZTRVRfXykgPDwgMlUpKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VTX0lOSVQgREFDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIERBQyBpbnN0YW5jZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyaWdnZXJTb3VyY2U7ICAgICAgICAgICAgICAgLyohPCBTZXQgdGhlIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDogaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERBQ19MTF9FQ19UUklHR0VSX1NPVVJDRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlKCkuICovCisKKyAgdWludDMyX3QgV2F2ZUF1dG9HZW5lcmF0aW9uOyAgICAgICAgICAvKiE8IFNldCB0aGUgd2F2ZWZvcm0gYXV0b21hdGljIGdlbmVyYXRpb24gbW9kZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24oKS4gKi8KKworICB1aW50MzJfdCBXYXZlQXV0b0dlbmVyYXRpb25Db25maWc7ICAgIC8qITwgU2V0IHRoZSB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGlzIHNldCB0byBub2lzZSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9OT0lTRV9MRlNSX1VOTUFTS19CSVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB3YXZlZm9ybSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBtb2RlIGlzIHNldCB0byB0cmlhbmdsZSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfV0FWRV9UUklBTkdMRV9BTVBMSVRVREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIElmIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0V2F2ZU5vaXNlTEZTUigpLCBAcmVmIExMX0RBQ19TZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB3YXZlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIHNlbGVjdGVkLiAqLworCisgIHVpbnQzMl90IE91dHB1dEJ1ZmZlcjsgICAgICAgICAgICAgICAgLyohPCBTZXQgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX0xMX0VDX09VVFBVVF9CVUZGRVIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0T3V0cHV0QnVmZmVyKCkuICovCisKKworICB1aW50MzJfdCBPdXRwdXRDb25uZWN0aW9uOyAgICAgICAgICAgIC8qITwgU2V0IHRoZSBvdXRwdXQgY29ubmVjdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQUNfTExfRUNfT1VUUFVUX0NPTk5FQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9EQUNfU2V0T3V0cHV0Q29ubmVjdGlvbigpLiAqLworCisgIHVpbnQzMl90IE91dHB1dE1vZGU7ICAgICAgICAgICAgICAgICAgLyohPCBTZXQgdGhlIG91dHB1dCBtb2RlIG5vcm1hbCBvciBzYW1wbGUtYW5kLWhvbGQgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgREFDX0xMX0VDX09VVFBVVF9NT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX1NldE91dHB1dE1vZGUoKS4gKi8KK30gTExfREFDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERBQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19HRVRfRkxBRyBEQUMgZmxhZ3MKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RBQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKy8qIERBQyBjaGFubmVsIDEgZmxhZ3MgKi8KKyNkZWZpbmUgTExfREFDX0ZMQUdfRE1BVURSMSAgICAgICAgICAgICAgICAoREFDX1NSX0RNQVVEUjEpICAgLyohPCBEQUMgY2hhbm5lbCAxIGZsYWcgRE1BIHVuZGVycnVuICovCisjZGVmaW5lIExMX0RBQ19GTEFHX0NBTDEgICAgICAgICAgICAgICAgICAgKERBQ19TUl9DQUxfRkxBRzEpIC8qITwgREFDIGNoYW5uZWwgMSBmbGFnIG9mZnNldCBjYWxpYnJhdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgTExfREFDX0ZMQUdfQldTVDEgICAgICAgICAgICAgICAgICAoREFDX1NSX0JXU1QxKSAgICAgLyohPCBEQUMgY2hhbm5lbCAxIGZsYWcgYnVzeSB3cml0aW5nIHNhbXBsZSB0aW1lICovCisKKy8qIERBQyBjaGFubmVsIDIgZmxhZ3MgKi8KKyNkZWZpbmUgTExfREFDX0ZMQUdfRE1BVURSMiAgICAgICAgICAgICAgICAoREFDX1NSX0RNQVVEUjIpICAgLyohPCBEQUMgY2hhbm5lbCAyIGZsYWcgRE1BIHVuZGVycnVuICovCisjZGVmaW5lIExMX0RBQ19GTEFHX0NBTDIgICAgICAgICAgICAgICAgICAgKERBQ19TUl9DQUxfRkxBRzIpIC8qITwgREFDIGNoYW5uZWwgMiBmbGFnIG9mZnNldCBjYWxpYnJhdGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgTExfREFDX0ZMQUdfQldTVDIgICAgICAgICAgICAgICAgICAoREFDX1NSX0JXU1QyKSAgICAgLyohPCBEQUMgY2hhbm5lbCAyIGZsYWcgYnVzeSB3cml0aW5nIHNhbXBsZSB0aW1lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19JVCBEQUMgaW50ZXJydXB0aW9ucworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfREFDX1JlYWRSZWcgYW5kICBMTF9EQUNfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX0lUX0RNQVVEUklFMSAgICAgICAgICAgICAgICAoREFDX0NSX0RNQVVEUklFMSkgLyohPCBEQUMgY2hhbm5lbCAxIGludGVycnVwdGlvbiBETUEgdW5kZXJydW4gKi8KKyNkZWZpbmUgTExfREFDX0lUX0RNQVVEUklFMiAgICAgICAgICAgICAgICAoREFDX0NSX0RNQVVEUklFMikgLyohPCBEQUMgY2hhbm5lbCAyIGludGVycnVwdGlvbiBETUEgdW5kZXJydW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX0NIQU5ORUwgREFDIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAoREFDX1JFR19TSFNSMV9SRUdPRkZTRVQgfCBEQUNfUkVHX0RPUjFfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFIxMlIxX1JFR09GRlNFVCB8IERBQ19SRUdfREhSMTJMMV9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjhSMV9SRUdPRkZTRVQgfCBEQUNfQ1JfQ0gxX0JJVE9GRlNFVCB8IERBQ19TV1RSX0NIMSkgLyohPCBEQUMgY2hhbm5lbCAxICovCisjZGVmaW5lIExMX0RBQ19DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgKERBQ19SRUdfU0hTUjJfUkVHT0ZGU0VUIHwgREFDX1JFR19ET1IyX1JFR09GRlNFVCB8IERBQ19SRUdfREhSMTJSMl9SRUdPRkZTRVQgfCBEQUNfUkVHX0RIUjEyTDJfUkVHT0ZGU0VUIHwgREFDX1JFR19ESFI4UjJfUkVHT0ZGU0VUIHwgREFDX0NSX0NIMl9CSVRPRkZTRVQgfCBEQUNfU1dUUl9DSDIpIC8qITwgREFDIGNoYW5uZWwgMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfT1BFUkFUSU5HX01PREUgREFDIG9wZXJhdGluZyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX01PREVfTk9STUFMX09QRVJBVElPTiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIGluIG1vZGUgbm9ybWFsIG9wZXJhdGlvbiAqLworI2RlZmluZSBMTF9EQUNfTU9ERV9DQUxJQlJBVElPTiAgICAgICAgICAgIChEQUNfQ1JfQ0VOMSkgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgaW4gbW9kZSBjYWxpYnJhdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfVFJJR0dFUl9TT1VSQ0UgREFDIHRyaWdnZXIgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfU09GVFdBUkUgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsIChTVyBzdGFydCkgKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1RTRUwxXzEgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0zX1RSR08gICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTMgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTyAgICAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNNiBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPICAgICAgICAgICggICAgICAgICAgICAgICAgIERBQ19DUl9UU0VMMV8yIHwgREFDX0NSX1RTRUwxXzEgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU03IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPICAgICAgICAgKERBQ19DUl9UU0VMMV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTE1IFRSR08uICovCisjZGVmaW5lIExMX0RBQ19UUklHX0VYVF9MUFRJTTFfT1VUICAgICAgICAgKERBQ19DUl9UU0VMMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfVFNFTDFfMSB8IERBQ19DUl9UU0VMMV8wKSAvKiE8IERBQyBjaGFubmVsIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IExQVElNMSBUUkdPLiAqLworI2RlZmluZSBMTF9EQUNfVFJJR19FWFRfTFBUSU0yX09VVCAgICAgICAgIChEQUNfQ1JfVFNFTDFfMyB8IERBQ19DUl9UU0VMMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBEQUMgY2hhbm5lbCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBMUFRJTTIgVFJHTy4gKi8KKyNkZWZpbmUgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkgICAgICAgICAoREFDX0NSX1RTRUwxXzMgfCBEQUNfQ1JfVFNFTDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX1RTRUwxXzApIC8qITwgREFDIGNoYW5uZWwgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgOS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREUgREFDIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIHdhdmUgYXV0byBnZW5lcmF0aW9uIG1vZGUgZGlzYWJsZWQuICovCisjZGVmaW5lIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRSAgICAoICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzApIC8qITwgREFDIGNoYW5uZWwgd2F2ZSBhdXRvIGdlbmVyYXRpb24gbW9kZSBlbmFibGVkLCBzZXQgZ2VuZXJhdGVkIG5vaXNlIHdhdmVmb3JtLiAqLworI2RlZmluZSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUgKERBQ19DUl9XQVZFMV8xICAgICAgICAgICAgICAgKSAvKiE8IERBQyBjaGFubmVsIHdhdmUgYXV0byBnZW5lcmF0aW9uIG1vZGUgZW5hYmxlZCwgc2V0IGdlbmVyYXRlZCB0cmlhbmdsZSB3YXZlZm9ybS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1dBVkVfTk9JU0VfTEZTUl9VTk1BU0tfQklUUyBEQUMgd2F2ZSBnZW5lcmF0aW9uIC0gTm9pc2UgTEZTUiB1bm1hc2sgYml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVQwICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIHdhdmUgZ2VuZXJhdGlvbiwgdW5tYXNrIExGU1IgYml0MCwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzFfMCAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbMTowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzJfMCAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbMjowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMCAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbMzowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzRfMCAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbNDowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzVfMCAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbNTowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMCAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbNjowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzdfMCAgICggICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8yIHwgREFDX0NSX01BTVAxXzEgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbNzowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzhfMCAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbODowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMCAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMCkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbOTowXSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzEwXzAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBOb2lzZSB3YXZlIGdlbmVyYXRpb24sIHVubWFzayBMRlNSIGJpdHNbMTA6MF0sIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMV8wICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICB8IERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgTm9pc2Ugd2F2ZSBnZW5lcmF0aW9uLCB1bm1hc2sgTEZTUiBiaXRzWzExOjBdLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19XQVZFX1RSSUFOR0xFX0FNUExJVFVERSBEQUMgd2F2ZSBnZW5lcmF0aW9uIC0gVHJpYW5nbGUgYW1wbGl0dWRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMSBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMCkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAzIExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNyAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMSAgICAgICAgICAgICAgICAgKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDcgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xNSAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DUl9NQU1QMV8xIHwgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMTUgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zMSAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMzEgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV82MyAgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgNjMgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMjcgICAgICAoICAgICAgICAgICAgICAgICBEQUNfQ1JfTUFNUDFfMiB8IERBQ19DUl9NQU1QMV8xICAgICAgICAgICAgICAgICApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMTI3IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMjU1ICAgICAgKCAgICAgICAgICAgICAgICAgREFDX0NSX01BTVAxXzIgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDI1NSBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzUxMSAgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiA1MTIgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyNkZWZpbmUgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMDIzICAgICAoREFDX0NSX01BTVAxXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzApIC8qITwgVHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uLCBhbXBsaXR1ZGUgb2YgMTAyMyBMU0Igb2YgREFDIG91dHB1dCByYW5nZSwgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworI2RlZmluZSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzIwNDcgICAgIChEQUNfQ1JfTUFNUDFfMyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxXzEgICAgICAgICAgICAgICAgICkgLyohPCBUcmlhbmdsZSB3YXZlIGdlbmVyYXRpb24sIGFtcGxpdHVkZSBvZiAyMDQ3IExTQiBvZiBEQUMgb3V0cHV0IHJhbmdlLCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisjZGVmaW5lIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNDA5NSAgICAgKERBQ19DUl9NQU1QMV8zICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfTUFNUDFfMSB8IERBQ19DUl9NQU1QMV8wKSAvKiE8IFRyaWFuZ2xlIHdhdmUgZ2VuZXJhdGlvbiwgYW1wbGl0dWRlIG9mIDQwOTUgTFNCIG9mIERBQyBvdXRwdXQgcmFuZ2UsIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX09VVFBVVF9NT0RFIERBQyBjaGFubmVsIG91dHB1dCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX09VVFBVVF9NT0RFX05PUk1BTCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBvdXRwdXQgaXMgb24gbW9kZSBub3JtYWwuICovCisjZGVmaW5lIExMX0RBQ19PVVRQVVRfTU9ERV9TQU1QTEVfQU5EX0hPTEQgKERBQ19NQ1JfTU9ERTFfMikgICAgICAgLyohPCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgb3V0cHV0IGlzIG9uIG1vZGUgc2FtcGxlLWFuZC1ob2xkLiBNb2RlIHNhbXBsZS1hbmQtaG9sZCByZXF1aXJlcyBhbiBleHRlcm5hbCBjYXBhY2l0b3IsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uIEByZWYgTExfREFDX0NvbmZpZ091dHB1dCgpIG9yIEByZWYgTExfREFDX1NldE91dHB1dE1vZGUoKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX09VVFBVVF9CVUZGRVIgREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RBQ19PVVRQVVRfQlVGRkVSX0VOQUJMRSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgb3V0cHV0IGlzIGJ1ZmZlcmVkOiBoaWdoZXIgZHJpdmUgY3VycmVudCBjYXBhYmlsaXR5LCBidXQgYWxzbyBoaWdoZXIgY3VycmVudCBjb25zdW1wdGlvbiAqLworI2RlZmluZSBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFICAgICAgIChEQUNfTUNSX01PREUxXzEpICAgICAgIC8qITwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIG91dHB1dCBpcyBub3QgYnVmZmVyZWQ6IGxvd2VyIGRyaXZlIGN1cnJlbnQgY2FwYWJpbGl0eSwgYnV0IGFsc28gbG93ZXIgY3VycmVudCBjb25zdW1wdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUNfT1VUUFVUX0NPTk5FQ1RJT04gREFDIGNoYW5uZWwgb3V0cHV0IGNvbm5lY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQUNfT1VUUFVUX0NPTk5FQ1RfR1BJTyAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gZXh0ZXJuYWwgcGluICovCisjZGVmaW5lIExMX0RBQ19PVVRQVVRfQ09OTkVDVF9JTlRFUk5BTCAgICAgKERBQ19NQ1JfTU9ERTFfMCkgICAgICAgLyohPCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBvbi1jaGlwIHBlcmlwaGVyYWxzIHZpYSBpbnRlcm5hbCBwYXRocy4gT24gdGhpcyBTVE0zMiBzZXJpZSwgb3V0cHV0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBvdXRwdXQgbW9kZSAobm9ybWFsIG9yIHNhbXBsZSBhbmQgaG9sZCkgYW5kIG91dHB1dCBidWZmZXIgc3RhdGUuIFJlZmVyIHRvIGNvbW1lbnRzIG9mIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldE91dHB1dENvbm5lY3Rpb24oKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1JFU09MVVRJT04gIERBQyBjaGFubmVsIG91dHB1dCByZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREFDX1JFU09MVVRJT05fMTJCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IERBQyBjaGFubmVsIHJlc29sdXRpb24gMTIgYml0cyAqLworI2RlZmluZSBMTF9EQUNfUkVTT0xVVElPTl84QiAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgIC8qITwgREFDIGNoYW5uZWwgcmVzb2x1dGlvbiA4IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VDX1JFR0lTVEVSUyAgREFDIHJlZ2lzdGVycyBjb21wbGlhbnQgd2l0aCBzcGVjaWZpYyBwdXJwb3NlCisgICogQHsKKyAgKi8KKy8qIExpc3Qgb2YgREFDIHJlZ2lzdGVycyBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoICAgICAgICAgICAgICovCisvKiBETUEgdHJhbnNmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfUklHSFRfQUxJR05FRCAgREFDX1JFR19ESFIxMlJYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TIC8qITwgREFDIGNoYW5uZWwgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIDEyIGJpdHMgcmlnaHQgYWxpZ25lZCAqLworI2RlZmluZSBMTF9EQUNfRE1BX1JFR19EQVRBXzEyQklUU19MRUZUX0FMSUdORUQgICBEQUNfUkVHX0RIUjEyTFhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgLyohPCBEQUMgY2hhbm5lbCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgMTIgYml0cyBsZWZ0IGFsaWduZWQgKi8KKyNkZWZpbmUgTExfREFDX0RNQV9SRUdfREFUQV84QklUU19SSUdIVF9BTElHTkVEICAgREFDX1JFR19ESFI4UlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MgIC8qITwgREFDIGNoYW5uZWwgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIDggYml0cyByaWdodCBhbGlnbmVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FQ19IV19ERUxBWVMgIERlZmluaXRpb25zIG9mIERBQyBoYXJkd2FyZSBjb25zdHJhaW50cyBkZWxheXMKKyAgKiBAbm90ZSAgIE9ubHkgREFDIHBlcmlwaGVyYWwgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIERBQyBMTCBkcml2ZXIgZHJpdmVyLAorICAqICAgICAgICAgbm90IHRpbWVvdXQgdmFsdWVzLgorICAqICAgICAgICAgRm9yIGRldGFpbHMgb24gZGVsYXlzIHZhbHVlcywgcmVmZXIgdG8gZGVzY3JpcHRpb25zIGluIHNvdXJjZSBjb2RlCisgICogICAgICAgICBhYm92ZSBlYWNoIGxpdGVyYWwgZGVmaW5pdGlvbi4KKyAgKiBAeworICAqLworCisvKiBEZWxheSBmb3IgREFDIGNoYW5uZWwgdm9sdGFnZSBzZXR0bGluZyB0aW1lIGZyb20gREFDIGNoYW5uZWwgc3RhcnR1cCAgICAgICAqLworLyogKHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlIHRvIGVuYWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERBQyBjaGFubmVsIHN0YXJ0dXAgdGltZSBkZXBlbmRzIG9uIGJvYXJkIGFwcGxpY2F0aW9uIGVudmlyb25tZW50OiAgICovCisvKiAgICAgICBpbXBlZGFuY2UgY29ubmVjdGVkIHRvIERBQyBjaGFubmVsIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhlIGRlbGF5IGJlbG93IGlzIHNwZWNpZmllZCB1bmRlciBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIHZvbHRhZ2UgbWF4aW11bSB0cmFuc2l0aW9uIChsb3dlc3QgdG8gaGlnaGVzdCB2YWx1ZSkgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSB1bnRpbCB2b2x0YWdlIHJlYWNoZXMgZmluYWwgdmFsdWUgKy0xTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIGxvYWQgaW1wZWRhbmNlIG9mIDVrT2htIChtaW4pLCA1MHBGIChtYXgpICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0V0FLRVVQIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RBQ19ERUxBWV9TVEFSVFVQX1ZPTFRBR0VfU0VUVExJTkdfVVMgICAgICAgICAgICAgOFUgIC8qITwgRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZSBmcm9tIERBQyBjaGFubmVsIHN0YXJ0dXAgKHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlIHRvIGVuYWJsZSkgKi8KKworLyogRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERBQyBjaGFubmVsIHN0YXJ0dXAgdGltZSBkZXBlbmRzIG9uIGJvYXJkIGFwcGxpY2F0aW9uIGVudmlyb25tZW50OiAgICovCisvKiAgICAgICBpbXBlZGFuY2UgY29ubmVjdGVkIHRvIERBQyBjaGFubmVsIG91dHB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhlIGRlbGF5IGJlbG93IGlzIHNwZWNpZmllZCB1bmRlciBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIHZvbHRhZ2UgbWF4aW11bSB0cmFuc2l0aW9uIChsb3dlc3QgdG8gaGlnaGVzdCB2YWx1ZSkgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSB1bnRpbCB2b2x0YWdlIHJlYWNoZXMgZmluYWwgdmFsdWUgKy0xTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gREFDIGNoYW5uZWwgb3V0cHV0IGJ1ZmZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIGxvYWQgaW1wZWRhbmNlIG9mIDVrT2htIG1pbiwgNTBwRiBtYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U0VUVExJTkciKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RBQ19ERUxBWV9WT0xUQUdFX1NFVFRMSU5HX1VTICAgICAgICAgICAgICAgICAgICAgM1UgIC8qITwgRGVsYXkgZm9yIERBQyBjaGFubmVsIHZvbHRhZ2Ugc2V0dGxpbmcgdGltZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBEQUNfTExfRXhwb3J0ZWRfTWFjcm9zIERBQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiB3cml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIERBQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERBQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfREFDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gREFDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gREFDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0RBQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FTV9IRUxQRVJfTUFDUk8gREFDIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCBEQUMgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQKKyAgKiAgICAgICAgIGZyb20gbGl0ZXJhbHMgTExfREFDX0NIQU5ORUxfeC4KKyAgKiAgICAgICAgIEV4YW1wbGU6CisgICogICAgICAgICAgICBfX0xMX0RBQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoTExfREFDX0NIQU5ORUxfMSkKKyAgKiAgICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICIxIi4KKyAgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpcyByZXR1cm5lZC4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIDEuLi4yCisgICovCisjZGVmaW5lIF9fTExfREFDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQ0hBTk5FTF9fKSAmIERBQ19TV1RSX0NIWF9NQVNLKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgREFDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgTExfREFDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0xMX0RBQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoMSkKKyAgKiAgICAgICAgICAgd2lsbCByZXR1cm4gYSBkYXRhIGVxdWl2YWxlbnQgdG8gIkxMX0RBQ19DSEFOTkVMXzEiLgorICAqIEBub3RlICBJZiB0aGUgaW5wdXQgcGFyYW1ldGVyIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBEQUMgY2hhbm5lbCwKKyAgKiAgICAgICAgdGhpcyBtYWNybyByZXR1cm5zIHZhbHVlICcwJy4KKyAgKiBAcGFyYW0gIF9fREVDSU1BTF9OQl9fIDEuLi4yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICovCisjZGVmaW5lIF9fTExfREFDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0RFQ0lNQUxfTkJfXykgPT0gMVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTExfREFDX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKChfX0RFQ0lNQUxfTkJfXykgPT0gMlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgTExfREFDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIHRoZSBEQUMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbAorICAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgREFDIHJlc29sdXRpb24uCisgICogQG5vdGUgICBEQUMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQorICAqICAgICAgICAgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLQorICAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLgorICAqIEBwYXJhbSAgX19EQUNfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1JFU09MVVRJT05fOEIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19MTF9EQUNfRElHSVRBTF9TQ0FMRShfX0RBQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoMHgwMDAwMEZGRlUpID4+ICgoX19EQUNfUkVTT0xVVElPTl9fKSA8PCAxVSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgREFDIGNvbnZlcnNpb24gZGF0YSAodW5pdDogZGlnaXRhbAorICAqICAgICAgICAgdmFsdWUpIGNvcnJlc3BvbmRpbmcgdG8gYSB2b2x0YWdlICh1bml0OiBtVm9sdCkuCisgICogQG5vdGUgICBUaGlzIGhlbHBlciBtYWNybyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGlucHV0IGRhdGEgaW4gdm9sdGFnZQorICAqICAgICAgICAgcmF0aGVyIHRoYW4gZGlnaXRhbCB2YWx1ZSwKKyAgKiAgICAgICAgIHRvIGJlIHVzZWQgd2l0aCBMTCBEQUMgZnVuY3Rpb25zIHN1Y2ggYXMKKyAgKiAgICAgICAgIEByZWYgTExfREFDX0NvbnZlcnREYXRhMTJSaWdodEFsaWduZWQoKS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQHBhcmFtICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX0RBQ19WT0xUQUdFX18gVm9sdGFnZSB0byBiZSBnZW5lcmF0ZWQgYnkgREFDIGNoYW5uZWwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogbVZvbHQpLgorICAqIEBwYXJhbSAgX19EQUNfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1JFU09MVVRJT05fOEIKKyAgKiBAcmV0dmFsIERBQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpCisgICovCisjZGVmaW5lIF9fTExfREFDX0NBTENfVk9MVEFHRV9UT19EQVRBKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RBQ19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RBQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX0RBQ19WT0xUQUdFX18pICogX19MTF9EQUNfRElHSVRBTF9TQ0FMRShfX0RBQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICBcCisgICAvIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBEQUMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiBvZiBEQUMgY2hhbm5lbHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIGNhbGlicmF0aW9uIG9yIG5vcm1hbCBvcGVyYXRpbmcgbW9kZS4KKyAgKiBAcm10b2xsIENSICAgICAgIENFTjEgICAgICAgICAgIExMX0RBQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENSICAgICAgIENFTjIgICAgICAgICAgIExMX0RBQ19TZXRNb2RlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEBwYXJhbSAgQ2hhbm5lbE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTU9ERV9OT1JNQUxfT1BFUkFUSU9OCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX01PREVfQ0FMSUJSQVRJT04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRNb2RlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbE1vZGUpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX0NFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgQ2hhbm5lbE1vZGUgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIGNhbGlicmF0aW9uIG9yIG5vcm1hbCBvcGVyYXRpbmcgbW9kZS4KKyAgKiBAcm10b2xsIENSICAgICAgIENFTjEgICAgICAgICAgIExMX0RBQ19HZXRNb2RlXG4KKyAgKiAgICAgICAgIENSICAgICAgIENFTjIgICAgICAgICAgIExMX0RBQ19HZXRNb2RlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTU9ERV9OT1JNQUxfT1BFUkFUSU9OCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX01PREVfQ0FMSUJSQVRJT04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0TW9kZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfQ0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgb2Zmc2V0IHRyaW1taW5nIHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICBUcmltbWluZyBoYXMgYW4gaW1wYWN0IHdoZW4gb3V0cHV0IGJ1ZmZlciBpcyBlbmFibGVkCisgICogICAgICAgICBhbmQgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSBmYWN0b3J5IGNhbGlicmF0aW9uIGRlZmF1bHQgdmFsdWVzLgorICAqIEBybXRvbGwgQ0NSICAgICAgT1RSSU0xICAgICAgICAgTExfREFDX1NldFRyaW1taW5nVmFsdWVcbgorICAqICAgICAgICAgQ0NSICAgICAgT1RSSU0yICAgICAgICAgTExfREFDX1NldFRyaW1taW5nVmFsdWUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHBhcmFtICBUcmltbWluZ1ZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFRyaW1taW5nVmFsdWUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBUcmltbWluZ1ZhbHVlKQoreworICBNT0RJRllfUkVHKERBQ3gtPkNDUiwKKyAgICAgICAgICAgICBEQUNfQ0NSX09UUklNMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBUcmltbWluZ1ZhbHVlIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG9mZnNldCB0cmltbWluZyB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqICAgICAgICAgVHJpbW1pbmcgaGFzIGFuIGltcGFjdCB3aGVuIG91dHB1dCBidWZmZXIgaXMgZW5hYmxlZAorICAqICAgICAgICAgYW5kIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgZmFjdG9yeSBjYWxpYnJhdGlvbiBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcm10b2xsIENDUiAgICAgIE9UUklNMSAgICAgICAgIExMX0RBQ19HZXRUcmltbWluZ1ZhbHVlXG4KKyAgKiAgICAgICAgIENDUiAgICAgIE9UUklNMiAgICAgICAgIExMX0RBQ19HZXRUcmltbWluZ1ZhbHVlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgVHJpbW1pbmdWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0VHJpbW1pbmdWYWx1ZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNDUiwgREFDX0NDUl9PVFJJTTEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIEZvciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIHRvIGJlIGVmZmVjdGl2ZSwgREFDIHRyaWdnZXIKKyAgKiAgICAgICAgIG11c3QgYmUgZW5hYmxlZCB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0RBQ19FbmFibGVUcmlnZ2VyKCkuCisgICogQG5vdGUgICBUbyBzZXQgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSwgREFDIGNoYW5uZWwgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhlIHNldHRpbmcgaXMgZGlzY2FyZGVkLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIKKyAgKiAgICAgICAgIGRlcGVuZHMgb24gdGltZXJzIGF2YWlsYWJpbGl0eSBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEBybXRvbGwgQ1IgICAgICAgVFNFTDEgICAgICAgICAgTExfREFDX1NldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgQ1IgICAgICAgVFNFTDIgICAgICAgICAgTExfREFDX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0zX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNNl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTdfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0xNV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX0xQVElNMV9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfTFBUSU0yX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9FWFRJX0xJTkU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0VHJpZ2dlclNvdXJjZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX1RTRUwxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIFRyaWdnZXJTb3VyY2UgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgRm9yIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgdG8gYmUgZWZmZWN0aXZlLCBEQUMgdHJpZ2dlcgorICAqICAgICAgICAgbXVzdCBiZSBlbmFibGVkIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfREFDX0VuYWJsZVRyaWdnZXIoKS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENSICAgICAgIFRTRUwxICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlXG4KKyAgKiAgICAgICAgIENSICAgICAgIFRTRUwyICAgICAgICAgIExMX0RBQ19HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU0xX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTNfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9USU02X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfVElNN19UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX1RJTTE1X1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJR19FWFRfTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklHX0VYVF9MUFRJTTJfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUdfRVhUX0VYVElfTElORTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0VHJpZ2dlclNvdXJjZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfVFNFTDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBXQVZFMSAgICAgICAgICBMTF9EQUNfU2V0V2F2ZUF1dG9HZW5lcmF0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIFdBVkUyICAgICAgICAgIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHBhcmFtICBXYXZlQXV0b0dlbmVyYXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9UUklBTkdMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFdhdmVBdXRvR2VuZXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5DUiwKKyAgICAgICAgICAgICBEQUNfQ1JfV0FWRTEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgV2F2ZUF1dG9HZW5lcmF0aW9uIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHdhdmVmb3JtIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG1vZGUKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBXQVZFMSAgICAgICAgICBMTF9EQUNfR2V0V2F2ZUF1dG9HZW5lcmF0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIFdBVkUyICAgICAgICAgIExMX0RBQ19HZXRXYXZlQXV0b0dlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PSVNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX1RSSUFOR0xFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0dldFdhdmVBdXRvR2VuZXJhdGlvbihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfV0FWRTEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG5vaXNlIHdhdmVmb3JtIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIE5vaXNlIG1vZGUgYW5kIHBhcmFtZXRlcnMgTEZTUiAobGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyKS4KKyAgKiBAbm90ZSAgIEZvciB3YXZlIGdlbmVyYXRpb24gdG8gYmUgZWZmZWN0aXZlLCBEQUMgY2hhbm5lbAorICAqICAgICAgICAgd2F2ZSBnZW5lcmF0aW9uIG1vZGUgbXVzdCBiZSBlbmFibGVkIHVzaW5nCisgICogICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRXYXZlQXV0b0dlbmVyYXRpb24oKS4KKyAgKiBAbm90ZSAgIFRoaXMgc2V0dGluZyBjYW4gYmUgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGlzIGRpc2FibGVkCisgICogICAgICAgICAob3RoZXJ3aXNlLCB0aGUgc2V0dGluZyBvcGVyYXRpb24gaXMgaWdub3JlZCkuCisgICogQHJtdG9sbCBDUiAgICAgICBNQU1QMSAgICAgICAgICBMTF9EQUNfU2V0V2F2ZU5vaXNlTEZTUlxuCisgICogICAgICAgICBDUiAgICAgICBNQU1QMiAgICAgICAgICBMTF9EQUNfU2V0V2F2ZU5vaXNlTEZTUgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIE5vaXNlTEZTUk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMyXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM1XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTN18wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM4XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTBfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldFdhdmVOb2lzZUxGU1IoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBOb2lzZUxGU1JNYXNrKQoreworICBNT0RJRllfUkVHKERBQ3gtPkNSLAorICAgICAgICAgICAgIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSwKKyAgICAgICAgICAgICBOb2lzZUxGU1JNYXNrIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG5vaXNlIHdhdmVmb3JtIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIE5vaXNlIG1vZGUgYW5kIHBhcmFtZXRlcnMgTEZTUiAobGluZWFyIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1BTVAyICAgICAgICAgIExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMyXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM1XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTN18wCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM4XzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTBfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRXYXZlTm9pc2VMRlNSKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+Q1IsIERBQ19DUl9NQU1QMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgPj4gKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdHJpYW5nbGUgd2F2ZWZvcm0gZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgdHJpYW5nbGUgbW9kZSBhbmQgYW1wbGl0dWRlLgorICAqIEBub3RlICAgRm9yIHdhdmUgZ2VuZXJhdGlvbiB0byBiZSBlZmZlY3RpdmUsIERBQyBjaGFubmVsCisgICogICAgICAgICB3YXZlIGdlbmVyYXRpb24gbW9kZSBtdXN0IGJlIGVuYWJsZWQgdXNpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfREFDX1NldFdhdmVBdXRvR2VuZXJhdGlvbigpLgorICAqIEBub3RlICAgVGhpcyBzZXR0aW5nIGNhbiBiZSBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICAgIChvdGhlcndpc2UsIHRoZSBzZXR0aW5nIG9wZXJhdGlvbiBpcyBpZ25vcmVkKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19TZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGVcbgorICAqICAgICAgICAgQ1IgICAgICAgTUFNUDIgICAgICAgICAgTExfREFDX1NldFdhdmVUcmlhbmdsZUFtcGxpdHVkZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIFRyaWFuZ2xlQW1wbGl0dWRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzYzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzI1NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMDIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV80MDk1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0V2F2ZVRyaWFuZ2xlQW1wbGl0dWRlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVHJpYW5nbGVBbXBsaXR1ZGUpCit7CisgIE1PRElGWV9SRUcoREFDeC0+Q1IsCisgICAgICAgICAgICAgREFDX0NSX01BTVAxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIFRyaWFuZ2xlQW1wbGl0dWRlIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHRyaWFuZ2xlIHdhdmVmb3JtIGdlbmVyYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIHRyaWFuZ2xlIG1vZGUgYW5kIGFtcGxpdHVkZS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1BTVAxICAgICAgICAgIExMX0RBQ19HZXRXYXZlVHJpYW5nbGVBbXBsaXR1ZGVcbgorICAqICAgICAgICAgQ1IgICAgICAgTUFNUDIgICAgICAgICAgTExfREFDX0dldFdhdmVUcmlhbmdsZUFtcGxpdHVkZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzYzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzI1NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfNTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8xMDIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV8yMDQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV80MDk1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0dldFdhdmVUcmlhbmdsZUFtcGxpdHVkZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKERBQ3gtPkNSLCBEQUNfQ1JfTUFNUDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG91dHB1dCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXQgc2V2ZXJhbCBmZWF0dXJlczoKKyAgKiAgICAgICAgIC0gbW9kZSBub3JtYWwgb3Igc2FtcGxlLWFuZC1ob2xkCisgICogICAgICAgICAtIGJ1ZmZlcgorICAqICAgICAgICAgLSBjb25uZWN0aW9uIHRvIEdQSU8gb3IgaW50ZXJuYWwgcGF0aC4KKyAgKiAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGNhbiBhbHNvIGJlIHNldCBpbmRpdmlkdWFsbHkgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnM6CisgICogICAgICAgICAtIEByZWYgTExfREFDX1NldE91dHB1dEJ1ZmZlcigpCisgICogICAgICAgICAtIEByZWYgTExfREFDX1NldE91dHB1dE1vZGUoKQorICAqICAgICAgICAgLSBAcmVmIExMX0RBQ19TZXRPdXRwdXRDb25uZWN0aW9uKCkKKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIG91dHB1dCBjb25uZWN0aW9uIGRlcGVuZHMgb24gb3V0cHV0IG1vZGUKKyAgKiAgICAgICAgIChub3JtYWwgb3Igc2FtcGxlIGFuZCBob2xkKSBhbmQgb3V0cHV0IGJ1ZmZlciBzdGF0ZS4KKyAgKiAgICAgICAgIC0gaWYgb3V0cHV0IGNvbm5lY3Rpb24gaXMgc2V0IHRvIGludGVybmFsIHBhdGggYW5kIG91dHB1dCBidWZmZXIKKyAgKiAgICAgICAgICAgaXMgZW5hYmxlZCAod2hhdGV2ZXIgb3V0cHV0IG1vZGUpOgorICAqICAgICAgICAgICBvdXRwdXQgY29ubmVjdGlvbiBpcyBhbHNvIGNvbm5lY3RlZCB0byBHUElPIHBpbgorICAqICAgICAgICAgICAoYm90aCBjb25uZWN0aW9ucyB0byBHUElPIHBpbiBhbmQgaW50ZXJuYWwgcGF0aCkuCisgICogICAgICAgICAtIGlmIG91dHB1dCBjb25uZWN0aW9uIGlzIHNldCB0byBHUElPIHBpbiwgb3V0cHV0IGJ1ZmZlcgorICAqICAgICAgICAgICBpcyBkaXNhYmxlZCwgb3V0cHV0IG1vZGUgc2V0IHRvIHNhbXBsZSBhbmQgaG9sZDoKKyAgKiAgICAgICAgICAgb3V0cHV0IGNvbm5lY3Rpb24gaXMgYWxzbyBjb25uZWN0ZWQgdG8gaW50ZXJuYWwgcGF0aAorICAqICAgICAgICAgICAoYm90aCBjb25uZWN0aW9ucyB0byBHUElPIHBpbiBhbmQgaW50ZXJuYWwgcGF0aCkuCisgICogQG5vdGUgICBNb2RlIHNhbXBsZS1hbmQtaG9sZCByZXF1aXJlcyBhbiBleHRlcm5hbCBjYXBhY2l0b3IKKyAgKiAgICAgICAgIHRvIGJlIGNvbm5lY3RlZCBiZXR3ZWVuIERBQyBjaGFubmVsIG91dHB1dCBhbmQgZ3JvdW5kLgorICAqICAgICAgICAgQ2FwYWNpdG9yIHZhbHVlIGRlcGVuZHMgb24gbG9hZCBvbiBEQUMgY2hhbm5lbCBvdXRwdXQgYW5kCisgICogICAgICAgICBzYW1wbGUtYW5kLWhvbGQgdGltaW5ncyBjb25maWd1cmVkLgorICAqICAgICAgICAgQXMgaW5kaWNhdGlvbiwgY2FwYWNpdG9yIHR5cGljYWwgdmFsdWUgaXMgMTAwbkYKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgIkNTSCIpLgorICAqIEBybXRvbGwgQ1IgICAgICAgTU9ERTEgICAgICAgICAgTExfREFDX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUiAgICAgICBNT0RFMiAgICAgICAgICBMTF9EQUNfQ29uZmlnT3V0cHV0CisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEBwYXJhbSAgT3V0cHV0TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfTU9ERV9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX01PREVfU0FNUExFX0FORF9IT0xECisgICogQHBhcmFtICBPdXRwdXRCdWZmZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFCisgICogQHBhcmFtICBPdXRwdXRDb25uZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX09VVFBVVF9DT05ORUNUX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0NPTk5FQ1RfSU5URVJOQUwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db25maWdPdXRwdXQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBPdXRwdXRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRCdWZmZXIsIHVpbnQzMl90IE91dHB1dENvbm5lY3Rpb24pCit7CisgIE1PRElGWV9SRUcoREFDeC0+TUNSLAorICAgICAgICAgICAgIChEQUNfTUNSX01PREUxXzIgfCBEQUNfTUNSX01PREUxXzEgfCBEQUNfTUNSX01PREUxXzApIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIChPdXRwdXRNb2RlIHwgT3V0cHV0QnVmZmVyIHwgT3V0cHV0Q29ubmVjdGlvbikgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgb3V0cHV0IG1vZGUgbm9ybWFsIG9yIHNhbXBsZS1hbmQtaG9sZAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIE1vZGUgc2FtcGxlLWFuZC1ob2xkIHJlcXVpcmVzIGFuIGV4dGVybmFsIGNhcGFjaXRvcgorICAqICAgICAgICAgdG8gYmUgY29ubmVjdGVkIGJldHdlZW4gREFDIGNoYW5uZWwgb3V0cHV0IGFuZCBncm91bmQuCisgICogICAgICAgICBDYXBhY2l0b3IgdmFsdWUgZGVwZW5kcyBvbiBsb2FkIG9uIERBQyBjaGFubmVsIG91dHB1dCBhbmQKKyAgKiAgICAgICAgIHNhbXBsZS1hbmQtaG9sZCB0aW1pbmdzIGNvbmZpZ3VyZWQuCisgICogICAgICAgICBBcyBpbmRpY2F0aW9uLCBjYXBhY2l0b3IgdHlwaWNhbCB2YWx1ZSBpcyAxMDBuRgorICAqICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAiQ1NIIikuCisgICogQHJtdG9sbCBDUiAgICAgICBNT0RFMSAgICAgICAgICBMTF9EQUNfU2V0T3V0cHV0TW9kZVxuCisgICogICAgICAgICBDUiAgICAgICBNT0RFMiAgICAgICAgICBMTF9EQUNfU2V0T3V0cHV0TW9kZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIE91dHB1dE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX01PREVfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX09VVFBVVF9NT0RFX1NBTVBMRV9BTkRfSE9MRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX1NldE91dHB1dE1vZGUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBPdXRwdXRNb2RlKQoreworICBNT0RJRllfUkVHKERBQ3gtPk1DUiwKKyAgICAgICAgICAgICAodWludDMyX3QpREFDX01DUl9NT0RFMV8yIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIE91dHB1dE1vZGUgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgb3V0cHV0IG1vZGUgbm9ybWFsIG9yIHNhbXBsZS1hbmQtaG9sZCBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgTU9ERTEgICAgICAgICAgTExfREFDX0dldE91dHB1dE1vZGVcbgorICAqICAgICAgICAgQ1IgICAgICAgTU9ERTIgICAgICAgICAgTExfREFDX0dldE91dHB1dE1vZGUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfTU9ERV9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX01PREVfU0FNUExFX0FORF9IT0xECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0dldE91dHB1dE1vZGUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQUN4LT5NQ1IsICh1aW50MzJfdClEQUNfTUNSX01PREUxXzIgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHdoZW4gYnVmZmVyIGlzIGVuYWJsZWQsIGl0cyBvZmZzZXQgY2FuIGJlCisgICogICAgICAgICB0cmltbWVkOiBmYWN0b3J5IGNhbGlicmF0aW9uIGRlZmF1bHQgdmFsdWVzIGNhbiBiZQorICAqICAgICAgICAgcmVwbGFjZWQgYnkgdXNlciB0cmltbWluZyB2YWx1ZXMsIHVzaW5nIGZ1bmN0aW9uCisgICogICAgICAgICBAcmVmIExMX0RBQ19TZXRUcmltbWluZ1ZhbHVlKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBNT0RFMSAgICAgICAgICBMTF9EQUNfU2V0T3V0cHV0QnVmZmVyXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1PREUyICAgICAgICAgIExMX0RBQ19TZXRPdXRwdXRCdWZmZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHBhcmFtICBPdXRwdXRCdWZmZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0T3V0cHV0QnVmZmVyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgT3V0cHV0QnVmZmVyKQoreworICBNT0RJRllfUkVHKERBQ3gtPk1DUiwKKyAgICAgICAgICAgICAodWludDMyX3QpREFDX01DUl9NT0RFMV8xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spLAorICAgICAgICAgICAgIE91dHB1dEJ1ZmZlciA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgYnVmZmVyIHN0YXRlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBNT0RFMSAgICAgICAgICBMTF9EQUNfR2V0T3V0cHV0QnVmZmVyXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1PREUyICAgICAgICAgIExMX0RBQ19HZXRPdXRwdXRCdWZmZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQlVGRkVSX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQlVGRkVSX0RJU0FCTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0T3V0cHV0QnVmZmVyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+TUNSLCAodWludDMyX3QpREFDX01DUl9NT0RFMV8xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBvdXRwdXQgY29ubmVjdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgb3V0cHV0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBvdXRwdXQgbW9kZSAobm9ybWFsIG9yCisgICogICAgICAgICBzYW1wbGUgYW5kIGhvbGQpIGFuZCBvdXRwdXQgYnVmZmVyIHN0YXRlLgorICAqICAgICAgICAgLSBpZiBvdXRwdXQgY29ubmVjdGlvbiBpcyBzZXQgdG8gaW50ZXJuYWwgcGF0aCBhbmQgb3V0cHV0IGJ1ZmZlcgorICAqICAgICAgICAgICBpcyBlbmFibGVkICh3aGF0ZXZlciBvdXRwdXQgbW9kZSk6CisgICogICAgICAgICAgIG91dHB1dCBjb25uZWN0aW9uIGlzIGFsc28gY29ubmVjdGVkIHRvIEdQSU8gcGluCisgICogICAgICAgICAgIChib3RoIGNvbm5lY3Rpb25zIHRvIEdQSU8gcGluIGFuZCBpbnRlcm5hbCBwYXRoKS4KKyAgKiAgICAgICAgIC0gaWYgb3V0cHV0IGNvbm5lY3Rpb24gaXMgc2V0IHRvIEdQSU8gcGluLCBvdXRwdXQgYnVmZmVyCisgICogICAgICAgICAgIGlzIGRpc2FibGVkLCBvdXRwdXQgbW9kZSBzZXQgdG8gc2FtcGxlIGFuZCBob2xkOgorICAqICAgICAgICAgICBvdXRwdXQgY29ubmVjdGlvbiBpcyBhbHNvIGNvbm5lY3RlZCB0byBpbnRlcm5hbCBwYXRoCisgICogICAgICAgICAgIChib3RoIGNvbm5lY3Rpb25zIHRvIEdQSU8gcGluIGFuZCBpbnRlcm5hbCBwYXRoKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1PREUxICAgICAgICAgIExMX0RBQ19TZXRPdXRwdXRDb25uZWN0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1PREUyICAgICAgICAgIExMX0RBQ19TZXRPdXRwdXRDb25uZWN0aW9uCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEBwYXJhbSAgT3V0cHV0Q29ubmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQ09OTkVDVF9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX09VVFBVVF9DT05ORUNUX0lOVEVSTkFMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0T3V0cHV0Q29ubmVjdGlvbihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IE91dHB1dENvbm5lY3Rpb24pCit7CisgIE1PRElGWV9SRUcoREFDeC0+TUNSLAorICAgICAgICAgICAgICh1aW50MzJfdClEQUNfTUNSX01PREUxXzAgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgT3V0cHV0Q29ubmVjdGlvbiA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgY29ubmVjdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgb3V0cHV0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBvdXRwdXQgbW9kZSAobm9ybWFsIG9yCisgICogICAgICAgICBzYW1wbGUgYW5kIGhvbGQpIGFuZCBvdXRwdXQgYnVmZmVyIHN0YXRlLgorICAqICAgICAgICAgLSBpZiBvdXRwdXQgY29ubmVjdGlvbiBpcyBzZXQgdG8gaW50ZXJuYWwgcGF0aCBhbmQgb3V0cHV0IGJ1ZmZlcgorICAqICAgICAgICAgICBpcyBlbmFibGVkICh3aGF0ZXZlciBvdXRwdXQgbW9kZSk6CisgICogICAgICAgICAgIG91dHB1dCBjb25uZWN0aW9uIGlzIGFsc28gY29ubmVjdGVkIHRvIEdQSU8gcGluCisgICogICAgICAgICAgIChib3RoIGNvbm5lY3Rpb25zIHRvIEdQSU8gcGluIGFuZCBpbnRlcm5hbCBwYXRoKS4KKyAgKiAgICAgICAgIC0gaWYgb3V0cHV0IGNvbm5lY3Rpb24gaXMgc2V0IHRvIEdQSU8gcGluLCBvdXRwdXQgYnVmZmVyCisgICogICAgICAgICAgIGlzIGRpc2FibGVkLCBvdXRwdXQgbW9kZSBzZXQgdG8gc2FtcGxlIGFuZCBob2xkOgorICAqICAgICAgICAgICBvdXRwdXQgY29ubmVjdGlvbiBpcyBhbHNvIGNvbm5lY3RlZCB0byBpbnRlcm5hbCBwYXRoCisgICogICAgICAgICAgIChib3RoIGNvbm5lY3Rpb25zIHRvIEdQSU8gcGluIGFuZCBpbnRlcm5hbCBwYXRoKS4KKyAgKiBAcm10b2xsIENSICAgICAgIE1PREUxICAgICAgICAgIExMX0RBQ19HZXRPdXRwdXRDb25uZWN0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIE1PREUyICAgICAgICAgIExMX0RBQ19HZXRPdXRwdXRDb25uZWN0aW9uCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfT1VUUFVUX0NPTk5FQ1RfR1BJTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19PVVRQVVRfQ09OTkVDVF9JTlRFUk5BTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRPdXRwdXRDb25uZWN0aW9uKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+TUNSLCAodWludDMyX3QpREFDX01DUl9NT0RFMV8wIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzYW1wbGUtYW5kLWhvbGQgdGltaW5nIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6CisgICogICAgICAgICBzYW1wbGUgdGltZQorICAqIEBub3RlICAgU2FtcGxlIHRpbWUgbXVzdCBiZSBzZXQgd2hlbiBEQUMgY2hhbm5lbCBpcyBkaXNhYmxlZAorICAqICAgICAgICAgb3IgZHVyaW5nIERBQyBvcGVyYXRpb24gd2hlbiBEQUMgY2hhbm5lbCBmbGFnIEJXU1R4IGlzIHJlc2V0LAorICAqICAgICAgICAgb3RoZXJ3aXNlIHRoZSBzZXR0aW5nIGlzIGlnbm9yZWQuCisgICogICAgICAgICBDaGVjayBCV1NUeCBmbGFnIHN0YXRlIHVzaW5nIGZ1bmN0aW9uICJMTF9EQUNfSXNBY3RpdmVGbGFnX0JXU1R4KCkiLgorICAqIEBybXRvbGwgU0hTUjEgICAgVFNBTVBMRTEgICAgICAgTExfREFDX1NldFNhbXBsZUFuZEhvbGRTYW1wbGVUaW1lXG4KKyAgKiAgICAgICAgIFNIU1IyICAgIFRTQU1QTEUyICAgICAgIExMX0RBQ19TZXRTYW1wbGVBbmRIb2xkU2FtcGxlVGltZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIFNhbXBsZVRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHgzRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19TZXRTYW1wbGVBbmRIb2xkU2FtcGxlVGltZShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFNhbXBsZVRpbWUpCit7CisgIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0RBQ19QVFJfUkVHX09GRlNFVChEQUN4LT5TSFNSMSwgKERBQ19DaGFubmVsID4+IERBQ19SRUdfU0hTUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MpICYgREFDX1JFR19TSFNSWF9SRUdPRkZTRVRfTUFTS19QT1NCSVQwKTsKKworICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19TSFNSMV9UU0FNUExFMSwKKyAgICAgICAgICAgICBTYW1wbGVUaW1lKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNhbXBsZS1hbmQtaG9sZCB0aW1pbmcgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIHNhbXBsZSB0aW1lCisgICogQHJtdG9sbCBTSFNSMSAgICBUU0FNUExFMSAgICAgICBMTF9EQUNfR2V0U2FtcGxlQW5kSG9sZFNhbXBsZVRpbWVcbgorICAqICAgICAgICAgU0hTUjIgICAgVFNBTVBMRTIgICAgICAgTExfREFDX0dldFNhbXBsZUFuZEhvbGRTYW1wbGVUaW1lCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHgzRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0U2FtcGxlQW5kSG9sZFNhbXBsZVRpbWUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBfX0lPIHVpbnQzMl90IGNvbnN0ICpwcmVnID0gX19EQUNfUFRSX1JFR19PRkZTRVQoREFDeC0+U0hTUjEsIChEQUNfQ2hhbm5lbCA+PiBEQUNfUkVHX1NIU1JYX1JFR09GRlNFVF9CSVRPRkZTRVRfUE9TKSAmIERBQ19SRUdfU0hTUlhfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCk7CisKKyAgcmV0dXJuICh1aW50MzJfdCkgUkVBRF9CSVQoKnByZWcsIERBQ19TSFNSMV9UU0FNUExFMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzYW1wbGUtYW5kLWhvbGQgdGltaW5nIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWw6CisgICogICAgICAgICBob2xkIHRpbWUKKyAgKiBAcm10b2xsIFNISFIgICAgIFRIT0xEMSAgICAgICAgIExMX0RBQ19TZXRTYW1wbGVBbmRIb2xkSG9sZFRpbWVcbgorICAqICAgICAgICAgU0hIUiAgICAgVEhPTEQyICAgICAgICAgTExfREFDX1NldFNhbXBsZUFuZEhvbGRIb2xkVGltZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIEhvbGRUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4M0ZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0U2FtcGxlQW5kSG9sZEhvbGRUaW1lKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgSG9sZFRpbWUpCit7CisgIE1PRElGWV9SRUcoREFDeC0+U0hIUiwKKyAgICAgICAgICAgICBEQUNfU0hIUl9USE9MRDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgSG9sZFRpbWUgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2FtcGxlLWFuZC1ob2xkIHRpbWluZyBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgaG9sZCB0aW1lCisgICogQHJtdG9sbCBTSEhSICAgICBUSE9MRDEgICAgICAgICBMTF9EQUNfR2V0U2FtcGxlQW5kSG9sZEhvbGRUaW1lXG4KKyAgKiAgICAgICAgIFNISFIgICAgIFRIT0xEMiAgICAgICAgIExMX0RBQ19HZXRTYW1wbGVBbmRIb2xkSG9sZFRpbWUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weDNGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19HZXRTYW1wbGVBbmRIb2xkSG9sZFRpbWUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQUN4LT5TSEhSLCBEQUNfU0hIUl9USE9MRDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNhbXBsZS1hbmQtaG9sZCB0aW1pbmcgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDoKKyAgKiAgICAgICAgIHJlZnJlc2ggdGltZQorICAqIEBybXRvbGwgU0hSUiAgICAgVFJFRlJFU0gxICAgICAgTExfREFDX1NldFNhbXBsZUFuZEhvbGRSZWZyZXNoVGltZVxuCisgICogICAgICAgICBTSFJSICAgICBUUkVGUkVTSDIgICAgICBMTF9EQUNfU2V0U2FtcGxlQW5kSG9sZFJlZnJlc2hUaW1lCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEBwYXJhbSAgUmVmcmVzaFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfU2V0U2FtcGxlQW5kSG9sZFJlZnJlc2hUaW1lKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgUmVmcmVzaFRpbWUpCit7CisgIE1PRElGWV9SRUcoREFDeC0+U0hSUiwKKyAgICAgICAgICAgICBEQUNfU0hSUl9UUkVGUkVTSDEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSyksCisgICAgICAgICAgICAgUmVmcmVzaFRpbWUgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2FtcGxlLWFuZC1ob2xkIHRpbWluZyBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsOgorICAqICAgICAgICAgcmVmcmVzaCB0aW1lCisgICogQHJtdG9sbCBTSFJSICAgICBUUkVGUkVTSDEgICAgICBMTF9EQUNfR2V0U2FtcGxlQW5kSG9sZFJlZnJlc2hUaW1lXG4KKyAgKiAgICAgICAgIFNIUlIgICAgIFRSRUZSRVNIMiAgICAgIExMX0RBQ19HZXRTYW1wbGVBbmRIb2xkUmVmcmVzaFRpbWUKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfR2V0U2FtcGxlQW5kSG9sZFJlZnJlc2hUaW1lKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREFDeC0+U0hSUiwgREFDX1NIUlJfVFJFRlJFU0gxIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICAgICAgICAgICA+PiAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQSBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgREFDIERNQSB0cmFuc2ZlciByZXF1ZXN0IG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0RBQ19ETUFfR2V0UmVnQWRkcigpLgorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BRU4xICAgICAgICAgTExfREFDX0VuYWJsZURNQVJlcVxuCisgICogICAgICAgICBDUiAgICAgICBETUFFTjIgICAgICAgICBMTF9EQUNfRW5hYmxlRE1BUmVxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZURNQVJlcShEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3Qgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfREFDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBETUFFTjEgICAgICAgICBMTF9EQUNfRGlzYWJsZURNQVJlcVxuCisgICogICAgICAgICBDUiAgICAgICBETUFFTjIgICAgICAgICBMTF9EQUNfRGlzYWJsZURNQVJlcQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlRE1BUmVxKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiAgICAgICAgICgwOiBEQUMgRE1BIHRyYW5zZmVyIHJlcXVlc3QgaXMgZGlzYWJsZWQsIDE6IERBQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IgICAgICAgRE1BRU4xICAgICAgICAgTExfREFDX0lzRE1BUmVxRW5hYmxlZFxuCisgICogICAgICAgICBDUiAgICAgICBETUFFTjIgICAgICAgICBMTF9EQUNfSXNETUFSZXFFbmFibGVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0RNQVJlcUVuYWJsZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICAgICAgICAgICAgREFDX0NSX0RNQUVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkKKyAgICAgICAgICAgPT0gKERBQ19DUl9ETUFFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnVuY3Rpb24gdG8gaGVscCB0byBjb25maWd1cmUgRE1BIHRyYW5zZmVyIHRvIERBQzogcmV0cmlldmUgdGhlCisgICogICAgICAgICBEQUMgcmVnaXN0ZXIgYWRkcmVzcyBmcm9tIERBQyBpbnN0YW5jZSBhbmQgYSBsaXN0IG9mIERBQyByZWdpc3RlcnMKKyAgKiAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggRE1BIHRyYW5zZmVyLgorICAqIEBub3RlICAgVGhlc2UgREFDIHJlZ2lzdGVycyBhcmUgZGF0YSBob2xkaW5nIHJlZ2lzdGVyczoKKyAgKiAgICAgICAgIHdoZW4gREFDIGNvbnZlcnNpb24gaXMgcmVxdWVzdGVkLCBEQUMgZ2VuZXJhdGVzIGEgRE1BIHRyYW5zZmVyCisgICogICAgICAgICByZXF1ZXN0IHRvIGhhdmUgZGF0YSBhdmFpbGFibGUgaW4gREFDIGRhdGEgaG9sZGluZyByZWdpc3RlcnMuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBMTCBETUEgZHJpdmVyLCByZWZlciB0bworICAqICAgICAgICAgZnVuY3Rpb24gIkxMX0RNQV9Db25maWdBZGRyZXNzZXMoKSIuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQTEsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NIQU5ORUxfMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJjwgYXJyYXkgb3IgdmFyaWFibGUgPiwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHIoREFDMSwgTExfREFDX0NIQU5ORUxfMSwgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfUklHSFRfQUxJR05FRCksCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIKTsKKyAgKiBAcm10b2xsIERIUjEyUjEgIERBQ0MxREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBESFIxMkwxICBEQUNDMURIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSOFIxICAgREFDQzFESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIERIUjEyUjIgIERBQ0MyREhSICAgICAgIExMX0RBQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBESFIxMkwyICBEQUNDMkRIUiAgICAgICBMTF9EQUNfRE1BX0dldFJlZ0FkZHJcbgorICAqICAgICAgICAgREhSOFIyICAgREFDQzJESFIgICAgICAgTExfREFDX0RNQV9HZXRSZWdBZGRyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMgorICAqIEBwYXJhbSAgUmVnaXN0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfRE1BX1JFR19EQVRBXzEyQklUU19SSUdIVF9BTElHTkVECisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0RNQV9SRUdfREFUQV8xMkJJVFNfTEVGVF9BTElHTkVECisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0RNQV9SRUdfREFUQV84QklUU19SSUdIVF9BTElHTkVECisgICogQHJldHZhbCBEQUMgcmVnaXN0ZXIgYWRkcmVzcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19ETUFfR2V0UmVnQWRkcihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIHVpbnQzMl90IFJlZ2lzdGVyKQoreworICAvKiBSZXRyaWV2ZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIERIUjEyUngsIERIUjEyTHggb3IgREhSOFJ4IGRlcGVuZGluZyBvbiAgICAgKi8KKyAgLyogREFDIGNoYW5uZWwgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJldHVybiAoKHVpbnQzMl90KShfX0RBQ19QVFJfUkVHX09GRlNFVCgoREFDeCktPkRIUjEyUjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBQ19DaGFubmVsID4+IChSZWdpc3RlciAmIDB4MUZVTCkpICYgREFDX1JFR19ESFJfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCkpKSk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERBQ19MTF9FRl9PcGVyYXRpb24gT3BlcmF0aW9uIG9uIERBQyBjaGFubmVscworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERBQyBzZWxlY3RlZCBjaGFubmVsLgorICAqIEBybXRvbGwgQ1IgICAgICAgRU4xICAgICAgICAgICAgTExfREFDX0VuYWJsZVxuCisgICogICAgICAgICBDUiAgICAgICBFTjIgICAgICAgICAgICBMTF9EQUNfRW5hYmxlCisgICogQG5vdGUgICBBZnRlciBlbmFibGUgZnJvbSBvZmYgc3RhdGUsIERBQyBjaGFubmVsIHJlcXVpcmVzIGEgZGVsYXkKKyAgKiAgICAgICAgIGZvciBvdXRwdXQgdm9sdGFnZSB0byByZWFjaCBhY2N1cmFjeSArLy0gMSBMU0IuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRXQUtFVVAiLgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19FbmFibGUoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBTRVRfQklUKERBQ3gtPkNSLAorICAgICAgICAgIERBQ19DUl9FTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgREFDIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQHJtdG9sbCBDUiAgICAgICBFTjEgICAgICAgICAgICBMTF9EQUNfRGlzYWJsZVxuCisgICogICAgICAgICBDUiAgICAgICBFTjIgICAgICAgICAgICBMTF9EQUNfRGlzYWJsZQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyBlbmFibGUgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogICAgICAgICAoMDogREFDIGNoYW5uZWwgaXMgZGlzYWJsZWQsIDE6IERBQyBjaGFubmVsIGlzIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICBFTjEgICAgICAgICAgICBMTF9EQUNfSXNFbmFibGVkXG4KKyAgKiAgICAgICAgIENSICAgICAgIEVOMiAgICAgICAgICAgIExMX0RBQ19Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzRW5hYmxlZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIHJldHVybiAoKFJFQURfQklUKERBQ3gtPkNSLAorICAgICAgICAgICAgICAgICAgICBEQUNfQ1JfRU4xIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spKQorICAgICAgICAgICA9PSAoREFDX0NSX0VOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgREFDIHRyaWdnZXIgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICogQG5vdGUgICAtIElmIERBQyB0cmlnZ2VyIGlzIGRpc2FibGVkLCBEQUMgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKKyAgKiAgICAgICAgICAgYXV0b21hdGljYWxseSBvbmNlIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgaXMgdXBkYXRlZCwKKyAgKiAgICAgICAgICAgdXNpbmcgZnVuY3Rpb25zICJMTF9EQUNfQ29udmVydERhdGF7ODsgMTJ9e1JpZ2h0OyBMZWZ0fSBBbGlnbmVkKCkiOgorICAqICAgICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKCksIC4uLgorICAqICAgICAgICAgLSBJZiBEQUMgdHJpZ2dlciBpcyBlbmFibGVkLCBEQUMgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKKyAgKiAgICAgICAgICAgb25seSB3aGVuIGEgaGFyZHdhcmUgb2Ygc29mdHdhcmUgdHJpZ2dlciBldmVudCBpcyBvY2N1cnJpbmcuCisgICogICAgICAgICAgIFNlbGVjdCB0cmlnZ2VyIHNvdXJjZSB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0RBQ19TZXRUcmlnZ2VyU291cmNlKCkuCisgICogQHJtdG9sbCBDUiAgICAgICBURU4xICAgICAgICAgICBMTF9EQUNfRW5hYmxlVHJpZ2dlclxuCisgICogICAgICAgICBDUiAgICAgICBURU4yICAgICAgICAgICBMTF9EQUNfRW5hYmxlVHJpZ2dlcgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19FbmFibGVUcmlnZ2VyKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICBEQUNfQ1JfVEVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEQUMgdHJpZ2dlciBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENSICAgICAgIFRFTjEgICAgICAgICAgIExMX0RBQ19EaXNhYmxlVHJpZ2dlclxuCisgICogICAgICAgICBDUiAgICAgICBURU4yICAgICAgICAgICBMTF9EQUNfRGlzYWJsZVRyaWdnZXIKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRGlzYWJsZVRyaWdnZXIoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBDTEVBUl9CSVQoREFDeC0+Q1IsCisgICAgICAgICAgICBEQUNfQ1JfVEVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyB0cmlnZ2VyIHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsLgorICAqICAgICAgICAgKDA6IERBQyB0cmlnZ2VyIGlzIGRpc2FibGVkLCAxOiBEQUMgdHJpZ2dlciBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IgICAgICAgVEVOMSAgICAgICAgICAgTExfREFDX0lzVHJpZ2dlckVuYWJsZWRcbgorICAqICAgICAgICAgQ1IgICAgICAgVEVOMiAgICAgICAgICAgTExfREFDX0lzVHJpZ2dlckVuYWJsZWQKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzVHJpZ2dlckVuYWJsZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVChEQUN4LT5DUiwKKyAgICAgICAgICAgICAgICAgICAgREFDX0NSX1RFTjEgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykpCisgICAgICAgICAgID09IChEQUNfQ1JfVEVOMSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmlnIERBQyBjb252ZXJzaW9uIGJ5IHNvZnR3YXJlIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQG5vdGUgICBQcmVsaW1pbmFyaWx5LCBEQUMgdHJpZ2dlciBtdXN0IGJlIHNldCB0byBzb2Z0d2FyZSB0cmlnZ2VyCisgICogICAgICAgICB1c2luZyBmdW5jdGlvbgorICAqICAgICAgICAgICBAcmVmIExMX0RBQ19Jbml0KCkKKyAgKiAgICAgICAgICAgQHJlZiBMTF9EQUNfU2V0VHJpZ2dlclNvdXJjZSgpCisgICogICAgICAgICB3aXRoIHBhcmFtZXRlciAiTExfREFDX1RSSUdHRVJfU09GVFdBUkUiLgorICAqICAgICAgICAgYW5kIERBQyB0cmlnZ2VyIG11c3QgYmUgZW5hYmxlZCB1c2luZworICAqICAgICAgICAgZnVuY3Rpb24gQHJlZiBMTF9EQUNfRW5hYmxlVHJpZ2dlcigpLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgZmVhdHVyaW5nIERBQyB3aXRoIDIgY2hhbm5lbHM6IHRoaXMgZnVuY3Rpb24KKyAgKiAgICAgICAgIGNhbiBwZXJmb3JtIGEgU1cgc3RhcnQgb2YgYm90aCBEQUMgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuCisgICogICAgICAgICBUd28gY2hhbm5lbHMgY2FuIGJlIHNlbGVjdGVkIGFzIHBhcmFtZXRlci4KKyAgKiAgICAgICAgIEV4YW1wbGU6IChMTF9EQUNfQ0hBTk5FTF8xIHwgTExfREFDX0NIQU5ORUxfMikKKyAgKiBAcm10b2xsIFNXVFJJR1IgIFNXVFJJRzEgICAgICAgIExMX0RBQ19UcmlnU1dDb252ZXJzaW9uXG4KKyAgKiAgICAgICAgIFNXVFJJR1IgIFNXVFJJRzIgICAgICAgIExMX0RBQ19UcmlnU1dDb252ZXJzaW9uCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgREFDX0NoYW5uZWwgIFRoaXMgcGFyYW1ldGVyIGNhbiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfVHJpZ1NXQ29udmVyc2lvbihEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwpCit7CisgIFNFVF9CSVQoREFDeC0+U1dUUklHUiwKKyAgICAgICAgICAoREFDX0NoYW5uZWwgJiBEQUNfU1dUUl9DSFhfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDEyIGJpdHMgbGVmdCBhbGlnbm1lbnQgKExTQiBhbGlnbmVkIG9uIGJpdCAwKSwKKyAgKiAgICAgICAgIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHJtdG9sbCBESFIxMlIxICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydERhdGExMlJpZ2h0QWxpZ25lZFxuCisgICogICAgICAgICBESFIxMlIyICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydERhdGExMlJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgRGF0YSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fREFDX1BUUl9SRUdfT0ZGU0VUKERBQ3gtPkRIUjEyUjEsIChEQUNfQ2hhbm5lbCA+PiBEQUNfUkVHX0RIUjEyUlhfUkVHT0ZGU0VUX0JJVE9GRlNFVF9QT1MpICYgREFDX1JFR19ESFJfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCk7CisKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBEQUNfREhSMTJSMV9EQUNDMURIUiwKKyAgICAgICAgICAgICBEYXRhKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGluIGZvcm1hdCAxMiBiaXRzIGxlZnQgYWxpZ25tZW50IChNU0IgYWxpZ25lZCBvbiBiaXQgMTUpLAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIERIUjEyTDEgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YTEyTGVmdEFsaWduZWRcbgorICAqICAgICAgICAgREhSMTJMMiAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhMTJMZWZ0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RGF0YTEyTGVmdEFsaWduZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsLCB1aW50MzJfdCBEYXRhKQoreworICBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19EQUNfUFRSX1JFR19PRkZTRVQoREFDeC0+REhSMTJSMSwgKERBQ19DaGFubmVsID4+IERBQ19SRUdfREhSMTJMWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykgJiBEQUNfUkVHX0RIUl9SRUdPRkZTRVRfTUFTS19QT1NCSVQwKTsKKworICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19ESFIxMkwxX0RBQ0MxREhSLAorICAgICAgICAgICAgIERhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDggYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIERIUjhSMSAgIERBQ0MxREhSICAgICAgIExMX0RBQ19Db252ZXJ0RGF0YThSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSOFIyICAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREYXRhOFJpZ2h0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERBQ19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREFDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzIKKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ29udmVydERhdGE4UmlnaHRBbGlnbmVkKERBQ19UeXBlRGVmICpEQUN4LCB1aW50MzJfdCBEQUNfQ2hhbm5lbCwgdWludDMyX3QgRGF0YSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fREFDX1BUUl9SRUdfT0ZGU0VUKERBQ3gtPkRIUjEyUjEsIChEQUNfQ2hhbm5lbCA+PiBEQUNfUkVHX0RIUjhSWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykgJiBEQUNfUkVHX0RIUl9SRUdPRkZTRVRfTUFTS19QT1NCSVQwKTsKKworICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIERBQ19ESFI4UjFfREFDQzFESFIsCisgICAgICAgICAgICAgRGF0YSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGluIGZvcm1hdCAxMiBiaXRzIGxlZnQgYWxpZ25tZW50IChMU0IgYWxpZ25lZCBvbiBiaXQgMCksCisgICogICAgICAgICBmb3IgYm90aCBEQUMgY2hhbm5lbHMuCisgICogQHJtdG9sbCBESFIxMlJEICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJSaWdodEFsaWduZWRcbgorICAqICAgICAgICAgREhSMTJSRCAgREFDQzJESFIgICAgICAgTExfREFDX0NvbnZlcnREdWFsRGF0YTEyUmlnaHRBbGlnbmVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwxIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHBhcmFtICBEYXRhQ2hhbm5lbDIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19Db252ZXJ0RHVhbERhdGExMlJpZ2h0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgRGF0YUNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFDaGFubmVsMikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5ESFIxMlJELAorICAgICAgICAgICAgIChEQUNfREhSMTJSRF9EQUNDMkRIUiB8IERBQ19ESFIxMlJEX0RBQ0MxREhSKSwKKyAgICAgICAgICAgICAoKERhdGFDaGFubmVsMiA8PCBEQUNfREhSMTJSRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TKSB8IERhdGFDaGFubmVsMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDEyIGJpdHMgbGVmdCBhbGlnbm1lbnQgKE1TQiBhbGlnbmVkIG9uIGJpdCAxNSksCisgICogICAgICAgICBmb3IgYm90aCBEQUMgY2hhbm5lbHMuCisgICogQHJtdG9sbCBESFIxMkxEICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZFxuCisgICogICAgICAgICBESFIxMkxEICBEQUNDMkRIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZAorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFDaGFubmVsMSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ29udmVydER1YWxEYXRhMTJMZWZ0QWxpZ25lZChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgRGF0YUNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YUNoYW5uZWwyKQoreworICAvKiBOb3RlOiBEYXRhIG9mIERBQyBjaGFubmVsIDIgc2hpZnQgdmFsdWUgc3VidHJhY3RlZCBvZiA0IGJlY2F1c2UgICAgICAgICAgKi8KKyAgLyogICAgICAgZGF0YSBvbiAxNiBiaXRzIGFuZCBEQUMgY2hhbm5lbCAyIGJpdHMgZmllbGQgaXMgb24gdGhlIDEyIE1TQiwgICAgICovCisgIC8qICAgICAgIHRoZSA0IExTQiBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNoaWZ0IHZhbHVlLiAgICAgICAgICAqLworICBNT0RJRllfUkVHKERBQ3gtPkRIUjEyTEQsCisgICAgICAgICAgICAgKERBQ19ESFIxMkxEX0RBQ0MyREhSIHwgREFDX0RIUjEyTERfREFDQzFESFIpLAorICAgICAgICAgICAgICgoRGF0YUNoYW5uZWwyIDw8IChEQUNfREhSMTJMRF9EQUNDMkRIUl9CSVRPRkZTRVRfUE9TIC0gNFUpKSB8IERhdGFDaGFubmVsMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGF0YSB0byBiZSBsb2FkZWQgaW4gdGhlIGRhdGEgaG9sZGluZyByZWdpc3RlcgorICAqICAgICAgICAgaW4gZm9ybWF0IDggYml0cyBsZWZ0IGFsaWdubWVudCAoTFNCIGFsaWduZWQgb24gYml0IDApLAorICAqICAgICAgICAgZm9yIGJvdGggREFDIGNoYW5uZWxzLgorICAqIEBybXRvbGwgREhSOFJEICBEQUNDMURIUiAgICAgICBMTF9EQUNfQ29udmVydER1YWxEYXRhOFJpZ2h0QWxpZ25lZFxuCisgICogICAgICAgICBESFI4UkQgIERBQ0MyREhSICAgICAgIExMX0RBQ19Db252ZXJ0RHVhbERhdGE4UmlnaHRBbGlnbmVkCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwxIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEBwYXJhbSAgRGF0YUNoYW5uZWwyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NvbnZlcnREdWFsRGF0YThSaWdodEFsaWduZWQoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERhdGFDaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGFDaGFubmVsMikKK3sKKyAgTU9ESUZZX1JFRyhEQUN4LT5ESFI4UkQsCisgICAgICAgICAgICAgKERBQ19ESFI4UkRfREFDQzJESFIgfCBEQUNfREhSOFJEX0RBQ0MxREhSKSwKKyAgICAgICAgICAgICAoKERhdGFDaGFubmVsMiA8PCBEQUNfREhSOFJEX0RBQ0MyREhSX0JJVE9GRlNFVF9QT1MpIHwgRGF0YUNoYW5uZWwxKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBvdXRwdXQgZGF0YSBjdXJyZW50bHkgZ2VuZXJhdGVkIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQG5vdGUgICBXaGF0ZXZlciBhbGlnbm1lbnQgYW5kIHJlc29sdXRpb24gc2V0dGluZ3MKKyAgKiAgICAgICAgICh1c2luZyBmdW5jdGlvbnMgIkxMX0RBQ19Db252ZXJ0RGF0YXs4OyAxMn17UmlnaHQ7IExlZnR9IEFsaWduZWQoKSI6CisgICogICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkKCksIC4uLiksCisgICogICAgICAgICBvdXRwdXQgZGF0YSBmb3JtYXQgaXMgMTIgYml0cyByaWdodCBhbGlnbmVkIChMU0IgYWxpZ25lZCBvbiBiaXQgMCkuCisgICogQHJtdG9sbCBET1IxICAgICBEQUNDMURPUiAgICAgICBMTF9EQUNfUmV0cmlldmVPdXRwdXREYXRhXG4KKyAgKiAgICAgICAgIERPUjIgICAgIERBQ0MyRE9SICAgICAgIExMX0RBQ19SZXRyaWV2ZU91dHB1dERhdGEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19SZXRyaWV2ZU91dHB1dERhdGEoREFDX1R5cGVEZWYgKkRBQ3gsIHVpbnQzMl90IERBQ19DaGFubmVsKQoreworICBfX0lPIHVpbnQzMl90IGNvbnN0ICpwcmVnID0gX19EQUNfUFRSX1JFR19PRkZTRVQoREFDeC0+RE9SMSwgKERBQ19DaGFubmVsID4+IERBQ19SRUdfRE9SWF9SRUdPRkZTRVRfQklUT0ZGU0VUX1BPUykgJiBEQUNfUkVHX0RPUlhfUkVHT0ZGU0VUX01BU0tfUE9TQklUMCk7CisKKyAgcmV0dXJuICh1aW50MTZfdCkgUkVBRF9CSVQoKnByZWcsIERBQ19ET1IxX0RBQ0MxRE9SKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgY2FsaWJyYXRpb24gb2Zmc2V0IGZsYWcgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIFNSICAgICAgIENBTF9GTEFHMSAgICAgIExMX0RBQ19Jc0FjdGl2ZUZsYWdfQ0FMMQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNBY3RpdmVGbGFnX0NBTDEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19DQUwxKSA9PSAoTExfREFDX0ZMQUdfQ0FMMSkpID8gMVVMIDogMFVMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgY2FsaWJyYXRpb24gb2Zmc2V0IGZsYWcgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIFNSICAgICAgIENBTF9GTEFHMiAgICAgIExMX0RBQ19Jc0FjdGl2ZUZsYWdfQ0FMMgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNBY3RpdmVGbGFnX0NBTDIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19DQUwyKSA9PSAoTExfREFDX0ZMQUdfQ0FMMikpID8gMVVMIDogMFVMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBEQUMgYnVzeSB3cml0aW5nIHNhbXBsZSB0aW1lIGZsYWcgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIFNSICAgICAgIEJXU1QxICAgICAgICAgIExMX0RBQ19Jc0FjdGl2ZUZsYWdfQldTVDEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzQWN0aXZlRmxhZ19CV1NUMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoREFDeC0+U1IsIExMX0RBQ19GTEFHX0JXU1QxKSA9PSAoTExfREFDX0ZMQUdfQldTVDEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBHZXQgREFDIGJ1c3kgd3JpdGluZyBzYW1wbGUgdGltZSBmbGFnIGZvciBEQUMgY2hhbm5lbCAyCisgICogQHJtdG9sbCBTUiAgICAgICBCV1NUMiAgICAgICAgICBMTF9EQUNfSXNBY3RpdmVGbGFnX0JXU1QyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0FjdGl2ZUZsYWdfQldTVDIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19CV1NUMikgPT0gKExMX0RBQ19GTEFHX0JXU1QyKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIxICAgICAgICBMTF9EQUNfSXNBY3RpdmVGbGFnX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREFDX0lzQWN0aXZlRmxhZ19ETUFVRFIxKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMSkgPT0gKExMX0RBQ19GTEFHX0RNQVVEUjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBHZXQgREFDIHVuZGVycnVuIGZsYWcgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIFNSICAgICAgIERNQVVEUjIgICAgICAgIExMX0RBQ19Jc0FjdGl2ZUZsYWdfRE1BVURSMgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNBY3RpdmVGbGFnX0RNQVVEUjIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKERBQ3gtPlNSLCBMTF9EQUNfRkxBR19ETUFVRFIyKSA9PSAoTExfREFDX0ZMQUdfRE1BVURSMikpID8gMVVMIDogMFVMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIERBQyB1bmRlcnJ1biBmbGFnIGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBTUiAgICAgICBETUFVRFIxICAgICAgICBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfQ2xlYXJGbGFnX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFdSSVRFX1JFRyhEQUN4LT5TUiwgTExfREFDX0ZMQUdfRE1BVURSMSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciBEQUMgdW5kZXJydW4gZmxhZyBmb3IgREFDIGNoYW5uZWwgMgorICAqIEBybXRvbGwgU1IgICAgICAgRE1BVURSMiAgICAgICAgTExfREFDX0NsZWFyRmxhZ19ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0NsZWFyRmxhZ19ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICBXUklURV9SRUcoREFDeC0+U1IsIExMX0RBQ19GTEFHX0RNQVVEUjIpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDEKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMSAgICAgIExMX0RBQ19FbmFibGVJVF9ETUFVRFIxCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZUlUX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTEpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19FbmFibGVJVF9ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREFDX0VuYWJsZUlUX0RNQVVEUjIoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIFNFVF9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTIpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgdW5kZXJydW4gaW50ZXJydXB0IGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBDUiAgICAgICBETUFVRFJJRTEgICAgICBMTF9EQUNfRGlzYWJsZUlUX0RNQVVEUjEKKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQUNfRGlzYWJsZUlUX0RNQVVEUjEoREFDX1R5cGVEZWYgKkRBQ3gpCit7CisgIENMRUFSX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RBQ19EaXNhYmxlSVRfRE1BVURSMihEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgQ0xFQVJfQklUKERBQ3gtPkNSLCBMTF9EQUNfSVRfRE1BVURSSUUyKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgdW5kZXJydW4gaW50ZXJydXB0IGZvciBEQUMgY2hhbm5lbCAxCisgICogQHJtdG9sbCBDUiAgICAgICBETUFVRFJJRTEgICAgICBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMQorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQUNfSXNFbmFibGVkSVRfRE1BVURSMShEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoREFDeC0+Q1IsIExMX0RBQ19JVF9ETUFVRFJJRTEpID09IChMTF9EQUNfSVRfRE1BVURSSUUxKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgZm9yIERBQyBjaGFubmVsIDIKKyAgKiBAcm10b2xsIENSICAgICAgIERNQVVEUklFMiAgICAgIExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIyCisgICogQHBhcmFtICBEQUN4IERBQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RBQ19Jc0VuYWJsZWRJVF9ETUFVRFIyKERBQ19UeXBlRGVmICpEQUN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChEQUN4LT5DUiwgTExfREFDX0lUX0RNQVVEUklFMikgPT0gKExMX0RBQ19JVF9ETUFVRFJJRTIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBEQUNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfREFDX0RlSW5pdChEQUNfVHlwZURlZiAqREFDeCk7CitFcnJvclN0YXR1cyBMTF9EQUNfSW5pdChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIExMX0RBQ19Jbml0VHlwZURlZiAqREFDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfREFDX1N0cnVjdEluaXQoTExfREFDX0luaXRUeXBlRGVmICpEQUNfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBEQUMxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfREFDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfZG1hLmggYi9JbmMvc3RtMzJnMHh4X2xsX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGVmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX2RtYS5oCkBAIC0wLDAgKzEsMjE2NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9kbWEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9ETUFfSAorI2RlZmluZSBTVE0zMkcweHhfTExfRE1BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9kbWFtdXguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRE1BMSkKKworLyoqIEBkZWZncm91cCBETUFfTEwgRE1BCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBETUEgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIERNQSBjaGFubmVsIHJlZ2lzdGVyIG9mZnNldCB2ZXJzdXMgY2hhbm5lbCBpbmRleCBMTF9ETUFfQ0hBTk5FTF94ICovCitzdGF0aWMgY29uc3QgdWludDhfdCBDSEFOTkVMX09GRlNFVF9UQUJbXSA9Cit7CisgICh1aW50OF90KShETUExX0NoYW5uZWwxX0JBU0UgLSBETUExX0JBU0UpLAorICAodWludDhfdCkoRE1BMV9DaGFubmVsMl9CQVNFIC0gRE1BMV9CQVNFKSwKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDNfQkFTRSAtIERNQTFfQkFTRSksCisgICh1aW50OF90KShETUExX0NoYW5uZWw0X0JBU0UgLSBETUExX0JBU0UpLAorICAodWludDhfdCkoRE1BMV9DaGFubmVsNV9CQVNFIC0gRE1BMV9CQVNFKSwKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDZfQkFTRSkKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDZfQkFTRSAtIERNQTFfQkFTRSksCisjZW5kaWYKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDdfQkFTRSkKKyAgKHVpbnQ4X3QpKERNQTFfQ2hhbm5lbDdfQkFTRSAtIERNQTFfQkFTRSkKKyNlbmRpZgorfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MgRE1BIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9FU19JTklUIERNQSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0FkZHJlc3M7ICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3MgZm9yIERNQSB0cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFzIFNvdXJjZSBiYXNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0QWRkcmVzczsgIC8qITwgU3BlY2lmaWVzIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciBETUEgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhcyBEZXN0aW5hdGlvbiBiYXNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGLiAqLworCisgIHVpbnQzMl90IERpcmVjdGlvbjsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBkYXRhIHdpbGwgYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gcGVyaXBoZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1lbW9yeSB0byBtZW1vcnkgb3IgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19ESVJFQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbigpLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBub3JtYWwgb3IgY2lyY3VsYXIgb3BlcmF0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlOiBUaGUgY2lyY3VsYXIgYnVmZmVyIG1vZGUgY2Fubm90IGJlIHVzZWQgaWYgdGhlIG1lbW9yeSB0byBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0TW9kZSgpLiAqLworCisgIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjSW5jTW9kZTsgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyBvciBTb3VyY2UgYWRkcmVzcyBpbiBjYXNlIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW5jcmVtZW50ZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX1BFUklQSAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZSgpLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0SW5jTW9kZTsgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE1lbW9yeSBhZGRyZXNzIG9yIERlc3RpbmF0aW9uIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19NRU1PUlkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1lbW9yeUluY01vZGUoKS4gKi8KKworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0RhdGFTaXplOyAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBkYXRhIHNpemUgYWxpZ25tZW50IG9yIFNvdXJjZSBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QREFUQUFMSUdOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRQZXJpcGhTaXplKCkuICovCisKKyAgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIE1lbW9yeSBkYXRhIHNpemUgYWxpZ25tZW50IG9yIERlc3RpbmF0aW9uIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKGJ5dGUsIGhhbGYgd29yZCwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01EQVRBQUxJR04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1lbW9yeVNpemUoKS4gKi8KKworICB1aW50MzJfdCBOYkRhdGE7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNmZXIsIGluIGRhdGEgdW5pdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YSB1bml0IGlzIGVxdWFsIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGNvbmZpZ3VyYXRpb24gc2V0IGluIFBlcmlwaGVyYWxTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTWVtb3J5U2l6ZSBwYXJhbWV0ZXJzIGRlcGVuZGluZyBpbiB0aGUgdHJhbnNmZXIgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDAwMDBGRkZGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhTGVuZ3RoKCkuICovCisKKyAgdWludDMyX3QgUGVyaXBoUmVxdWVzdDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlwaGVyYWwgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQU1VWF9MTF9FQ19SRVFVRVNUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KCkuICovCisKKyAgdWludDMyX3QgUHJpb3JpdHk7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfUFJJT1JJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsKCkuICovCisKK30gTExfRE1BX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9Db25zdGFudHMgRE1BIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYxICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGMSAgICAgICAgLyohPCBDaGFubmVsIDEgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjEgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUYxICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYxICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGMSAgICAgICAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGMSAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjEgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGMiAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjIgICAgICAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUYyICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGMiAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGMiAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjIgICAgICAgLyohPCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjIgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUYyICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjMgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUYzICAgICAgICAvKiE8IENoYW5uZWwgMyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjMgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjMgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUYzICAgICAgIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUYzICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGMyAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY0ICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGNCAgICAgICAgLyohPCBDaGFubmVsIDQgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjQgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUY0ICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY0ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGNCAgICAgICAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNCAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjQgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNSAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjUgICAgICAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY1ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNSAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNSAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjUgICAgICAgLyohPCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjUgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY1ICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY2ICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGNiAgICAgICAgLyohPCBDaGFubmVsIDYgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjYgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUY2ICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY2ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGNiAgICAgICAvKiE8IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNiAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjYgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw3KQorI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNyAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjcgICAgICAgIC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY3ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNyAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNyAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjcgICAgICAgLyohPCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjcgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY3ICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYxICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGMSAgICAgICAgICAvKiE8IENoYW5uZWwgMSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjEgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUYxICAgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYxICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGMSAgICAgICAgIC8qITwgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGMSAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjEgICAgICAgICAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGMiAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjIgICAgICAgICAgLyohPCBDaGFubmVsIDIgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYyICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMiAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGMiAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjIgICAgICAgICAvKiE8IENoYW5uZWwgMiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjIgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYyICAgICAgICAgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjMgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYzICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjMgICAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjMgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUYzICAgICAgICAgLyohPCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYzICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGMyAgICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY0ICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNCAgICAgICAgICAvKiE8IENoYW5uZWwgNCBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjQgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY0ICAgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY0ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNCAgICAgICAgIC8qITwgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNCAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjQgICAgICAgICAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNSAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjUgICAgICAgICAgLyohPCBDaGFubmVsIDUgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY1ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNSAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNSAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjUgICAgICAgICAvKiE8IENoYW5uZWwgNSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjUgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY1ICAgICAgICAgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2lmIGRlZmluZWQoRE1BMV9DaGFubmVsNikKKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY2ICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNiAgICAgICAgICAvKiE8IENoYW5uZWwgNiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjYgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY2ICAgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY2ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNiAgICAgICAgIC8qITwgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNiAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjYgICAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNyAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjcgICAgICAgICAgLyohPCBDaGFubmVsIDcgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY3ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNyAgICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNyAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjcgICAgICAgICAvKiE8IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjcgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY3ICAgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfUmVhZFJlZyBhbmQgIExMX0RNQV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfQ0NSX1RDSUUgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9UQ0lFICAgICAgICAgIC8qITwgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX0RNQV9DQ1JfSFRJRSAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0hUSUUgICAgICAgICAgLyohPCBIYWxmIFRyYW5zZmVyIGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0NDUl9URUlFICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVEVJRSAgICAgICAgICAvKiE8IFRyYW5zZmVyIGVycm9yIGludGVycnVwdCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfQ0hBTk5FTCBDSEFOTkVMCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgRE1BIENoYW5uZWwgMSAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBETUEgQ2hhbm5lbCAyICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAvKiE8IERNQSBDaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVIC8qITwgRE1BIENoYW5uZWwgNCAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNVUgLyohPCBETUEgQ2hhbm5lbCA1ICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw2KQorI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUgLyohPCBETUEgQ2hhbm5lbCA2ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzcgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3VSAvKiE8IERNQSBDaGFubmVsIDcgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF9BTEwgICAgICAgICAgICAgICAgMHhGRkZGMDAwMFUgLyohPCBETUEgQ2hhbm5lbCBhbGwgKHVzZWQgb25seSBmb3IgZnVuY3Rpb24gQHJlZiBMTF9ETUFfRGVJbml0KCkuICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfRElSRUNUSU9OIFRyYW5zZmVyIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgdG8gbWVtb3J5IGRpcmVjdGlvbiAqLworI2RlZmluZSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggRE1BX0NDUl9ESVIgICAgICAgICAgICAgLyohPCBNZW1vcnkgdG8gcGVyaXBoZXJhbCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIERNQV9DQ1JfTUVNMk1FTSAgICAgICAgIC8qITwgTWVtb3J5IHRvIG1lbW9yeSBkaXJlY3Rpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NT0RFIFRyYW5zZmVyIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBOb3JtYWwgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9NT0RFX0NJUkNVTEFSICAgICAgICAgICAgICBETUFfQ0NSX0NJUkMgICAgICAgICAgICAvKiE8IENpcmN1bGFyIE1vZGUgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BFUklQSCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQgICAgICAgICAgIERNQV9DQ1JfUElOQyAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NRU1PUlkgTWVtb3J5IGluY3JlbWVudCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgICAgICAgICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIEVuYWJsZSAgKi8KKyNkZWZpbmUgTExfRE1BX01FTU9SWV9OT0lOQ1JFTUVOVCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTWVtb3J5IGluY3JlbWVudCBtb2RlIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX1BEQVRBQUxJR04gUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QREFUQUFMSUdOX0JZVEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRCAgICAgICAgRE1BX0NDUl9QU0laRV8wICAgICAgICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogSGFsZldvcmQgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fV09SRCAgICAgICAgICAgIERNQV9DQ1JfUFNJWkVfMSAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19NREFUQUFMSUdOIE1lbW9yeSBkYXRhIGFsaWdubWVudAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEICAgICAgICBETUFfQ0NSX01TSVpFXzAgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIExMX0RNQV9NREFUQUFMSUdOX1dPUkQgICAgICAgICAgICBETUFfQ0NSX01TSVpFXzEgICAgICAgICAvKiE8IE1lbW9yeSBkYXRhIGFsaWdubWVudCA6IFdvcmQgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QUklPUklUWSBUcmFuc2ZlciBQcmlvcml0eSBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9MT1cgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTG93ICAgICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9NRURJVU0gICAgICAgICAgICBETUFfQ0NSX1BMXzAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogTWVkaXVtICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9ISUdIICAgICAgICAgICAgICBETUFfQ0NSX1BMXzEgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogSGlnaCAgICAgICovCisjZGVmaW5lIExMX0RNQV9QUklPUklUWV9WRVJZSElHSCAgICAgICAgICBETUFfQ0NSX1BMICAgICAgICAgICAgICAvKiE8IFByaW9yaXR5IGxldmVsIDogVmVyeV9IaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfTWFjcm9zIERNQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBETUEgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUEgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0RNQV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9ETUFfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VNX0NPTlZFUlRfRE1BeENIQU5ORUx5IENvbnZlcnQgRE1BeENoYW5uZWx5CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29udmVydCBETUF4X0NoYW5uZWx5IGludG8gRE1BeAorICAqIEBwYXJhbSAgX19DSEFOTkVMX0lOU1RBTkNFX18gRE1BeF9DaGFubmVseQorICAqIEByZXR2YWwgRE1BeAorICAqLworI2RlZmluZSBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UoX19DSEFOTkVMX0lOU1RBTkNFX18pICAoRE1BMSkKKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IERNQXhfQ2hhbm5lbHkgaW50byBMTF9ETUFfQ0hBTk5FTF95CisgICogQHBhcmFtICBfX0NIQU5ORUxfSU5TVEFOQ0VfXyBETUF4X0NoYW5uZWx5CisgICogQHJldHZhbCBMTF9ETUFfQ0hBTk5FTF95CisgICovCisjaWYgZGVmaW5lZChETUExX0NoYW5uZWw2KSAmJiBkZWZpbmVkKERNQTFfQ2hhbm5lbDcpCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSAgIFwKKygoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgPyBMTF9ETUFfQ0hBTk5FTF8xIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKSA/IExMX0RNQV9DSEFOTkVMXzIgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpID8gTExfRE1BX0NIQU5ORUxfMyA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgPyBMTF9ETUFfQ0hBTk5FTF80IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKSA/IExMX0RNQV9DSEFOTkVMXzUgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpID8gTExfRE1BX0NIQU5ORUxfNiA6IFwKKyBMTF9ETUFfQ0hBTk5FTF83KQorI2Vsc2UKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgXAorKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSkgPyBMTF9ETUFfQ0hBTk5FTF8zIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgTExfRE1BX0NIQU5ORUxfNSkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgRE1BIEluc3RhbmNlIERNQXggYW5kIExMX0RNQV9DSEFOTkVMX3kgaW50byBETUF4X0NoYW5uZWx5CisgICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIExMX0RNQV9DSEFOTkVMX3kKKyAgKiBAcmV0dmFsIERNQXhfQ2hhbm5lbHkKKyAgKi8KKyNpZiBkZWZpbmVkKERNQTFfQ2hhbm5lbDYpICYmIGRlZmluZWQoRE1BMV9DaGFubmVsNykKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUxfSU5TVEFOQ0UoX19ETUFfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICAgXAorKCgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8xKSkpID8gRE1BMV9DaGFubmVsMSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSA/IERNQTFfQ2hhbm5lbDIgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzMpKSkgPyBETUExX0NoYW5uZWwzIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF80KSkpID8gRE1BMV9DaGFubmVsNCA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSA/IERNQTFfQ2hhbm5lbDUgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzYpKSkgPyBETUExX0NoYW5uZWw2IDogXAorIERNQTFfQ2hhbm5lbDcpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShfX0RNQV9JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgICBcCisoKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUExX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMykpKSA/IERNQTFfQ2hhbm5lbDMgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUExX0NoYW5uZWw0IDogXAorIERNQTFfQ2hhbm5lbDUpCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9FbmFibGVDaGFubmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlQ2hhbm5lbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICBTRVRfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwtMVVdKSktPkNDUiwgRE1BX0NDUl9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBFTiAgICAgICAgICAgIExMX0RNQV9EaXNhYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0Rpc2FibGVDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsLTFVXSkpLT5DQ1IsIERNQV9DQ1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBjaGFubmVsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRDaGFubmVsKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgRE1BX0NDUl9FTikgPT0gKERNQV9DQ1JfRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFsbCBwYXJhbWV0ZXJzIGxpbmsgdG8gRE1BIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlcgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTCBvciBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fQllURSBvciBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JEIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgb3IgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTSBvciBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdIIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnVHJhbnNmZXIoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwKKyAgICAgICAgICAgICBETUFfQ0NSX0RJUiB8IERNQV9DQ1JfTUVNMk1FTSB8IERNQV9DQ1JfQ0lSQyB8IERNQV9DQ1JfUElOQyB8IERNQV9DQ1JfTUlOQyB8IERNQV9DQ1JfUFNJWkUgfCBETUFfQ0NSX01TSVpFIHwgRE1BX0NDUl9QTCwKKyAgICAgICAgICAgICBDb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKHJlYWQgZnJvbSBwZXJpcGhlcmFsIG9yIGZyb20gbWVtb3J5KS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwKKyAgICAgICAgICAgICBETUFfQ0NSX0RJUiB8IERNQV9DQ1JfTUVNMk1FTSwgRGlyZWN0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKHJlYWQgZnJvbSBwZXJpcGhlcmFsIG9yIGZyb20gbWVtb3J5KS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0RNQV9HZXREYXRhVHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1FTTJNRU0gICAgICAgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLgorICAqIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAqIGRhdGEgdHJhbnNmZXIgaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9TZXRNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNb2RlKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsIERNQV9DQ1JfQ0lSQywKKyAgICAgICAgICAgICBNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIENJUkMgICAgICAgICAgTExfRE1BX0dldE1vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfQ0lSQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBQZXJpcGhlcmFsIGluY3JlbWVudCBtb2RlLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX1NldFBlcmlwaEluY01vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFBlcmlwaE9yTTJNU3JjSW5jTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjSW5jTW9kZSkKK3sKKyAgICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgICAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwgRE1BX0NDUl9QSU5DLAorICAgICAgICAgICAgIFBlcmlwaE9yTTJNU3JjSW5jTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUElOQyAgICAgICAgICBMTF9ETUFfR2V0UGVyaXBoSW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoSW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUElOQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNZW1vcnkgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTUlOQyAgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsIERNQV9DQ1JfTUlOQywKKyAgICAgICAgICAgICBNZW1vcnlPck0yTURzdEluY01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNZW1vcnkgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTUlOQyAgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5SW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBQZXJpcGhlcmFsIHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoU2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX1dPUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0RhdGFTaXplKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsIERNQV9DQ1JfUFNJWkUsCisgICAgICAgICAgICAgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX1dPUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoU2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUFNJWkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTWVtb3J5IHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5U2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNZW1vcnlTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNZW1vcnlPck0yTURzdERhdGFTaXplKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIE1PRElGWV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsIERNQV9DQ1JfTVNJWkUsCisgICAgICAgICAgICAgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1lbW9yeSBzaXplLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0dldE1lbW9yeVNpemUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fV09SRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNZW1vcnlTaXplKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQcmlvcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUHJpb3JpdHkpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwgRE1BX0NDUl9QTCwKKyAgICAgICAgICAgICBQcmlvcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgcHJpb3JpdHkgbGV2ZWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUEwgICAgICAgICAgICBMTF9ETUFfR2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9WRVJZSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRDaGFubmVsUHJpb3JpdHlMZXZlbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUEwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNmZXIuCisgICogQG5vdGUgICBUaGlzIGFjdGlvbiBoYXMgbm8gZWZmZWN0IGlmCisgICogICAgICAgICBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDTkRUUiAgICAgICAgTkRUICAgICAgICAgICBMTF9ETUFfU2V0RGF0YUxlbmd0aAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTmJEYXRhIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4MDAwMEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXREYXRhTGVuZ3RoKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBOYkRhdGEpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgTU9ESUZZX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNORFRSLAorICAgICAgICAgICAgIERNQV9DTkRUUl9ORFQsIE5iRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLgorICAqIEBub3RlICAgT25jZSB0aGUgY2hhbm5lbCBpcyBlbmFibGVkLCB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHRoZQorICAqICAgICAgICAgcmVtYWluaW5nIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkLgorICAqIEBybXRvbGwgQ05EVFIgICAgICAgIE5EVCAgICAgICAgICAgTExfRE1BX0dldERhdGFMZW5ndGgKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q05EVFIsCisgICAgICAgICAgICAgICAgICAgRE1BX0NORFRSX05EVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBhZGRyZXNzZXMuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSAgIEVhY2ggcGVyaXBoZXJhbCB1c2luZyBETUEgcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBkaXJlY3RseSB0aGUgcmVnaXN0ZXIgYWRyZXNzIChMTF9QUFBfRE1BX0dldFJlZ0FkZHIpLgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0NvbmZpZ0FkZHJlc3Nlc1xuCisgICogICAgICAgICBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBTcmNBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcGFyYW0gIERzdEFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEBwYXJhbSAgRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBICisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTcmNBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgLyogRGlyZWN0aW9uIE1lbW9yeSB0byBQZXJpcGggKi8KKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgpCisgIHsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DTUFSLCBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DUEFSLCBEc3RBZGRyZXNzKTsKKyAgfQorICAvKiBEaXJlY3Rpb24gUGVyaXBoIHRvIE1lbW9yeSBhbmQgTWVtb3J5IHRvIE1lbW9yeSAqLworICBlbHNlCisgIHsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DUEFSLCBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DTUFSLCBEc3RBZGRyZXNzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q01BUiwgTWVtb3J5QWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBQZXJpcGhlcmFsIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFBlcmlwaEFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFBlcmlwaEFkZHJlc3MpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q1BBUiwgUGVyaXBoQWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1lbW9yeSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5QWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNZW1vcnlBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DTUFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKFJFQURfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q1BBUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IHRvIE1lbW9yeSBTb3VyY2UgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9TZXRNMk1TcmNBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNZW1vcnlBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNMk1TcmNBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNZW1vcnlBZGRyZXNzKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIFdSSVRFX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNQQVIsIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IHRvIE1lbW9yeSBEZXN0aW5hdGlvbiBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE0yTURzdEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE0yTURzdEFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgV1JJVEVfUkVHKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q01BUiwgTWVtb3J5QWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IFNvdXJjZSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9HZXRNMk1TcmNBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgcmV0dXJuIChSRUFEX1JFRygoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNQQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgRGVzdGluYXRpb24gYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZIG9ubHkuCisgICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRNMk1Ec3RBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoUkVBRF9SRUcoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DTUFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERNQSByZXF1ZXN0IGZvciBETUEgQ2hhbm5lbHMgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAbm90ZSAgIERNQU1VWCBjaGFubmVsIDAgdG8gNiBhcmUgbWFwcGVkIHRvIERNQTEgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTUVNMk1FTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU02X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU03X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJR19DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19UUklHX0NPTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUNF9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQ0X1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMl9UWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgICh2b2lkKShETUF4KTsKKyAgTU9ESUZZX1JFRygoKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKikoKHVpbnQzMl90KURNQU1VWDFfQ2hhbm5lbDAgKyAoRE1BTVVYX0NDUl9TSVpFICogKENoYW5uZWwgLSAxVUwpKSkpLT5DQ1IsIERNQU1VWF9DeENSX0RNQVJFUV9JRCwgUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSByZXF1ZXN0IGZvciBETUEgQ2hhbm5lbHMgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAbm90ZSAgIERNQU1VWCBjaGFubmVsIDAgdG8gNiBhcmUgbWFwcGVkIHRvIERNQTEgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFU19JTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0RBQzFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMyX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9UUklHX0NPTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfVFJJRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfVFJJRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNNl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNN19VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9UUklHX0NPTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVFJJR19DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUM19SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDRfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUNF9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDJfVFgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQXgpOyAgCisgIHJldHVybiAoUkVBRF9CSVQoKChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICopKCgodWludDMyX3QpRE1BTVVYMV9DaGFubmVsMCArIChETUFNVVhfQ0NSX1NJWkUgKiAoQ2hhbm5lbCAtIDFVTCkpKSkpLT5DQ1IsIERNQU1VWF9DeENSX0RNQVJFUV9JRCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYxICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjEpID09IChETUFfSVNSX0dJRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMiAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYyKSA9PSAoRE1BX0lTUl9HSUYyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjMgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMykgPT0gKERNQV9JU1JfR0lGMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY0ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjQpID09IChETUFfSVNSX0dJRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNSAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY1KSA9PSAoRE1BX0lTUl9HSUY1KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjYgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNikgPT0gKERNQV9JU1JfR0lGNikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY3ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k3CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjcpID09IChETUFfSVNSX0dJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMxKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjEpID09IChETUFfSVNSX1RDSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYyKSA9PSAoRE1BX0lTUl9UQ0lGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjMgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMykgPT0gKERNQV9JU1JfVENJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM0KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjQpID09IChETUFfSVNSX1RDSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY1KSA9PSAoRE1BX0lTUl9UQ0lGNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNikgPT0gKERNQV9JU1JfVENJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjcpID09IChETUFfSVNSX1RDSUY3KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDEgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQxKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjEpID09IChETUFfSVNSX0hUSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYyICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQyKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjIpID09IChETUFfSVNSX0hUSUYyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjMpID09IChETUFfSVNSX0hUSUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDQgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ0KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjQpID09IChETUFfSVNSX0hUSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY1ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ1KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjUpID09IChETUFfSVNSX0hUSUY1KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjYpID09IChETUFfSVNSX0hUSUY2KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEhUSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfSFQ3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfSFRJRjcpID09IChETUFfSVNSX0hUSUY3KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUxCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYxKSA9PSAoRE1BX0lTUl9URUlGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMikgPT0gKERNQV9JU1JfVEVJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYzICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUzKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjMpID09IChETUFfSVNSX1RFSUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNCAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU0CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY0KSA9PSAoRE1BX0lTUl9URUlGNCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNSkgPT0gKERNQV9JU1JfVEVJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY2ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU2KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjYpID09IChETUFfSVNSX1RFSUY2KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU3CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY3KSA9PSAoRE1BX0lTUl9URUlGNykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUYxICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGMiAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0kyKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjMgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUYzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY0ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNSAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k1KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjYgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY2KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY3ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjIgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMyKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDMgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjUgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM1KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY1KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDYgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGMyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNyAgaGFsZiB0cmFuc2ZlciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENIVElGNyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19IVDcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19IVDcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DSFRJRjcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMiB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGMyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNCAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNSB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTYKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENURUlGNyAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19URTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19URTcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVEVJRjcpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX1RDCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfVEMoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsgICAgCisgIFNFVF9CSVQoKChETUFfQ2hhbm5lbF9UeXBlRGVmICopKGRtYV9iYXNlX2FkZHIgKyBDSEFOTkVMX09GRlNFVF9UQUJbQ2hhbm5lbCAtIDFVXSkpLT5DQ1IsIERNQV9DQ1JfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhhbGYgdHJhbnNmZXIgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEhUSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX0hUCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwgRE1BX0NDUl9IVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX1RFCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgU0VUX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwgRE1BX0NDUl9URUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfVEMoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLCBETUFfQ0NSX1RDSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX0hUCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX0hUKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIENMRUFSX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwgRE1BX0NDUl9IVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGVycm9yIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IGRtYV9iYXNlX2FkZHIgPSAodWludDMyX3QpRE1BeDsKKyAgQ0xFQVJfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLCBETUFfQ0NSX1RFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRDSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX1RDCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzRW5hYmxlZElUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVENJRSkgPT0gKERNQV9DQ1JfVENJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIYWxmIHRyYW5zZmVyIEludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEhUSUUgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZElUX0hUCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzRW5hYmxlZElUX0hUKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCBkbWFfYmFzZV9hZGRyID0gKHVpbnQzMl90KURNQXg7CisgIHJldHVybiAoKFJFQURfQklUKCgoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShkbWFfYmFzZV9hZGRyICsgQ0hBTk5FTF9PRkZTRVRfVEFCW0NoYW5uZWwgLSAxVV0pKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfSFRJRSkgPT0gKERNQV9DQ1JfSFRJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBlcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9URQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgZG1hX2Jhc2VfYWRkciA9ICh1aW50MzJfdClETUF4OworICByZXR1cm4gKChSRUFEX0JJVCgoKERNQV9DaGFubmVsX1R5cGVEZWYgKikoZG1hX2Jhc2VfYWRkciArIENIQU5ORUxfT0ZGU0VUX1RBQltDaGFubmVsIC0gMVVdKSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUpID09IChETUFfQ0NSX1RFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0RNQV9Jbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCBMTF9ETUFfSW5pdFR5cGVEZWYgKkRNQV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX0RNQV9EZUluaXQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpOwordm9pZCBMTF9ETUFfU3RydWN0SW5pdChMTF9ETUFfSW5pdFR5cGVEZWYgKkRNQV9Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERNQTEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9kbWFtdXguaCBiL0luYy9zdG0zMmcweHhfbGxfZG1hbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NDY3OAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfZG1hbXV4LmgKQEAgLTAsMCArMSwxNDY4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2RtYW11eC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUFNVVggTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX0RNQU1VWF9ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9ETUFNVVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKERNQU1VWDEpCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMIERNQU1VWAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX1ByaXZhdGVfQ29uc3RhbnRzIERNQU1VWCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZpbmUgdXNlZCB0byBnZXQgRE1BTVVYIENDUiByZWdpc3RlciBzaXplICovCisjZGVmaW5lIERNQU1VWF9DQ1JfU0laRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKworLyogRGVmaW5lIHVzZWQgdG8gZ2V0IERNQU1VWCBSR0NSIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgRE1BTVVYX1JHQ1JfU0laRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQU1VWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFNVVhfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YwICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YyICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMiAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YzICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMyAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y0ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GNCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNSkKKyNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GNSAgICAgICAgICAgICAgIERNQU1VWF9DRlJfQ1NPRjUgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNSAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNikKKyNkZWZpbmUgTExfRE1BTVVYX0NGUl9DU09GNiAgICAgICAgICAgICAgIERNQU1VWF9DRlJfQ1NPRjYgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNiAgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YwICAgICAgICAgICAgRE1BTVVYX1JHQ0ZSX0NPRjAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHQ0ZSX1JHQ09GMSAgICAgICAgICAgIERNQU1VWF9SR0NGUl9DT0YxICAgICAgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovCisjZGVmaW5lIExMX0RNQU1VWF9SR0NGUl9SR0NPRjIgICAgICAgICAgICBETUFNVVhfUkdDRlJfQ09GMiAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YzICAgICAgICAgICAgRE1BTVVYX1JHQ0ZSX0NPRjMgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFNVVhfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMCAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GMSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjIgICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0YyICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMyAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjMgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y0ICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GNCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNSkKKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y1ICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GNSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1ICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChETUFNVVgxX0NoYW5uZWw2KQorI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjYgICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0Y2ICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYgICovCisjZW5kaWYKKyNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjAgICAgICAgICAgICAgIERNQU1VWF9SR1NSX09GMCAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjEgICAgICAgICAgICAgIERNQU1VWF9SR1NSX09GMSAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDEgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjIgICAgICAgICAgICAgIERNQU1VWF9SR1NSX09GMiAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDIgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHU1JfUkdPRjMgICAgICAgICAgICAgIERNQU1VWF9SR1NSX09GMyAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0RNQV9SZWFkUmVnIGFuZCAgTExfRE1BTVVYX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9DQ1JfU09JRSAgICAgICAgICAgICAgICBETUFNVVhfQ3hDUl9TT0lFICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SR0NSX1JHT0lFICAgICAgICAgICAgICBETUFNVVhfUkd4Q1JfT0lFICAgICAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0aW9uIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1QgVHJhbnNmZXIgcmVxdWVzdAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfTUVNMk1FTSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgLyohPCBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IxICAgICAgICAgIDB4MDAwMDAwMDJVICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciAxICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMiAgICAgICAgICAweDAwMDAwMDAzVSAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMiAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMgICAgICAgICAgMHgwMDAwMDAwNFUgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9BREMxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVICAvKiE8IERNQU1VWCBBREMxIHJlcXVlc3QgICAgICAgICovCisjaWYgZGVmaW5lZChBRVMpCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQUVTX0lOICAgICAgICAgICAgICAweDAwMDAwMDA2VSAgLyohPCBETUFNVVggQUVTX0lOIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0FFU19PVVQgICAgICAgICAgICAgMHgwMDAwMDAwN1UgIC8qITwgRE1BTVVYIEFFU19PVVQgcmVxdWVzdCAgICAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoREFDMSkKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9EQUMxX0NIMSAgICAgICAgICAgIDB4MDAwMDAwMDhVICAvKiE8IERNQU1VWCBEQUNfQ0gxIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfREFDMV9DSDIgICAgICAgICAgICAweDAwMDAwMDA5VSAgLyohPCBETUFNVVggREFDX0NIMiByZXF1ZXN0ICAgICAqLworI2VuZGlmCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDMV9SWCAgICAgICAgICAgICAweDAwMDAwMDBBVSAgLyohPCBETUFNVVggSTJDMSBSWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0kyQzFfVFggICAgICAgICAgICAgMHgwMDAwMDAwQlUgIC8qITwgRE1BTVVYIEkyQzEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMyX1JYICAgICAgICAgICAgIDB4MDAwMDAwMENVICAvKiE8IERNQU1VWCBJMkMyIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDMl9UWCAgICAgICAgICAgICAweDAwMDAwMDBEVSAgLyohPCBETUFNVVggSTJDMiBUWCByZXF1ZXN0ICAgICAqLworI2lmIGRlZmluZWQoTFBVQVJUMSkKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYICAgICAgICAgIDB4MDAwMDAwMEVVICAvKiE8IERNQU1VWCBMUFVBUlQxIFJYIHJlcXVlc3QgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9UWCAgICAgICAgICAweDAwMDAwMDBGVSAgLyohPCBETUFNVVggTFBVQVJUMSBUWCByZXF1ZXN0ICAqLworI2VuZGlmCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfU1BJMV9SWCAgICAgICAgICAgICAweDAwMDAwMDEwVSAgLyohPCBETUFNVVggU1BJMSBSWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTFfVFggICAgICAgICAgICAgMHgwMDAwMDAxMVUgIC8qITwgRE1BTVVYIFNQSTEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkyX1JYICAgICAgICAgICAgIDB4MDAwMDAwMTJVICAvKiE8IERNQU1VWCBTUEkyIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfU1BJMl9UWCAgICAgICAgICAgICAweDAwMDAwMDEzVSAgLyohPCBETUFNVVggU1BJMiBUWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxICAgICAgICAgICAgMHgwMDAwMDAxNFUgIC8qITwgRE1BTVVYIFRJTTEgQ0gxIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NIMiAgICAgICAgICAgIDB4MDAwMDAwMTVVICAvKiE8IERNQU1VWCBUSU0xIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDMgICAgICAgICAgICAweDAwMDAwMDE2VSAgLyohPCBETUFNVVggVElNMSBDSDMgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0ICAgICAgICAgICAgMHgwMDAwMDAxN1UgIC8qITwgRE1BTVVYIFRJTTEgQ0g0IHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX1RSSUdfQ09NICAgICAgIDB4MDAwMDAwMThVICAvKiE8IERNQU1VWCBUSU0xIFRSSUcgQ09NIHJlcXVlc3QgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX1VQICAgICAgICAgICAgIDB4MDAwMDAwMTlVICAvKiE8IERNQU1VWCBUSU0xIFVQIHJlcXVlc3QgICAgICovCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxICAgICAgICAgICAgMHgwMDAwMDAxQVUgIC8qITwgRE1BTVVYIFRJTTIgQ0gxIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yX0NIMiAgICAgICAgICAgIDB4MDAwMDAwMUJVICAvKiE8IERNQU1VWCBUSU0yIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDMgICAgICAgICAgICAweDAwMDAwMDFDVSAgLyohPCBETUFNVVggVElNMiBDSDMgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0ICAgICAgICAgICAgMHgwMDAwMDAxRFUgIC8qITwgRE1BTVVYIFRJTTIgQ0g0IHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yX1RSSUcgICAgICAgICAgIDB4MDAwMDAwMUVVICAvKiE8IERNQU1VWCBUSU0yIFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9VUCAgICAgICAgICAgICAweDAwMDAwMDFGVSAgLyohPCBETUFNVVggVElNMiBVUCByZXF1ZXN0ICAgICAqLworI2VuZGlmCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDEgICAgICAgICAgICAweDAwMDAwMDIwVSAgLyohPCBETUFNVVggVElNMyBDSDEgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gyICAgICAgICAgICAgMHgwMDAwMDAyMVUgIC8qITwgRE1BTVVYIFRJTTMgQ0gyIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0zX0NIMyAgICAgICAgICAgIDB4MDAwMDAwMjJVICAvKiE8IERNQU1VWCBUSU0zIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNM19DSDQgICAgICAgICAgICAweDAwMDAwMDIzVSAgLyohPCBETUFNVVggVElNMyBDSDQgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTNfVFJJRyAgICAgICAgICAgMHgwMDAwMDAyNFUgIC8qITwgRE1BTVVYIFRJTTMgVFJJRyByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0zX1VQICAgICAgICAgICAgIDB4MDAwMDAwMjVVICAvKiE8IERNQU1VWCBUSU0zIFVQIHJlcXVlc3QgICAgICovCisjaWYgZGVmaW5lZChUSU02KQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTZfVVAgICAgICAgICAgICAgMHgwMDAwMDAyNlUgIC8qITwgRE1BTVVYIFRJTTYgVVAgcmVxdWVzdCAgICAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVElNNykKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU03X1VQICAgICAgICAgICAgIDB4MDAwMDAwMjdVICAvKiE8IERNQU1VWCBUSU03IFVQIHJlcXVlc3QgICAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTE1KQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE1X0NIMSAgICAgICAgICAgMHgwMDAwMDAyOFUgIC8qITwgRE1BTVVYIFRJTTE1IENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNV9DSDIgICAgICAgICAgIDB4MDAwMDAwMjlVICAvKiE8IERNQU1VWCBUSU0xNSBDSDIgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJR19DT00gICAgICAweDAwMDAwMDJBVSAgLyohPCBETUFNVVggVElNMTUgVFJJRyBDT00gcmVxdWVzdCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQICAgICAgICAgICAgMHgwMDAwMDAyQlUgIC8qITwgRE1BTVVYIFRJTTE1IFVQIHJlcXVlc3QgICAgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE2X0NIMSAgICAgICAgICAgMHgwMDAwMDAyQ1UgIC8qITwgRE1BTVVYIFRJTTE2IENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNl9UUklHX0NPTSAgICAgIDB4MDAwMDAwMkRVICAvKiE8IERNQU1VWCBUSU0xNiBUUklHIENPTSByZXF1ZXN0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTZfVVAgICAgICAgICAgICAweDAwMDAwMDJFVSAgLyohPCBETUFNVVggVElNMTYgVVAgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMSAgICAgICAgICAgMHgwMDAwMDAyRlUgIC8qITwgRE1BTVVYIFRJTTE3IENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTdfVFJJR19DT00gICAgICAweDAwMDAwMDMwVSAgLyohPCBETUFNVVggVElNMTcgVFJJRyBDT00gcmVxdWVzdCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQICAgICAgICAgICAgMHgwMDAwMDAzMVUgIC8qITwgRE1BTVVYIFRJTTE3IFVQIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlggICAgICAgICAgIDB4MDAwMDAwMzJVICAvKiE8IERNQU1VWCBVU0FSVDEgUlggcmVxdWVzdCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfVFggICAgICAgICAgIDB4MDAwMDAwMzNVICAvKiE8IERNQU1VWCBVU0FSVDEgVFggcmVxdWVzdCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlggICAgICAgICAgIDB4MDAwMDAwMzRVICAvKiE8IERNQU1VWCBVU0FSVDIgUlggcmVxdWVzdCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDJfVFggICAgICAgICAgIDB4MDAwMDAwMzVVICAvKiE8IERNQU1VWCBVU0FSVDIgVFggcmVxdWVzdCAgKi8KKyNpZiBkZWZpbmVkKFVTQVJUMykKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDNfUlggICAgICAgICAgIDB4MDAwMDAwMzZVICAvKiE8IERNQU1VWCBVU0FSVDMgUlggcmVxdWVzdCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFggICAgICAgICAgIDB4MDAwMDAwMzdVICAvKiE8IERNQU1VWCBVU0FSVDMgVFggcmVxdWVzdCAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVVNBUlQ0KQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VTQVJUNF9SWCAgICAgICAgICAgMHgwMDAwMDAzOFUgIC8qITwgRE1BTVVYIFVTQVJUNCBSWCByZXF1ZXN0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VTQVJUNF9UWCAgICAgICAgICAgMHgwMDAwMDAzOVUgIC8qITwgRE1BTVVYIFVTQVJUNCBUWCByZXF1ZXN0ICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChVQ1BEMSkKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWCAgICAgICAgICAgIDB4MDAwMDAwM0FVICAvKiE8IERNQU1VWCBVQ1BEMSBSWCByZXF1ZXN0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VDUEQxX1RYICAgICAgICAgICAgMHgwMDAwMDAzQlUgIC8qITwgRE1BTVVYIFVDUEQxIFRYIHJlcXVlc3QgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVDUEQyKQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VDUEQyX1JYICAgICAgICAgICAgMHgwMDAwMDAzQ1UgIC8qITwgRE1BTVVYIFVDUEQyIFJYIHJlcXVlc3QgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVUNQRDJfVFggICAgICAgICAgICAweDAwMDAwMDNEVSAgLyohPCBETUFNVVggVUNQRDIgVFggcmVxdWVzdCAgKi8KKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfQ0hBTk5FTCBETUFNVVggQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMCBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDEgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMSBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzIgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMiBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDMgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzMgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMyBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDQgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzQgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgNCBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDUgICovCisjaWYgZGVmaW5lZChETUFNVVgxX0NoYW5uZWw1KQorI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF81ICAgICAgICAgICAgICAgMHgwMDAwMDAwNVUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBDaGFubmVsIDUgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA2ICAqLworI2VuZGlmCisjaWYgZGVmaW5lZChETUFNVVgxX0NoYW5uZWw2KQorI2RlZmluZSBMTF9ETUFNVVhfQ0hBTk5FTF82ICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUgICAgICAgICAgICAgICAvKiE8IERNQU1VWCBDaGFubmVsIDYgY29ubmVjdGVkIHRvIERNQTEgQ2hhbm5lbCA3ICAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19TWU5DX05PIFN5bmNocm9uaXphdGlvbiBTaWduYWwgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVCAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQWxsIHJlcXVlc3RzIGFyZSBibG9ja2VkICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lORyAgICAgICAgICBETUFNVVhfQ3hDUl9TUE9MXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORyAgICAgICAgIERNQU1VWF9DeENSX1NQT0xfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIG9uIGV2ZW50IG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcgIChETUFNVVhfQ3hDUl9TUE9MXzAgfCBETUFNVVhfQ3hDUl9TUE9MXzEpIC8qITwgU3luY2hyb25pemF0aW9uIG9uIGV2ZW50IG9uIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19TWU5DX0VWVCBTeW5jaHJvbml6YXRpb24gU2lnbmFsIEV2ZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTAgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUyICAgICAgICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMyAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTMgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTQgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU1ICAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lNSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNiAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzIgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTYgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTcgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU4ICAgICAgICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lOCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOSAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTkgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTEgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTExICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMiAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTIgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxIDMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTQgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzIgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTEgNCAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNSAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSB8IERNQU1VWF9DeENSX1NZTkNfSURfMCkgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMSA1ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDAgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBETUFNVVggY2hhbm5lbDAgRXZlbnQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMSAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMSBFdmVudCAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gyICAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfNCB8IERNQU1VWF9DeENSX1NZTkNfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRE1BTVVYIGNoYW5uZWwyIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDMgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF80IHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBETUFNVVggY2hhbm5lbDMgRXZlbnQgKi8KKyNpZiBkZWZpbmVkKExQVElNMSkKKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfTFBUSU0xX09VVCAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIExQVElNMSBPdXB1dCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0xQVElNMl9PVVQgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF80IHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBMUFRJTTIgT3VwdXQgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19USU0xNF9PQyAgICAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfNCB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gVElNMTQgT0MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VORVJBVE9SIFJlcXVlc3QgR2VuZXJhdG9yIENoYW5uZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8wICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fMSAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOXzIgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8zICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VOX1BPTEFSSVRZIEV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIEdlbmVyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGV4dGVybmFsIERNQSByZXF1ZXN0ICBnZW5lcmF0aW9uICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkcgICAgICAgICAgIERNQU1VWF9SR3hDUl9HUE9MXzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfRkFMTElORyAgICAgICAgICBETUFNVVhfUkd4Q1JfR1BPTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gb24gZXZlbnQgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkdfRkFMTElORyAgIChETUFNVVhfUkd4Q1JfR1BPTF8wIHwgRE1BTVVYX1JHeENSX0dQT0xfMSkgIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfUkVRVUVTVF9HRU4gRXh0ZXJuYWwgUmVxdWVzdCBTaWduYWwgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUwICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMiAgICAgIERNQU1VWF9SR3hDUl9TSUdfSURfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTIgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8xIHxETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUzICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0ICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNSAgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTUgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8yIHwgRE1BTVVYX1JHeENSX1NJR19JRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU2ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3ICAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOCAgICAgIERNQU1VWF9SR3hDUl9TSUdfSURfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTggICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU5ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMCAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTExICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEyICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUxMiAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMyAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE1ICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8yIHwgRE1BTVVYX1JHeENSX1NJR19JRF8xIHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUxNSAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRE1BTVVYIGNoYW5uZWwwIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDEgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF80IHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBETUFNVVggY2hhbm5lbDEgRXZlbnQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMiAgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIERNQU1VWCBjaGFubmVsMiBFdmVudCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gzICAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfNCB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRE1BTVVYIGNoYW5uZWwzIEV2ZW50ICovCisjaWYgZGVmaW5lZChMUFRJTTEpCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMV9PVVQgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF80IHwgRE1BTVVYX1JHeENSX1NJR19JRF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBMUFRJTTEgT3VwdXQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTFBUSU0yKQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9MUFRJTTJfT1VUICAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfNCB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gTFBUSU0yIE91cHV0ICovCisjZW5kaWYKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fVElNMTRfT0MgICAgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIFRJTTE0IE9DICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRXhwb3J0ZWRfTWFjcm9zIERNQU1VWCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBETUFNVVggcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUFNVVggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0RNQU1VWF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQU1VWCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQU1VWCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9ETUFNVVhfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BTVVYIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgRE1BTVVYIHJlcXVlc3QgSUQgZm9yIERNQU1VWCBDaGFubmVsIHguCisgICogQG5vdGUgICBETUFNVVggY2hhbm5lbCAwIHRvIDYgYXJlIG1hcHBlZCB0byBETUExIGNoYW5uZWwgMSB0byA3LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIERNQVJFUV9JRCAgICAgTExfRE1BTVVYX1NldFJlcXVlc3RJRAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqIEBwYXJhbSAgUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTUVNMk1FTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU02X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU03X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJR19DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19UUklHX0NPTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUNF9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQ0X1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMl9UWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFJlcXVlc3RJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBSZXF1ZXN0KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9ETUFSRVFfSUQsIFJlcXVlc3QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUFNVVggcmVxdWVzdCBJRCBmb3IgRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAbm90ZSAgIERNQU1VWCBjaGFubmVsIDAgdG8gNiBhcmUgbWFwcGVkIHRvIERNQTEgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFNVVhfR2V0UmVxdWVzdElECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTUVNMk1FTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQURDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVNfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9EQUMxX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfREFDMV9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTNfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNM19UUklHCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0zX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU02X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU03X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTVfVFJJR19DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE1X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1RSSUdfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19UUklHX0NPTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQzX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUNF9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQ0X1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVUNQRDFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VDUEQyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VQ1BEMl9UWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRSZXF1ZXN0SUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0RNQVJFUV9JRCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBhdXRvcml6ZWQgYWZ0ZXIgYSBzeW5jaHJvbml6YXRpb24gZXZlbnQgYW5kL29yIHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGV2ZW50LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIE5CUkVRICAgICAgICAgTExfRE1BTVVYX1NldFN5bmNSZXF1ZXN0TmIKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcGFyYW0gIFJlcXVlc3ROYiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0U3luY1JlcXVlc3ROYihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBSZXF1ZXN0TmIpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX05CUkVRLCAoKFJlcXVlc3ROYiAtIDFVKSA8PCBETUFNVVhfQ3hDUl9OQlJFUV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0b3JpemVkIGFmdGVyIGEgc3luY2hyb25pemF0aW9uIGV2ZW50IGFuZC9vciB0aGUgbnVtYmVyIG9mIERNQSByZXF1ZXN0IG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBldmVudC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBOQlJFUSAgICAgICAgIExMX0RNQU1VWF9HZXRTeW5jUmVxdWVzdE5iCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRTeW5jUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX05CUkVRKSkgPj4gRE1BTVVYX0N4Q1JfTkJSRVFfUG9zKSArIDFVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIHN5bmNocm9uaXplZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTUE9MICAgICAgICAgIExMX0RNQU1VWF9TZXRTeW5jUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTk9fRVZFTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRTeW5jUG9sYXJpdHkoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIHN5bmNocm9uaXplZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTUE9MICAgICAgICAgIExMX0RNQU1VWF9HZXRTeW5jUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTk9fRVZFTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0U3luY1BvbGFyaXR5KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBFdmVudCBHZW5lcmF0aW9uIG9uIERNQU1VWCBjaGFubmVsIHguCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRUdFICAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlRXZlbnRHZW5lcmF0aW9uCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlRXZlbnRHZW5lcmF0aW9uKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIEVHRSAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVFdmVudEdlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlRXZlbnRHZW5lcmF0aW9uKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgQ0xFQVJfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRUdFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRUdFICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkRXZlbnRHZW5lcmF0aW9uCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZEV2ZW50R2VuZXJhdGlvbihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRUdFKSA9PSAoRE1BTVVYX0N4Q1JfRUdFKSk/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZS4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTRSAgICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVTeW5jCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlU3luYyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU0UgICAgICAgICAgICBMTF9ETUFNVVhfRGlzYWJsZVN5bmMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlU3luYyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTRSAgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRTeW5jCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZFN5bmMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NFKSA9PSAoRE1BTVVYX0N4Q1JfU0UpKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBJRCAgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTWU5DX0lEICAgICAgIExMX0RNQU1VWF9TZXRTeW5jSUQKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcGFyYW0gIFN5bmNJRCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0xQVElNMl9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19USU0xNF9PQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFN5bmNJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTeW5jSUQpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NZTkNfSUQsIFN5bmNJRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQU1VWCBzeW5jaHJvbml6YXRpb24gSUQgIG9uIERNQU1VWCBDaGFubmVsIHguCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU1lOQ19JRCAgICAgICBMTF9ETUFNVVhfR2V0U3luY0lECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0xQVElNMl9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19USU0xNF9PQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRTeW5jSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NZTkNfSUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJlcXVlc3QgR2VuZXJhdG9yLgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdFICAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZVJlcXVlc3RHZW4KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlUmVxdWVzdEdlbihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyAoRE1BTVVYX1JHQ1JfU0laRSooUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRvci4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHRSAgICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlUmVxdWVzdEdlbgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlUmVxdWVzdEdlbihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIChETUFNVVhfUkdDUl9TSVpFKihSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpLT5SR0NSLCBETUFNVVhfUkd4Q1JfR0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBSZXF1ZXN0IEdlbmVyYXRvciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdFICAgICAgICAgICAgTExfRE1BTVVYX0lzRW5hYmxlZFJlcXVlc3RHZW4KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZFJlcXVlc3RHZW4oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpLT5SR0NSLCBETUFNVVhfUkd4Q1JfR0UpID09IChETUFNVVhfUkd4Q1JfR0UpKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIGdlbmVyYXRlZC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHUE9MICAgICAgICAgIExMX0RNQU1VWF9TZXRSZXF1ZXN0R2VuUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdEdlblBvbGFyaXR5KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyAoRE1BTVVYX1JHQ1JfU0laRSooUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIGdlbmVyYXRlZC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHUE9MICAgICAgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0R2VuUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFJlcXVlc3RHZW5Qb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUqKFJlcXVlc3RHZW5DaGFubmVsKSkpKSktPlJHQ1IsIERNQU1VWF9SR3hDUl9HUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIGdlbmVyYXRpb24gZXZlbnQuCisgICogQG5vdGUgICBUaGlzIGZpZWxkIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiBHZW5lcmF0b3IgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgR05CUkVRICAgICAgICBMTF9ETUFNVVhfU2V0R2VuUmVxdWVzdE5iCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEBwYXJhbSAgUmVxdWVzdE5iIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRHZW5SZXF1ZXN0TmIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwsIHVpbnQzMl90IFJlcXVlc3ROYikKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dOQlJFUSwgKFJlcXVlc3ROYiAtIDFVKSA8PCBETUFNVVhfUkd4Q1JfR05CUkVRX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIGdlbmVyYXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgR05CUkVRICAgICAgICBMTF9ETUFNVVhfR2V0R2VuUmVxdWVzdE5iCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0R2VuUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSktPlJHQ1IsIERNQU1VWF9SR3hDUl9HTkJSRVEpID4+IERNQU1VWF9SR3hDUl9HTkJSRVFfUG9zKSArIDFVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BTVVYIGV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIElEIG9uIERNQU1VWCBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBDaGFubmVsIHguCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgU0lHX0lEICAgICAgICBMTF9ETUFNVVhfU2V0UmVxdWVzdFNpZ25hbElECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEBwYXJhbSAgUmVxdWVzdFNpZ25hbElEIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9MUFRJTTFfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0yX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1RJTTE0X09DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdFNpZ25hbElEKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsLCB1aW50MzJfdCBSZXF1ZXN0U2lnbmFsSUQpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgTU9ESUZZX1JFRygoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUqKFJlcXVlc3RHZW5DaGFubmVsKSkpKSktPlJHQ1IsIERNQU1VWF9SR3hDUl9TSUdfSUQsIFJlcXVlc3RTaWduYWxJRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQU1VWCBleHRlcm5hbCBSZXF1ZXN0IFNpZ25hbCBJRCBzZXQgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBTSUdfSUQgICAgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0U2lnbmFsSUQKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMl9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9USU0xNF9PQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRSZXF1ZXN0U2lnbmFsSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIChETUFNVVhfUkdDUl9TSVpFKihSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpLT5SR0NSLCBETUFNVVhfUkd4Q1JfU0lHX0lEKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YwICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08wCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YwKSA9PSAoRE1BTVVYX0NTUl9TT0YwKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxKSA9PSAoRE1BTVVYX0NTUl9TT0YxKSkgPyAxVUwgOiAwVUwpOzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDIuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMiAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMikgPT0gKERNQU1VWF9DU1JfU09GMikpID8gMVVMIDogMFVMKTs7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjMgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjMpID09IChETUFNVVhfQ1NSX1NPRjMpKSA/IDFVTCA6IDBVTCk7OworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y0ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU080CisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU080KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y0KSA9PSAoRE1BTVVYX0NTUl9TT0Y0KSkgPyAxVUwgOiAwVUwpOzsKK30KKworI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNSkKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjUgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzUKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzUoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjUpID09IChETUFNVVhfQ1NSX1NPRjUpKSA/IDFVTCA6IDBVTCk7OworfQorI2VuZGlmCisjaWYgZGVmaW5lZChETUFNVVgxX0NoYW5uZWw2KQorLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GNiAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GNikgPT0gKERNQU1VWF9DU1JfU09GNikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAwIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMCAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08wCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjApID09IChETUFNVVhfUkdTUl9PRjApKSA/IDFVTCA6IDBVTCk7OworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMSAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08xCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjEpID09IChETUFNVVhfUkdTUl9PRjEpKSA/IDFVTCA6IDBVTCk7OworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAyIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMiAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08yCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjIpID09IChETUFNVVhfUkdTUl9PRjIpKSA/IDFVTCA6IDBVTCk7OworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZXF1ZXN0IEdlbmVyYXRvciAzIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICAqIEBybXRvbGwgUkdTUiAgICAgICAgIE9GMyAgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08zCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfUkdPMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjMpID09IChETUFNVVhfUkdTUl9PRjMpKSA/IDFVTCA6IDBVTCk7OworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwLgorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YwICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzAKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjEgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMi4KKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMiAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08yCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzLgorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YzICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7ICAKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDQuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjQgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU080KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y0KTsKK30KKworI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNSkKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDUuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjUgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y1KTsKK30KKyNlbmRpZgorI2lmIGRlZmluZWQoRE1BTVVYMV9DaGFubmVsNikKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjYgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU082KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsgIAorICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0Y2KTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMCAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDEgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMSAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzEKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzEoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDIgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMiAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzIKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMyAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOyAgCisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsIHguCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU09JRSAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlSVRfU08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9FbmFibGVJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgb24gRE1BTVVYIGNoYW5uZWwgeC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTT0lFICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlSVRfU08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlSVRfU08oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsIHggaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTT0lFICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRJVF9TTworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0VuYWJsZWRJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NPSUUpKSA9PSAoRE1BTVVYX0N4Q1JfU09JRSkpPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUmVxdWVzdCBHZW5lcmF0aW9uIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgb24gRE1BTVVYIGNoYW5uZWwgeC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBPSUUgICAgICAgICAgIExMX0RNQU1VWF9FbmFibGVJVF9SR08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlSVRfUkdPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyBSZXF1ZXN0R2VuQ2hhbm5lbCktPlJHQ1IsIERNQU1VWF9SR3hDUl9PSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsIHguCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfRGlzYWJsZUlUX1JHTworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlSVRfUkdPKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIFJlcXVlc3RHZW5DaGFubmVsKS0+UkdDUiwgRE1BTVVYX1JHeENSX09JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsIHggaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBPSUUgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRJVF9SR08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZElUX1JHTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVCgoRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIFJlcXVlc3RHZW5DaGFubmVsKS0+UkdDUiwgRE1BTVVYX1JHeENSX09JRSkgPT0gKERNQU1VWF9SR3hDUl9PSUUpKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERNQU1VWDEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9ETUFNVVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9leHRpLmggYi9JbmMvc3RtMzJnMHh4X2xsX2V4dGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzIxNjgyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9leHRpLmgKQEAgLTAsMCArMSwxMjcxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2V4dGkuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRVhUSSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX0VYVElfSAorI2RlZmluZSBTVE0zMkcweHhfTExfRVhUSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRVhUSSkKKworLyoqIEBkZWZncm91cCBFWFRJX0xMIEVYVEkKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQgICAgICAgIDE2dSAgIC8qITwgRGVmaW5lIHVzZWQgdG8gc2hpZnQgcGluIHBvc2l0aW9uIGluIEVYVElDUiByZWdpc3RlciAqLworCisvKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX1ByaXZhdGVfTWFjcm9zIEVYVEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX0VTX0lOSVQgRVhUSSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworCisgIHVpbnQzMl90IExpbmVfMF8zMTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9MTF9FQ19MSU5FICovCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkKKyAgdWludDMyX3QgTGluZV8zMl82MzsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9MTF9FQ19MSU5FICovCisjZW5kaWYKKyAgRnVuY3Rpb25hbFN0YXRlIExpbmVDb21tYW5kOyAgLyohPCBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IGVpdGhlciB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworCisgIHVpbnQ4X3QgTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBtb2RlIGZvciB0aGUgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTExfRUNfTU9ERS4gKi8KKworICB1aW50OF90IFRyaWdnZXI7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgdHJpZ2dlciBzaWduYWwgYWN0aXZlIGVkZ2UgZm9yIHRoZSBFWFRJIGxpbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MTF9FQ19UUklHR0VSLiAqLworfSBMTF9FWFRJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9Db25zdGFudHMgRVhUSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfTElORSBMSU5FCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzAgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTAgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovCisjZGVmaW5lIExMX0VYVElfTElORV8xICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMiAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMiAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTMgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovCisjZGVmaW5lIExMX0VYVElfTElORV80ICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU00ICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNSAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNNSAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDUgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzYgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTYgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovCisjZGVmaW5lIExMX0VYVElfTElORV83ICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU03ICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfOCAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNOCAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDggKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzkgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTkgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMCAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xMCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTAgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzExICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTExICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTIgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMyAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTMgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE0ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTE0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTUgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTUgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0xNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE2ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTE2ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxNiAqLworI2VuZGlmCisjZGVmaW5lIExMX0VYVElfTElORV8xNyAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xNyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTcgKi8KKyNpZiBkZWZpbmVkKEVYVElfSU1SMV9JTTE4KQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMTggICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTggICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE4ICovCisjZW5kaWYKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE5ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTE5ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxOSAqLworI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjApCisjZGVmaW5lIExMX0VYVElfTElORV8yMCAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yMCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjEpCisjZGVmaW5lIExMX0VYVElfTElORV8yMSAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjEgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoRVhUSV9JTVIxX0lNMjIpCisjZGVmaW5lIExMX0VYVElfTElORV8yMiAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yMiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjIgKi8KKyNlbmRpZgorI2RlZmluZSBMTF9FWFRJX0xJTkVfMjMgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMjMgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIzICovCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI0ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI1ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI1ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNikKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI2ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yNykKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI3ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI3ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yOCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI4ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI4ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyOCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0yOSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI5ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyOSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0zMCkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMwICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTMwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzMCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChFWFRJX0lNUjFfSU0zMSkKKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMxICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTMxICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzMSAqLworI2VuZGlmCisjZGVmaW5lIExMX0VYVElfTElORV9BTExfMF8zMSAgICAgICAgICBFWFRJX0lNUjFfSU0gICAgICAgICAgICAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lIG5vdCByZXNlcnZlZCovCisKKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTMyKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzIgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNMzIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDMyICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTMzKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzMgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNMzMgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDMzICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKEVYVElfSU1SMl9JTTMyKSB8fCBkZWZpbmVkKEVYVElfSU1SMl9JTTMzKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzICAgICAgICAgRVhUSV9JTVIyX0lNICAgICAgICAgICAgLyohPCBBbGwgRXh0ZW5kZWQgbGluZSBub3QgcmVzZXJ2ZWQqLworI2VuZGlmCisKKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTCAgICAgICAgICAgICAgIDB4RkZGRkZGRkZVICAgICAgICAgICAgIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorI2RlZmluZSBMTF9FWFRJX0xJTkVfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBOb25lIEV4dGVuZGVkIGxpbmUgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19DT05GSUdfUE9SVCBFWFRJIENPTkZJRyBQT1JUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfUE9SVEEgICAgICAgICAgICAgICAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVhUSSBQT1JUIEEgKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfUE9SVEIgICAgICAgICAgICAgICBFWFRJX0VYVElDUjFfRVhUSTBfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVhUSSBQT1JUIEIgKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfUE9SVEMgICAgICAgICAgICAgICBFWFRJX0VYVElDUjFfRVhUSTBfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVhUSSBQT1JUIEMgKi8KKyNpZiBkZWZpbmVkKEdQSU9EX0JBU0UpCisjZGVmaW5lIExMX0VYVElfQ09ORklHX1BPUlREICAgICAgICAgICAgICAgKEVYVElfRVhUSUNSMV9FWFRJMF8xfEVYVElfRVhUSUNSMV9FWFRJMF8wKSAvKiE8IEVYVEkgUE9SVCBEICovCisjZW5kaWYgLypHUElPRF9CQVNFKi8KKyNpZiBkZWZpbmVkKEdQSU9FX0JBU0UpCisjZGVmaW5lIExMX0VYVElfQ09ORklHX1BPUlRFICAgICAgICAgICAgICAgRVhUSV9FWFRJQ1IxX0VYVEkwXzIgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVYVEkgUE9SVCBFICovCisjZW5kaWYgLypHUElPRV9CQVNFKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfUE9SVEYgICAgICAgICAgICAgICAoRVhUSV9FWFRJQ1IxX0VYVEkwXzJ8RVhUSV9FWFRJQ1IxX0VYVEkwXzApIC8qITwgRVhUSSBQT1JUIEYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19DT05GSUdfTElORSBFWFRJIENPTkZJRyBMSU5FCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTAgICAgICAgICAgICAgICAoKDB1TCA8PCBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSAgfCAwVSkgIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9FWFRJX0NPTkZJR19MSU5FMSAgICAgICAgICAgICAgICgoOHVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpICB8IDBVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzBdICovCisjZGVmaW5lIExMX0VYVElfQ09ORklHX0xJTkUyICAgICAgICAgICAgICAgKCgxNnVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpIHwgMFUpICAvKiE8IEVYVElfUE9TSVRJT05fMTYgfCBFWFRJQ1JbMF0gKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTMgICAgICAgICAgICAgICAoKDI0dUwgPDwgTExfRVhUSV9SRUdJU1RFUl9QSU5QT1NfU0hGVCkgfCAwVSkgIC8qITwgRVhUSV9QT1NJVElPTl8yNCB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9FWFRJX0NPTkZJR19MSU5FNCAgICAgICAgICAgICAgICgoMHVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpICB8IDFVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzAgIHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX0VYVElfQ09ORklHX0xJTkU1ICAgICAgICAgICAgICAgKCg4dUwgPDwgTExfRVhUSV9SRUdJU1RFUl9QSU5QT1NfU0hGVCkgIHwgMVUpICAvKiE8IEVYVElfUE9TSVRJT05fOCAgfCBFWFRJQ1JbMV0gKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTYgICAgICAgICAgICAgICAoKDE2dUwgPDwgTExfRVhUSV9SRUdJU1RFUl9QSU5QT1NfU0hGVCkgfCAxVSkgIC8qITwgRVhUSV9QT1NJVElPTl8xNiB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9FWFRJX0NPTkZJR19MSU5FNyAgICAgICAgICAgICAgICgoMjR1TCA8PCBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSB8IDFVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzI0IHwgRVhUSUNSWzFdICovCisjZGVmaW5lIExMX0VYVElfQ09ORklHX0xJTkU4ICAgICAgICAgICAgICAgKCgwdUwgPDwgTExfRVhUSV9SRUdJU1RFUl9QSU5QT1NfU0hGVCkgIHwgMlUpICAvKiE8IEVYVElfUE9TSVRJT05fMCAgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTkgICAgICAgICAgICAgICAoKDh1TCA8PCBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSAgfCAyVSkgIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9FWFRJX0NPTkZJR19MSU5FMTAgICAgICAgICAgICAgICgoMTZ1TCA8PCBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSB8IDJVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzE2IHwgRVhUSUNSWzJdICovCisjZGVmaW5lIExMX0VYVElfQ09ORklHX0xJTkUxMSAgICAgICAgICAgICAgKCgyNHVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpIHwgMlUpICAvKiE8IEVYVElfUE9TSVRJT05fMjQgfCBFWFRJQ1JbMl0gKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTEyICAgICAgICAgICAgICAoKDB1TCA8PCBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSAgfCAzVSkgIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9FWFRJX0NPTkZJR19MSU5FMTMgICAgICAgICAgICAgICgoOHVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpICB8IDNVKSAgLyohPCBFWFRJX1BPU0lUSU9OXzggIHwgRVhUSUNSWzNdICovCisjZGVmaW5lIExMX0VYVElfQ09ORklHX0xJTkUxNCAgICAgICAgICAgICAgKCgxNnVMIDw8IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpIHwgM1UpICAvKiE8IEVYVElfUE9TSVRJT05fMTYgfCBFWFRJQ1JbM10gKi8KKyNkZWZpbmUgTExfRVhUSV9DT05GSUdfTElORTE1ICAgICAgICAgICAgICAoKDI0dUwgPDwgTExfRVhUSV9SRUdJU1RFUl9QSU5QT1NfU0hGVCkgfCAzVSkgIC8qITwgRVhUSV9QT1NJVElPTl8yNCB8IEVYVElDUlszXSAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19NT0RFIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9FWFRJX01PREVfSVQgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBJbnRlcnJ1cHQgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX01PREVfRVZFTlQgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgLyohPCBFdmVudCBNb2RlICovCisjZGVmaW5lIExMX0VYVElfTU9ERV9JVF9FVkVOVCAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAvKiE8IEludGVycnVwdCAmIEV2ZW50IE1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FQ19UUklHR0VSIEVkZ2UgVHJpZ2dlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9OT05FICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IE5vIFRyaWdnZXIgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HICAgICAgICAgICgodWludDhfdCkweDAxVSkgLyohPCBUcmlnZ2VyIFJpc2luZyBNb2RlICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9GQUxMSU5HICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAvKiE8IFRyaWdnZXIgRmFsbGluZyBNb2RlICovCisjZGVmaW5lIExMX0VYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORyAgKCh1aW50OF90KTB4MDNVKSAvKiE8IFRyaWdnZXIgUmlzaW5nICYgRmFsbGluZyBNb2RlICovCisKKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0V4cG9ydGVkX01hY3JvcyBFWFRJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEVYVEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0VYVElfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoRVhUSS0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEVYVEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKEVYVEktPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBFWFRJIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IG9yIGludGVybmFsIGxpbmVzIChzZWUgUk0pCisgICogICAgICAgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAgKiAgICAgICBCaXRzIGFyZSBzZXQgYXV0b21hdGljYWxseSBhdCBQb3dlciBvbi4KKyAgKiBAcm10b2xsIElNUjEgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPklNUjEsIEV4dGlMaW5lKTsKK30KKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KQorLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IGxpbmVzIChsaW5lcyAzMiAmIDMzKQorICAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uCisgICogQHJtdG9sbCBJTVIyICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOworfQorI2VuZGlmCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlSVRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPklNUjEsIEV4dGlMaW5lKTsKK30KKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIGZvciB0aGUgZGlyZWN0IGxpbmVzIChsaW5lcyAzMiAmIDMzKQorICAqICAgICAgIGlzIHNldCB0byAxIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGJ5IGRlZmF1bHQuCisgICogICAgICAgQml0cyBhcmUgc2V0IGF1dG9tYXRpY2FsbHkgYXQgUG93ZXIgb24uCisgICogQHJtdG9sbCBJTVIyICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVJVF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3Qgb3IgaW50ZXJuYWwgbGluZXMgKHNlZSBSTSkKKyAgKiAgICAgICBpcyBzZXQgdG8gMSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGludGVycnVwdCBieSBkZWZhdWx0LgorICAqICAgICAgIEJpdHMgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGF0IFBvd2VyIG9uLgorICAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5JTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGUgcmVzZXQgdmFsdWUgZm9yIHRoZSBkaXJlY3QgbGluZXMgKGxpbmVzIDMyICYgMzMpCisgICogICAgICAgaXMgc2V0IHRvIDEgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYnkgZGVmYXVsdC4KKyAgKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0V2ZW50X01hbmFnZW1lbnQgRXZlbnRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEVNUjEgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkVNUjEsIEV4dGlMaW5lKTsKKworfQorCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBFTVIyICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkVNUjIsIEV4dGlMaW5lKTsKK30KKyNlbmRpZgorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEVNUjEgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5FTVIxLCBFeHRpTGluZSk7Cit9CisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBFTVIyICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5FTVIyLCBFeHRpTGluZSk7Cit9CisjZW5kaWYKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIxICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkVNUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KQorLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBFTVIyICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRFdmVudF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfUmlzaW5nX1RyaWdnZXJfTWFuYWdlbWVudCBSaXNpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+UlRTUjEsIEV4dGlMaW5lKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IxLCBFeHRpTGluZSk7CisKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5SVFNSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0ZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IEZhbGxpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIGZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUjEgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUKKyAgKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0LgorICAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLgorICAqICAgICAgIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUjEgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5GVFNSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIEZUU1IxICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkZUU1IxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQgU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgSW50ZXJydXB0IEV2ZW50IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgSWYgdGhlIGludGVycnVwdCBpcyBlbmFibGVkIG9uIHRoaXMgbGluZSBpbiB0aGUgRVhUSV9JTVIsIHdyaXRpbmcgYSAxIHRvCisgICogICAgICAgdGhpcyBiaXQgd2hlbiBpdCBpcyBhdCAnMCcgc2V0cyB0aGUgY29ycmVzcG9uZGluZyBwZW5kaW5nIGJpdCBpbiBFWFRJX1BSCisgICogICAgICAgcmVzdWx0aW5nIGluIGFuIGludGVycnVwdCByZXF1ZXN0IGdlbmVyYXRpb24uCisgICogICAgICAgVGhpcyBiaXQgaXMgY2xlYXJlZCBieSBjbGVhcmluZyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIEVYVElfUFIKKyAgKiAgICAgICByZWdpc3RlciAoYnkgd3JpdGluZyBhIDEgaW50byB0aGUgYml0KQorICAqIEBybXRvbGwgU1dJRVIxICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlNXSUVSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfRmxhZ19NYW5hZ2VtZW50IEZsYWdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEV4dExpbmUgRmFsbGluZyBGbGFnIGlzIHNldCBvciBub3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgZmFsbGluZyBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIEZQUjEgICAgICAgICAgRlBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGYWxsaW5nRmxhZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNBY3RpdmVGYWxsaW5nRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5GUFIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGYWxsaW5nIEZsYWcgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgZmFsbGluZyBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIEZQUjEgICAgICAgICAgRlBJRnggICAgICAgICAgIExMX0VYVElfUmVhZEZhbGxpbmdGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX1JlYWRGYWxsaW5nRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPkZQUjEsIEV4dGlMaW5lKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRXh0TGluZSBGYWxsaW5nIEZsYWdzICBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBmYWxsaW5nIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgRlBSMSAgICAgICAgICBGUElGeCAgICAgICAgICAgTExfRVhUSV9DbGVhckZhbGxpbmdGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0NsZWFyRmFsbGluZ0ZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgV1JJVEVfUkVHKEVYVEktPkZQUjEsIEV4dGlMaW5lKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgRXh0TGluZSBSaXNpbmcgRmxhZyBpcyBzZXQgb3Igbm90IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIFJpc2luZyBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFJQUjEgICAgICAgICAgUlBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVSaXNpbmdGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0FjdGl2ZVJpc2luZ0ZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UlBSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIEV4dExpbmUgQ29tYmluYXRpb24gUmlzaW5nIEZsYWcgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgUmlzaW5nIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUlBSMSAgICAgICAgICBSUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkUmlzaW5nRmxhZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9SZWFkUmlzaW5nRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKFJFQURfQklUKEVYVEktPlJQUjEsIEV4dGlMaW5lKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRXh0TGluZSBSaXNpbmcgRmxhZ3MgIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIFJpc2luZyBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFJQUjEgICAgICAgICAgUlBJRnggICAgICAgICAgIExMX0VYVElfQ2xlYXJSaXNpbmdGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgZWFjaCBkZXZpY2UgbGluZSBtYXBwaW5nIGZvciBFWFRJIExpbmUgYXZhaWxhYmlsaXR5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0NsZWFyUmlzaW5nRmxhZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBXUklURV9SRUcoRVhUSS0+UlBSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBFWFRJX0xMX0VGX0NvbmZpZyBFRiBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHNvdXJjZSBpbnB1dCBmb3IgdGhlIEVYVEkgZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBybXRvbGwgRVhUSV9FWFRJQ1IxIEVYVEkwICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMSBFWFRJMSAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjEgRVhUSTIgICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IxIEVYVEkzICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMiBFWFRJNCAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjIgRVhUSTUgICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IyIEVYVEk2ICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMiBFWFRJNyAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjMgRVhUSTggICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IzIEVYVEk5ICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMyBFWFRJMTAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjMgRVhUSTExICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1I0IEVYVEkxMiAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSNCBFWFRJMTMgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjQgRVhUSTE0ICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1I0IEVYVEkxNSAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlCisgICogQHBhcmFtICBQb3J0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgRVhUSV9MTF9FQ19DT05GSUdfUE9SVAorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUxNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9TZXRFWFRJU291cmNlKHVpbnQzMl90IFBvcnQsIHVpbnQzMl90IExpbmUpCit7CisgIE1PRElGWV9SRUcoRVhUSS0+RVhUSUNSW0xpbmUgJiAweDAzdV0sIEVYVElfRVhUSUNSMV9FWFRJMCA8PCAoTGluZSA+PiBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSwgUG9ydCA8PCAoTGluZSA+PiBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjb25maWd1cmVkIGRlZmluZWQgZm9yIHNwZWNpZmljIEVYVEkgTGluZQorICAqIEBybXRvbGwgRVhUSV9FWFRJQ1IxIEVYVEkwICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMSBFWFRJMSAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjEgRVhUSTIgICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IxIEVYVEkzICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMiBFWFRJNCAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjIgRVhUSTUgICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IyIEVYVEk2ICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMiBFWFRJNyAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjMgRVhUSTggICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1IzIEVYVEk5ICAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSMyBFWFRJMTAgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjMgRVhUSTExICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1I0IEVYVEkxMiAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIEVYVElfRVhUSUNSNCBFWFRJMTMgICAgICAgIExMX0VYVElfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBFWFRJX0VYVElDUjQgRVhUSTE0ICAgICAgICBMTF9FWFRJX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgRVhUSV9FWFRJQ1I0IEVYVEkxNSAgICAgICAgTExfRVhUSV9TZXRFWFRJU291cmNlCisgICogQHBhcmFtICBMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkUyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfQ09ORklHX0xJTkU4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9DT05GSUdfTElORTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0NPTkZJR19MSU5FMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgRVhUSV9MTF9FQ19DT05GSUdfUE9SVAorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0dldEVYVElTb3VyY2UodWludDMyX3QgTGluZSkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChFWFRJLT5FWFRJQ1JbTGluZSAmIDB4MDN1XSwgKEVYVElfRVhUSUNSMV9FWFRJMCA8PCAoTGluZSA+PiBMTF9FWFRJX1JFR0lTVEVSX1BJTlBPU19TSEZUKSkpID4+IChMaW5lID4+IExMX0VYVElfUkVHSVNURVJfUElOUE9TX1NIRlQpKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCit1aW50MzJfdCBMTF9FWFRJX0luaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKK3VpbnQzMl90IExMX0VYVElfRGVJbml0KHZvaWQpOwordm9pZCBMTF9FWFRJX1N0cnVjdEluaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKKworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogRVhUSSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX0VYVElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9ncGlvLmggYi9JbmMvc3RtMzJnMHh4X2xsX2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9ncGlvLmgKQEAgLTAsMCArMSw5NTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfZ3Bpby5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9HUElPX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRikKKworLyoqIEBkZWZncm91cCBHUElPX0xMIEdQSU8KKyAgKiBAeworICAqLworLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZXM6CisgICogUnVsZS0xOC4xX2QgLSBNZWRpdW06IEFycmF5IHBvaW50ZXIgYEdQSU94JyBpcyBhY2Nlc3NlZCB3aXRoIGluZGV4IFsuLiwuLl0KKyAgKiB3aGljaCBtYXkgYmUgb3V0IG9mIGFycmF5IGJvdW5kcyBbLi4sVU5LTk9XTl0gaW4gZm9sbG93aW5nIEFQSXM6CisgICogTExfR1BJT19HZXRBRlBpbl8wXzcKKyAgKiBMTF9HUElPX1NldEFGUGluXzBfNworICAqIExMX0dQSU9fU2V0QUZQaW5fOF8xNQorICAqIExMX0dQSU9fR2V0QUZQaW5fOF8xNQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX1ByaXZhdGVfTWFjcm9zIEdQSU8gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FU19JTklUIEdQSU8gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExMIEdQSU8gSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGluOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgR1BJTyBwaW5zIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19QSU4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk1vZGUoKS4qLworCisgIHVpbnQzMl90IFNwZWVkOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNwZWVkIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19TUEVFRC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpblNwZWVkKCkuKi8KKworICB1aW50MzJfdCBPdXRwdXRUeXBlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgb3V0cHV0IHR5cGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX09VVFBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoKS4qLworCisgIHVpbnQzMl90IFB1bGw7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBQdWxsLXVwL1B1bGwgZG93biBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfUFVMTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldFBpblB1bGwoKS4qLworCisgIHVpbnQzMl90IEFsdGVybmF0ZTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX0FGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPIEhXIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0dQSU9fU2V0QUZQaW5fMF83KCkgYW5kIExMX0dQSU9fU2V0QUZQaW5fOF8xNSgpLiovCit9IExMX0dQSU9fSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU8gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1BJTiBQSU4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1BJTl8wICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzAgLyohPCBTZWxlY3QgcGluIDAgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMSAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxIC8qITwgU2VsZWN0IHBpbiAxICovCisjZGVmaW5lIExMX0dQSU9fUElOXzIgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMiAvKiE8IFNlbGVjdCBwaW4gMiAqLworI2RlZmluZSBMTF9HUElPX1BJTl8zICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzMgLyohPCBTZWxlY3QgcGluIDMgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNCAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM0IC8qITwgU2VsZWN0IHBpbiA0ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzUgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTNSAvKiE8IFNlbGVjdCBwaW4gNSAqLworI2RlZmluZSBMTF9HUElPX1BJTl82ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzYgLyohPCBTZWxlY3QgcGluIDYgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNyAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM3IC8qITwgU2VsZWN0IHBpbiA3ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzggICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTOCAvKiE8IFNlbGVjdCBwaW4gOCAqLworI2RlZmluZSBMTF9HUElPX1BJTl85ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzkgLyohPCBTZWxlY3QgcGluIDkgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxMCAvKiE8IFNlbGVjdCBwaW4gMTAgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTEgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxMSAvKiE8IFNlbGVjdCBwaW4gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTIgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxMiAvKiE8IFNlbGVjdCBwaW4gMTIgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTMgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxMyAvKiE8IFNlbGVjdCBwaW4gMTMgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTQgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxNCAvKiE8IFNlbGVjdCBwaW4gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMTUgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxNSAvKiE8IFNlbGVjdCBwaW4gMTUgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fQUxMICAgICAgICAgICAgICAgICAgICAoR1BJT19CU1JSX0JTMCB8IEdQSU9fQlNSUl9CUzEgIHwgR1BJT19CU1JSX0JTMiAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMyAgfCBHUElPX0JTUlJfQlM0ICB8IEdQSU9fQlNSUl9CUzUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzYgIHwgR1BJT19CU1JSX0JTNyAgfCBHUElPX0JTUlJfQlM4ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM5ICB8IEdQSU9fQlNSUl9CUzEwIHwgR1BJT19CU1JSX0JTMTEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTIgfCBHUElPX0JTUlJfQlMxMyB8IEdQSU9fQlNSUl9CUzE0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzE1KSAvKiE8IFNlbGVjdCBhbGwgcGlucyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX01PREUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9JTlBVVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBpbnB1dCBtb2RlICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9PVVRQVVQgICAgICAgICAgICAgICAgR1BJT19NT0RFUl9NT0RFMF8wICAvKiE8IFNlbGVjdCBvdXRwdXQgbW9kZSAqLworI2RlZmluZSBMTF9HUElPX01PREVfQUxURVJOQVRFICAgICAgICAgICAgIEdQSU9fTU9ERVJfTU9ERTBfMSAgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICBHUElPX01PREVSX01PREUwICAgIC8qITwgU2VsZWN0IGFuYWxvZyBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfT1VUUFVUIE91dHB1dCBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IHB1c2gtcHVsbCBhcyBvdXRwdXQgdHlwZSAqLworI2RlZmluZSBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4gICAgICAgICAgIEdQSU9fT1RZUEVSX09UMCAvKiE8IFNlbGVjdCBvcGVuLWRyYWluIGFzIG91dHB1dCB0eXBlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUNfU1BFRUQgT3V0cHV0IFNwZWVkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX0xPVyAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgU2VsZWN0IEkvTyBsb3cgb3V0cHV0IHNwZWVkICAgICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0gICAgICAgICAgR1BJT19PU1BFRURSX09TUEVFRDBfMCAvKiE8IFNlbGVjdCBJL08gbWVkaXVtIG91dHB1dCBzcGVlZCAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSCAgICAgICAgICAgIEdQSU9fT1NQRUVEUl9PU1BFRUQwXzEgLyohPCBTZWxlY3QgSS9PIGZhc3Qgb3V0cHV0IHNwZWVkICAgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCAgICAgICBHUElPX09TUEVFRFJfT1NQRUVEMCAgIC8qITwgU2VsZWN0IEkvTyBoaWdoIG91dHB1dCBzcGVlZCAgICovCisvKioKKyAgKiBAfQorICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyNkZWZpbmUgTExfR1BJT19TUEVFRF9NRURJVU0gICAgICAgICAgICAgICBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRkFTVCAgICAgICAgICAgICAgICAgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNkZWZpbmUgTExfR1BJT19TUEVFRF9ISUdIICAgICAgICAgICAgICAgICBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisKKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1BVTEwgUHVsbCBVcCBQdWxsIERvd24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1BVTExfTk8gICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgSS9PIG5vIHB1bGwgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX1VQICAgICAgICAgICAgICAgICAgICBHUElPX1BVUERSX1BVUEQwXzAgLyohPCBTZWxlY3QgSS9PIHB1bGwgdXAgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX0RPV04gICAgICAgICAgICAgICAgICBHUElPX1BVUERSX1BVUEQwXzEgLyohPCBTZWxlY3QgSS9PIHB1bGwgZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX0FGIEFsdGVybmF0ZSBGdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fQUZfMCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovCisjZGVmaW5lIExMX0dQSU9fQUZfMSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxICovCisjZGVmaW5lIExMX0dQSU9fQUZfMiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwM1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovCisjZGVmaW5lIExMX0dQSU9fQUZfNCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA0ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA1ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwN1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX01hY3JvcyBHUElPIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9HUElPX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gR1BJTyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEdQSU8gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfUG9ydF9Db25maWd1cmF0aW9uIFBvcnQgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE1PREVSICAgICAgICBNT0RFeSAgICAgICAgIExMX0dQSU9fU2V0UGluTW9kZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5NT0RFUiwgKChQaW4gKiBQaW4pICogR1BJT19NT0RFUl9NT0RFMCksICgoUGluICogUGluKSAqIE1vZGUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBtb2RlIGZvciBhIGRlZGljYXRlZCBwaW4gb24gZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBJL08gbW9kZSBjYW4gYmUgSW5wdXQgbW9kZSwgR2VuZXJhbCBwdXJwb3NlIG91dHB1dCwgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgb3IgQW5hbG9nLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgTU9ERVIgICAgICAgIE1PREV5ICAgICAgICAgTExfR1BJT19HZXRQaW5Nb2RlCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5Nb2RlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPk1PREVSLCAoKFBpbiAqIFBpbikgKiBHUElPX01PREVSX01PREUwKSkgLyAoUGluICogUGluKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gb3V0cHV0IHR5cGUgZm9yIHNldmVyYWwgcGlucyBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIE91dHB1dCB0eXBlIGFzIHRvIGJlIHNldCB3aGVuIGdwaW8gcGluIGlzIGluIG91dHB1dCBvcgorICAqICAgICAgICAgYWx0ZXJuYXRlIG1vZGVzLiBQb3NzaWJsZSB0eXBlIGFyZSBQdXNoLXB1bGwgb3IgT3Blbi1kcmFpbi4KKyAgKiBAcm10b2xsIE9UWVBFUiAgICAgICBPVHkgICAgICAgICAgIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcGFyYW0gIE91dHB1dFR5cGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9QVVNIUFVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2ssIHVpbnQzMl90IE91dHB1dFR5cGUpCit7CisgIE1PRElGWV9SRUcoR1BJT3gtPk9UWVBFUiwgUGluTWFzaywgKFBpbk1hc2sgKiBPdXRwdXRUeXBlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gb3V0cHV0IHR5cGUgZm9yIHNldmVyYWwgcGlucyBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIE91dHB1dCB0eXBlIGFzIHRvIGJlIHNldCB3aGVuIGdwaW8gcGluIGlzIGluIG91dHB1dCBvcgorICAqICAgICAgICAgYWx0ZXJuYXRlIG1vZGVzLiBQb3NzaWJsZSB0eXBlIGFyZSBQdXNoLXB1bGwgb3IgT3Blbi1kcmFpbi4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE9UWVBFUiAgICAgICBPVHkgICAgICAgICAgIExMX0dQSU9fR2V0UGluT3V0cHV0VHlwZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPk9UWVBFUiwgUGluKSAvIFBpbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gc3BlZWQgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIEkvTyBzcGVlZCBjYW4gYmUgTG93LCBNZWRpdW0sIEZhc3Qgb3IgSGlnaCBzcGVlZC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIGRhdGFzaGVldCBmb3IgZnJlcXVlbmN5IHNwZWNpZmljYXRpb25zIGFuZCB0aGUgcG93ZXIKKyAgKiAgICAgICAgIHN1cHBseSBhbmQgbG9hZCBjb25kaXRpb25zIGZvciBlYWNoIHNwZWVkLgorICAqIEBybXRvbGwgT1NQRUVEUiAgICAgIE9TUEVFRHkgICAgICAgTExfR1BJT19TZXRQaW5TcGVlZAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBTcGVlZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpblNwZWVkKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgIFNwZWVkKQoreworICBNT0RJRllfUkVHKEdQSU94LT5PU1BFRURSLCAoKFBpbiAqIFBpbikgKiBHUElPX09TUEVFRFJfT1NQRUVEMCksICgoUGluICogUGluKSAqIFNwZWVkKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gc3BlZWQgZm9yIGEgZGVkaWNhdGVkIHBpbiBvbiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIEkvTyBzcGVlZCBjYW4gYmUgTG93LCBNZWRpdW0sIEZhc3Qgb3IgSGlnaCBzcGVlZC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIGRhdGFzaGVldCBmb3IgZnJlcXVlbmN5IHNwZWNpZmljYXRpb25zIGFuZCB0aGUgcG93ZXIKKyAgKiAgICAgICAgIHN1cHBseSBhbmQgbG9hZCBjb25kaXRpb25zIGZvciBlYWNoIHNwZWVkLgorICAqIEBybXRvbGwgT1NQRUVEUiAgICAgIE9TUEVFRHkgICAgICAgTExfR1BJT19HZXRQaW5TcGVlZAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5TcGVlZChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5PU1BFRURSLCAoKFBpbiAqIFBpbikgKiBHUElPX09TUEVFRFJfT1NQRUVEMCkpIC8gKFBpbiAqIFBpbikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFBVUERSICAgICAgICBQVVBEeSAgICAgICAgIExMX0dQSU9fU2V0UGluUHVsbAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBQdWxsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluUHVsbChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IFB1bGwpCit7CisgIE1PRElGWV9SRUcoR1BJT3gtPlBVUERSLCAoKFBpbiAqIFBpbikgKiBHUElPX1BVUERSX1BVUEQwKSwgKChQaW4gKiBQaW4pICogUHVsbCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydAorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUFVQRFIgICAgICAgIFBVUER5ICAgICAgICAgTExfR1BJT19HZXRQaW5QdWxsCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblB1bGwoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+UFVQRFIsICgoUGluICogUGluKSAqIEdQSU9fUFVQRFJfUFVQRDApKSAvIChQaW4gKiBQaW4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gMCB0byA3IGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIEFGMCB0byBBRjcgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgQWx0ZXJuYXRlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMF0sICgoKChQaW4gKiBQaW4pICogUGluKSAqIFBpbikgKiBHUElPX0FGUkxfQUZTRUwwKSwKKyAgICAgICAgICAgICAoKCgoUGluICogUGluKSAqIFBpbikgKiBQaW4pICogQWx0ZXJuYXRlKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDAgdG8gNyBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fR2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKFBpbiAqIFBpbikgKiBQaW4pICogUGluKSAqIEdQSU9fQUZSTF9BRlNFTDApKSAvICgoKFBpbiAqIFBpbikgKiBQaW4pICogUGluKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9mIGEgZGVkaWNhdGVkIHBpbiBmcm9tIDggdG8gMTUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGNyBkZXBlbmRpbmcgb24gdGFyZ2V0LgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fOF8xNShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IEFsdGVybmF0ZSkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+QUZSWzFdLCAoKCgoKFBpbiA+PiA4VSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiBHUElPX0FGUkhfQUZTRUw4KSwKKyAgICAgICAgICAgICAoKCgoKFBpbiA+PiA4VSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiAoUGluID4+IDhVKSkgKiBBbHRlcm5hdGUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gOCB0byAxNSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUY3IGRlcGVuZGluZyBvbiB0YXJnZXQuCisgICogQHJtdG9sbCBBRlJIICAgICAgICAgQUZTRUx5ICAgICAgICBMTF9HUElPX0dldEFGUGluXzhfMTUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRBRlBpbl84XzE1KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPkFGUlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKChQaW4gPj4gOFUpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogR1BJT19BRlJIX0FGU0VMOCkpIC8gKCgoKFBpbiA+PiA4VSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpICogKFBpbiA+PiA4VSkpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIHBpbnMgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBXaGVuIHRoZSBsb2NrIHNlcXVlbmNlIGhhcyBiZWVuIGFwcGxpZWQgb24gYSBwb3J0IGJpdCwgdGhlCisgICogICAgICAgICB2YWx1ZSBvZiB0aGlzIHBvcnQgYml0IGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQgdW50aWwgdGhlCisgICogICAgICAgICBuZXh0IHJlc2V0LgorICAqIEBub3RlICAgRWFjaCBsb2NrIGJpdCBmcmVlemVzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICAqICAgICAgICAgKGNvbnRyb2wgYW5kIGFsdGVybmF0ZSBmdW5jdGlvbiByZWdpc3RlcnMpLgorICAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS0sgICAgICAgICAgTExfR1BJT19Mb2NrUGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIF9fSU8gdWludDMyX3QgdGVtcDsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIFBpbk1hc2spOworICBXUklURV9SRUcoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLIHwgUGluTWFzayk7CisgIC8qIFJlYWQgTENLSyByZWdpc3Rlci4gVGhpcyByZWFkIGlzIG1hbmRhdG9yeSB0byBjb21wbGV0ZSBrZXkgbG9jayBzZXF1ZW5jZSAqLworICB0ZW1wID0gUkVBRF9SRUcoR1BJT3gtPkxDS1IpOworICAodm9pZCkgdGVtcDsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gMSBpZiBhbGwgcGlucyBwYXNzZWQgYXMgcGFyYW1ldGVyLCBvZiBhIGRlZGljYXRlZCBwb3J0LCBhcmUgbG9ja2VkLiBlbHNlIFJldHVybiAwLgorICAqIEBybXRvbGwgTENLUiAgICAgICAgIExDS3kgICAgICAgICAgTExfR1BJT19Jc1BpbkxvY2tlZAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0lzUGluTG9ja2VkKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5MQ0tSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gMSBpZiBvbmUgb2YgdGhlIHBpbiBvZiBhIGRlZGljYXRlZCBwb3J0IGlzIGxvY2tlZC4gZWxzZSByZXR1cm4gMC4KKyAgKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0tLICAgICAgICAgIExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNBbnlQaW5Mb2NrZWQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoR1BJT3gtPkxDS1IsIEdQSU9fTENLUl9MQ0tLKSA9PSAoR1BJT19MQ0tSX0xDS0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FRl9EYXRhX0FjY2VzcyBEYXRhIEFjY2VzcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGZ1bGwgaW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIElEUiAgICAgICAgICBJRHkgICAgICAgICAgIExMX0dQSU9fUmVhZElucHV0UG9ydAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHJldHZhbCBJbnB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIG9mIHBvcnQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX1JlYWRJbnB1dFBvcnQoR1BJT19UeXBlRGVmICpHUElPeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoR1BJT3gtPklEUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBpZiBpbnB1dCBkYXRhIGxldmVsIGZvciBzZXZlcmFsIHBpbnMgb2YgZGVkaWNhdGVkIHBvcnQgaXMgaGlnaCBvciBsb3cuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX0lzSW5wdXRQaW5TZXQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc0lucHV0UGluU2V0KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5JRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIGZvciB0aGUgcG9ydC4KKyAgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fV3JpdGVPdXRwdXRQb3J0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBvcnRWYWx1ZSBMZXZlbCB2YWx1ZSBmb3IgZWFjaCBwaW4gb2YgdGhlIHBvcnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fV3JpdGVPdXRwdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBvcnRWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKEdQSU94LT5PRFIsIFBvcnRWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGZ1bGwgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX1JlYWRPdXRwdXRQb3J0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcmV0dmFsIE91dHB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIG9mIHBvcnQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX1JlYWRPdXRwdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKEdQSU94LT5PRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gaWYgaW5wdXQgZGF0YSBsZXZlbCBmb3Igc2V2ZXJhbCBwaW5zIG9mIGRlZGljYXRlZCBwb3J0IGlzIGhpZ2ggb3IgbG93LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Jc091dHB1dFBpblNldAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0lzT3V0cHV0UGluU2V0KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbk1hc2spCit7CisgIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5PRFIsIFBpbk1hc2spID09IChQaW5NYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gaGlnaCBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICAqIEBybXRvbGwgQlNSUiAgICAgICAgIEJTeSAgICAgICAgICAgTExfR1BJT19TZXRPdXRwdXRQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJTUlIsIFBpbk1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBzZXZlcmFsIHBpbnMgdG8gbG93IGxldmVsIG9uIGRlZGljYXRlZCBncGlvIHBvcnQuCisgICogQHJtdG9sbCBCUlIgICAgICAgICAgQlJ5ICAgICAgICAgICBMTF9HUElPX1Jlc2V0T3V0cHV0UGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19SZXNldE91dHB1dFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPkJSUiwgUGluTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVG9nZ2xlIGRhdGEgdmFsdWUgZm9yIHNldmVyYWwgcGluIG9mIGRlZGljYXRlZCBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19Ub2dnbGVQaW4KKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBXUklURV9SRUcoR1BJT3gtPk9EUiwgUkVBRF9SRUcoR1BJT3gtPk9EUikgXiBQaW5NYXNrKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBHUElPX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpOworRXJyb3JTdGF0dXMgTExfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAqR1BJT3gsIExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRikgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfR1BJT19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX2kyYy5oIGIvSW5jL3N0bTMyZzB4eF9sbF9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTIwZjhiCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9pMmMuaApAQCAtMCwwICsxLDIyMjggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfaTJjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEkyQyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX0kyQ19ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9JMkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEkyQzEpIHx8IGRlZmluZWQgKEkyQzIpCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMIEkyQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfTExfUHJpdmF0ZV9Db25zdGFudHMgSTJDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9Qcml2YXRlX01hY3JvcyBJMkMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FU19JTklUIEkyQyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhlcmFsTW9kZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX1BFUklQSEVSQUxfTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0TW9kZSgpLiAqLworCisgIHVpbnQzMl90IFRpbWluZzsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldCBieSByZWZlcnJpbmcgdG8gdGhlIFNUTTMyQ3ViZU1YIFRvb2wgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfSTJDX0NPTlZFUlRfVElNSU5HUygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRUaW1pbmcoKS4gKi8KKworICB1aW50MzJfdCBBbmFsb2dGaWx0ZXI7ICAgICAgICAvKiE8IEVuYWJsZXMgb3IgZGlzYWJsZXMgYW5hbG9nIG5vaXNlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19MTF9FQ19BTkFMT0dGSUxURVJfU0VMRUNUSU9OCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMkNfRW5hYmxlQW5hbG9nRmlsdGVyKCkgb3IgTExfSTJDX0Rpc2FibGVBbmFsb2dGaWx0ZXIoKS4gKi8KKworICB1aW50MzJfdCBEaWdpdGFsRmlsdGVyOyAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIGRpZ2l0YWwgbm9pc2UgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDBGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXREaWdpdGFsRmlsdGVyKCkuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczE7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRldmljZSBvd24gYWRkcmVzcyAxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDNGRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfU2V0T3duQWRkcmVzczEoKS4gKi8KKworICB1aW50MzJfdCBUeXBlQWNrbm93bGVkZ2U7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX0kyQ19BQ0tOT1dMRURHRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YSgpLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJTaXplOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZXZpY2Ugb3duIGFkZHJlc3MgMSBzaXplICg3LWJpdCBvciAxMC1iaXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX09XTkFERFJFU1MxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRPd25BZGRyZXNzMSgpLiAqLworfSBMTF9JMkNfSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJMkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JMkNfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfSUNSX0FERFJDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX0FERFJDRiAgICAgICAgICAvKiE8IEFkZHJlc3MgTWF0Y2hlZCBmbGFnICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9OQUNLQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9OQUNLQ0YgICAgICAgICAgLyohPCBOb3QgQWNrbm93bGVkZ2UgZmxhZyAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfU1RPUENGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfU1RPUENGICAgICAgICAgIC8qITwgU3RvcCBkZXRlY3Rpb24gZmxhZyAgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX0JFUlJDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX0JFUlJDRiAgICAgICAgICAvKiE8IEJ1cyBlcnJvciBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9BUkxPQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9BUkxPQ0YgICAgICAgICAgLyohPCBBcmJpdHJhdGlvbiBMb3N0IGZsYWcgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfT1ZSQ0YgICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfT1ZSQ0YgICAgICAgICAgIC8qITwgT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnICAqLworI2RlZmluZSBMTF9JMkNfSUNSX1BFQ0NGICAgICAgICAgICAgICAgICAgICBJMkNfSUNSX1BFQ0NGICAgICAgICAgICAvKiE8IFBFQyBlcnJvciBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9USU1PVVRDRiAgICAgICAgICAgICAgICAgSTJDX0lDUl9USU1PVVRDRiAgICAgICAgLyohPCBUaW1lb3V0IGRldGVjdGlvbiBmbGFnICovCisjZGVmaW5lIExMX0kyQ19JQ1JfQUxFUlRDRiAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfQUxFUlRDRiAgICAgICAgIC8qITwgQWxlcnQgZmxhZyAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UWEUgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWEUgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RYSVMgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYSVMgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUlhORSAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9BRERSICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BRERSICAgICAgICAgICAgLyohPCBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX05BQ0tGICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX05BQ0tGICAgICAgICAgICAvKiE8IE5vdCBBY2tub3dsZWRnZSByZWNlaXZlZCBmbGFnICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfU1RPUEYgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfU1RPUEYgICAgICAgICAgIC8qITwgU3RvcCBkZXRlY3Rpb24gZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9UQyAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQyAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBDb21wbGV0ZSAobWFzdGVyIG1vZGUpICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RDUiAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDUiAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIFJlbG9hZCAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQkVSUiAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQkVSUiAgICAgICAgICAgIC8qITwgQnVzIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9BUkxPICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BUkxPICAgICAgICAgICAgLyohPCBBcmJpdHJhdGlvbiBsb3N0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX09WUiAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUiAgICAgICAgICAgICAvKiE8IE92ZXJydW4vVW5kZXJydW4gKHNsYXZlIG1vZGUpICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfUEVDRVJSICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUEVDRVJSICAgICAgICAgIC8qITwgUEVDIEVycm9yIGluIHJlY2VwdGlvbiAoU01CdXMgbW9kZSkgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9USU1FT1VUICAgICAgICAgICAgICAgICAgSTJDX0lTUl9USU1FT1VUICAgICAgICAgLyohPCBUaW1lb3V0IGRldGVjdGlvbiBmbGFnIChTTUJ1cyBtb2RlKSAqLworI2RlZmluZSBMTF9JMkNfSVNSX0FMRVJUICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FMRVJUICAgICAgICAgICAvKiE8IFNNQnVzIGFsZXJ0IChTTUJ1cyBtb2RlKSAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfQlVTWSAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQlVTWSAgICAgICAgICAgIC8qITwgQnVzIGJ1c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyQ19SZWFkUmVnIGFuZCAgTExfSTJDX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19DUjFfVFhJRSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRSAgICAgICAgICAgIC8qITwgVFggSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1JYSUUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1JYSUUgICAgICAgICAgICAvKiE8IFJYIEludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9BRERSSUUgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9BRERSSUUgICAgICAgICAgLyohPCBBZGRyZXNzIG1hdGNoIEludGVycnVwdCBlbmFibGUgKHNsYXZlIG9ubHkpICovCisjZGVmaW5lIExMX0kyQ19DUjFfTkFDS0lFICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTkFDS0lFICAgICAgICAgIC8qITwgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIEludGVycnVwdCBlbmFibGUgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1NUT1BJRSAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1NUT1BJRSAgICAgICAgICAvKiE8IFNUT1AgZGV0ZWN0aW9uIEludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9UQ0lFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UQ0lFICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfRVJSSUUgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfRVJSSUUgICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0cyBlbmFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfUEVSSVBIRVJBTF9NT0RFIFBlcmlwaGVyYWwgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX0kyQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgSTJDIE1hc3RlciBvciBTbGF2ZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfSE9TVCAgICAgICAgICAgICBJMkNfQ1IxX1NNQkhFTiAgICAgICAgICAgLyohPCBTTUJ1cyBIb3N0IGFkZHJlc3MgYWNrbm93bGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IFNNQnVzIERldmljZSBkZWZhdWx0IG1vZGUgKERlZmF1bHQgYWRkcmVzcyBub3QgYWNrbm93bGVkZ2UpICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlAgICAgICAgSTJDX0NSMV9TTUJERU4gICAgICAgICAgIC8qITwgU01CdXMgRGV2aWNlIERlZmF1bHQgYWRkcmVzcyBhY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0FOQUxPR0ZJTFRFUl9TRUxFQ1RJT04gQW5hbG9nIEZpbHRlciBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQU5BTE9HRklMVEVSX0VOQUJMRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEFuYWxvZyBmaWx0ZXIgaXMgZW5hYmxlZC4gICovCisjZGVmaW5lIExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRSAgICAgICAgIEkyQ19DUjFfQU5GT0ZGICAgICAgICAgIC8qITwgQW5hbG9nIGZpbHRlciBpcyBkaXNhYmxlZC4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0FERFJFU1NJTkdfTU9ERSBNYXN0ZXIgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FERFJFU1NJTkdfTU9ERV83QklUICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgTWFzdGVyIG9wZXJhdGVzIGluIDctYml0IGFkZHJlc3NpbmcgbW9kZS4gKi8KKyNkZWZpbmUgTExfSTJDX0FERFJFU1NJTkdfTU9ERV8xMEJJVCAgICAgICAgSTJDX0NSMl9BREQxMCAgICAgICAgICAgIC8qITwgTWFzdGVyIG9wZXJhdGVzIGluIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX09XTkFERFJFU1MxIE93biBBZGRyZXNzIDEgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MxXzdCSVQgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBPd24gYWRkcmVzcyAxIGlzIGEgNy1iaXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MxXzEwQklUICAgICAgICAgICAgSTJDX09BUjFfT0ExTU9ERSAgICAgICAgLyohPCBPd24gYWRkcmVzcyAxIGlzIGEgMTAtYml0IGFkZHJlc3MuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX09XTkFERFJFU1MyIE93biBBZGRyZXNzIDIgTWFza3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTk9NQVNLICAgICAgICAgICBJMkNfT0FSMl9PQTJOT01BU0sgICAgICAvKiE8IE93biBBZGRyZXNzMiBObyBtYXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swMSAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzAxICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzoyXSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDIgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swMiAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6M10gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAzICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDMgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjRdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNCAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA0ICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzo1XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDUgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swNSAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6Nl0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA2ICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDYgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNyAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA3ICAgICAgLyohPCBObyBjb21wYXJpc29uIGlzIGRvbmUuIEFsbCBBZGRyZXNzMiBhcmUgYWNrbm93bGVkZ2VkLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19JMkNfQUNLTk9XTEVER0UgQWNrbm93bGVkZ2UgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEFDSyBpcyBzZW50IGFmdGVyIGN1cnJlbnQgcmVjZWl2ZWQgYnl0ZS4gKi8KKyNkZWZpbmUgTExfSTJDX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMl9OQUNLICAgICAgICAgICAgIC8qITwgTkFDSyBpcyBzZW50IGFmdGVyIGN1cnJlbnQgcmVjZWl2ZWQgYnl0ZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQUREUlNMQVZFIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FERFJTTEFWRV83QklUICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgU2xhdmUgQWRkcmVzcyBpbiA3LWJpdC4gKi8KKyNkZWZpbmUgTExfSTJDX0FERFJTTEFWRV8xMEJJVCAgICAgICAgICAgICAgSTJDX0NSMl9BREQxMCAgICAgICAgICAgIC8qITwgU2xhdmUgQWRkcmVzcyBpbiAxMC1iaXQuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1JFUVVFU1QgVHJhbnNmZXIgUmVxdWVzdCBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfUkVRVUVTVF9XUklURSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgcmVxdWVzdCBhIHdyaXRlIHRyYW5zZmVyLiAqLworI2RlZmluZSBMTF9JMkNfUkVRVUVTVF9SRUFEICAgICAgICAgICAgICAgICBJMkNfQ1IyX1JEX1dSTiAgICAgICAgICAgLyohPCBNYXN0ZXIgcmVxdWVzdCBhIHJlYWQgdHJhbnNmZXIuICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfTU9ERSBUcmFuc2ZlciBFbmQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1JFTE9BRCAgICAgICAgICAgICAgICAgIEkyQ19DUjJfUkVMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBJMkMgUmVsb2FkIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9BVVRPRU5EICAgICAgICAgICAgICAgICBJMkNfQ1IyX0FVVE9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgSTJDIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIG5vIEhXIFBFQyBjb21wYXJpc29uLiAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU09GVEVORCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEkyQyBTb2Z0d2FyZSBlbmQgbW9kZSB3aXRoIG5vIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX1JFTE9BRCAgICAgICAgICAgIExMX0kyQ19NT0RFX1JFTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19BVVRPRU5EX05PX1BFQyAgICBMTF9JMkNfTU9ERV9BVVRPRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgU01CVVMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfU09GVEVORF9OT19QRUMgICAgTExfSTJDX01PREVfU09GVEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFNNQlVTIFNvZnR3YXJlIGVuZCBtb2RlIHdpdGggSFcgUEVDIGNvbXBhcmlzb24uICAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfV0lUSF9QRUMgICh1aW50MzJfdCkoTExfSTJDX01PREVfQVVUT0VORCB8IEkyQ19DUjJfUEVDQllURSkgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX1dJVEhfUEVDICAodWludDMyX3QpKExMX0kyQ19NT0RFX1NPRlRFTkQgfCBJMkNfQ1IyX1BFQ0JZVEUpICAgLyohPCBFbmFibGUgU01CVVMgU29mdHdhcmUgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0dFTkVSQVRFIFN0YXJ0IEFuZCBTdG9wIEdlbmVyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfTk9TVEFSVFNUT1AgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERvbid0IEdlbmVyYXRlIFN0b3AgYW5kIFN0YXJ0IGNvbmRpdGlvbi4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBTdG9wIGNvbmRpdGlvbiAoU2l6ZSBzaG91bGQgYmUgc2V0IHRvIDApLiAgICAgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9TVEFSVF9SRUFEICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgU3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9SRUFEICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciByZWFkIHJlcXVlc3QsIHNsYXZlIDdCaXQgYWRkcmVzcy4gICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfV1JJVEUgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3Igd3JpdGUgcmVxdWVzdCwgc2xhdmUgN0JpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9SRUFEICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfUkRfV1JOIHwgSTJDX0NSMl9IRUFEMTBSKSAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdCwgc2xhdmUgMTBCaXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfV1JJVEUgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LCBzbGF2ZSAxMEJpdCBhZGRyZXNzLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19ESVJFQ1RJT04gUmVhZCBXcml0ZSBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfRElSRUNUSU9OX1dSSVRFICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBXcml0ZSB0cmFuc2ZlciByZXF1ZXN0IGJ5IG1hc3Rlciwgc2xhdmUgZW50ZXJzIHJlY2VpdmVyIG1vZGUuICAqLworI2RlZmluZSBMTF9JMkNfRElSRUNUSU9OX1JFQUQgICAgICAgICAgICAgICBJMkNfSVNSX0RJUiAgICAgICAgICAgICAgLyohPCBSZWFkIHRyYW5zZmVyIHJlcXVlc3QgYnkgbWFzdGVyLCBzbGF2ZSBlbnRlcnMgdHJhbnNtaXR0ZXIgbW9kZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfRE1BX1JFR19EQVRBIERNQSBSZWdpc3RlciBEYXRhCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgTExfSTJDX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgIC8qITwgR2V0IGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvciByZWNlcHRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX1NNQlVTX1RJTUVPVVRBX01PREUgU01CdXMgVGltZW91dEEgTW9kZSBTQ0wgU0RBIFRpbWVvdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBUaW1lb3V0QSBpcyB1c2VkIHRvIGRldGVjdCBTQ0wgbG93IGxldmVsIHRpbWVvdXQuICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TREFfU0NMX0hJR0ggSTJDX1RJTUVPVVRSX1RJRExFICAgLyohPCBUaW1lb3V0QSBpcyB1c2VkIHRvIGRldGVjdCBib3RoIFNDTCBhbmQgU0RBIGhpZ2ggbGV2ZWwgdGltZW91dC4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfU01CVVNfVElNRU9VVF9TRUxFQ1RJT04gU01CdXMgVGltZW91dCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEEgICAgICAgICAgICAgICBJMkNfVElNRU9VVFJfVElNT1VURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZW91dEEgZW5hYmxlIGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX1RJTUVPVVRCICAgICAgICAgICAgICAgSTJDX1RJTUVPVVRSX1RFWFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVvdXRCIChleHRlbmRlZCBjbG9jaykgZW5hYmxlIGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19BTExfVElNRU9VVCAgICAgICAgICAgICh1aW50MzJfdCkoSTJDX1RJTUVPVVRSX1RJTU9VVEVOIHwgSTJDX1RJTUVPVVRSX1RFWFRFTikgLyohPCBUaW1lb3V0QSBhbmQgVGltZW91dEIgKGV4dGVuZGVkIGNsb2NrKSBlbmFibGUgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX01hY3JvcyBJMkMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBJMkMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0kyQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEkyQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEkyQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9JMkNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VNX0NPTlZFUlRfVElNSU5HUyBDb252ZXJ0IFNEQSBTQ0wgdGltaW5ncworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU0RBIHNldHVwLCBob2xkIHRpbWUgYW5kIHRoZSBTQ0wgaGlnaCwgbG93IHBlcmlvZC4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4Ri4KKyAgKiBAcGFyYW0gIF9fREFUQV9TRVRVUF9USU1FX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGLiAodHNjbGRlbCA9IChTQ0xERUwrMSl4dHByZXNjKQorICAqIEBwYXJhbSAgX19EQVRBX0hPTERfVElNRV9fIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4Ri4gKHRzZGFkZWwgPSBTREFERUx4dHByZXNjKQorICAqIEBwYXJhbSAgX19DTE9DS19ISUdIX1BFUklPRF9fIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkYuICh0c2NsaCA9IChTQ0xIKzEpeHRwcmVzYykKKyAgKiBAcGFyYW0gIF9fQ0xPQ0tfTE9XX1BFUklPRF9fIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuICBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGLiAodHNjbGwgPSAoU0NMTCsxKXh0cHJlc2MpCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9JMkNfQ09OVkVSVF9USU1JTkdTKF9fUFJFU0NBTEVSX18sIF9fREFUQV9TRVRVUF9USU1FX18sIF9fREFUQV9IT0xEX1RJTUVfXywgX19DTE9DS19ISUdIX1BFUklPRF9fLCBfX0NMT0NLX0xPV19QRVJJT0RfXykgICBcCisgICAgICAgICgoKCh1aW50MzJfdCkoX19QUkVTQ0FMRVJfXykgICAgICAgICA8PCBJMkNfVElNSU5HUl9QUkVTQ19Qb3MpICAmIEkyQ19USU1JTkdSX1BSRVNDKSAgIHwgXAorICAgICAgICAgKCgodWludDMyX3QpKF9fREFUQV9TRVRVUF9USU1FX18pICAgPDwgSTJDX1RJTUlOR1JfU0NMREVMX1BvcykgJiBJMkNfVElNSU5HUl9TQ0xERUwpICB8IFwKKyAgICAgICAgICgoKHVpbnQzMl90KShfX0RBVEFfSE9MRF9USU1FX18pICAgIDw8IEkyQ19USU1JTkdSX1NEQURFTF9Qb3MpICYgSTJDX1RJTUlOR1JfU0RBREVMKSAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19DTE9DS19ISUdIX1BFUklPRF9fKSA8PCBJMkNfVElNSU5HUl9TQ0xIX1BvcykgICAmIEkyQ19USU1JTkdSX1NDTEgpICAgIHwgXAorICAgICAgICAgKCgodWludDMyX3QpKF9fQ0xPQ0tfTE9XX1BFUklPRF9fKSAgPDwgSTJDX1RJTUlOR1JfU0NMTF9Qb3MpICAgJiBJMkNfVElNSU5HUl9TQ0xMKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgSTJDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEkyQyBwZXJpcGhlcmFsIChQRSA9IDEpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFICAgICAgICAgICAgTExfSTJDX0VuYWJsZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJMkMgcGVyaXBoZXJhbCAoUEUgPSAwKS4KKyAgKiBAbm90ZSAgIFdoZW4gUEUgPSAwLCB0aGUgSTJDIFNDTCBhbmQgU0RBIGxpbmVzIGFyZSByZWxlYXNlZC4KKyAgKiAgICAgICAgIEludGVybmFsIHN0YXRlIG1hY2hpbmVzIGFuZCBzdGF0dXMgYml0cyBhcmUgcHV0IGJhY2sgdG8gdGhlaXIgcmVzZXQgdmFsdWUuCisgICogICAgICAgICBXaGVuIGNsZWFyZWQsIFBFIG11c3QgYmUga2VwdCBsb3cgZm9yIGF0IGxlYXN0IDMgQVBCIGNsb2NrIGN5Y2xlcy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRSAgICAgICAgICAgIExMX0kyQ19EaXNhYmxlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgSTJDIHBlcmlwaGVyYWwgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRSAgICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRSkgPT0gKEkyQ19DUjFfUEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIE5vaXNlIEZpbHRlcnMgKEFuYWxvZyBhbmQgRGlnaXRhbCkuCisgICogQG5vdGUgICBJZiB0aGUgYW5hbG9nIGZpbHRlciBpcyBhbHNvIGVuYWJsZWQsIHRoZSBkaWdpdGFsIGZpbHRlciBpcyBhZGRlZCB0byBhbmFsb2cgZmlsdGVyLgorICAqICAgICAgICAgVGhlIGZpbHRlcnMgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9JMkNfQ29uZmlnRmlsdGVyc1xuCisgICogICAgICAgICBDUjEgICAgICAgICAgRE5GICAgICAgICAgICBMTF9JMkNfQ29uZmlnRmlsdGVycworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBBbmFsb2dGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQU5BTE9HRklMVEVSX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRQorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIChEaWdpdGFsIGZpbHRlciBkaXNhYmxlZCkgYW5kIE1heF9EYXRhPTB4MEYgKERpZ2l0YWwgZmlsdGVyIGVuYWJsZWQgYW5kIGZpbHRlcmluZyBjYXBhYmlsaXR5IHVwIHRvIDE1KnRpMmNjbGspLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIG9uIFNEQSBhbmQgU0NMIGlucHV0LgorICAqICAgICAgICAgVGhlIGRpZ2l0YWwgZmlsdGVyIHdpbGwgZmlsdGVyIHNwaWtlcyB3aXRoIGEgbGVuZ3RoIG9mIHVwIHRvIERORlszOjBdKnRpMmNjbGsuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ29uZmlnRmlsdGVycyhJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgQW5hbG9nRmlsdGVyLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTkZPRkYgfCBJMkNfQ1IxX0RORiwgQW5hbG9nRmlsdGVyIHwgKERpZ2l0YWxGaWx0ZXIgPDwgSTJDX0NSMV9ETkZfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIERpZ2l0YWwgTm9pc2UgRmlsdGVyLgorICAqIEBub3RlICAgSWYgdGhlIGFuYWxvZyBmaWx0ZXIgaXMgYWxzbyBlbmFibGVkLCB0aGUgZGlnaXRhbCBmaWx0ZXIgaXMgYWRkZWQgdG8gYW5hbG9nIGZpbHRlci4KKyAgKiAgICAgICAgIFRoaXMgZmlsdGVyIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERORiAgICAgICAgICAgTExfSTJDX1NldERpZ2l0YWxGaWx0ZXIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIChEaWdpdGFsIGZpbHRlciBkaXNhYmxlZCkgYW5kIE1heF9EYXRhPTB4MEYgKERpZ2l0YWwgZmlsdGVyIGVuYWJsZWQgYW5kIGZpbHRlcmluZyBjYXBhYmlsaXR5IHVwIHRvIDE1KnRpMmNjbGspLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIG9uIFNEQSBhbmQgU0NMIGlucHV0LgorICAqICAgICAgICAgVGhlIGRpZ2l0YWwgZmlsdGVyIHdpbGwgZmlsdGVyIHNwaWtlcyB3aXRoIGEgbGVuZ3RoIG9mIHVwIHRvIERORlszOjBdKnRpMmNjbGsuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0RGlnaXRhbEZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgRGlnaXRhbEZpbHRlcikKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjEsIEkyQ19DUjFfRE5GLCBEaWdpdGFsRmlsdGVyIDw8IEkyQ19DUjFfRE5GX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IERpZ2l0YWwgTm9pc2UgRmlsdGVyIGNvbmZpZ3VyYXRpb24uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRE5GICAgICAgICAgICBMTF9JMkNfR2V0RGlnaXRhbEZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldERpZ2l0YWxGaWx0ZXIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9ETkYpID4+IEkyQ19DUjFfRE5GX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFuYWxvZyBOb2lzZSBGaWx0ZXIuCisgICogQG5vdGUgICBUaGlzIGZpbHRlciBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTkZPRkYgICAgICAgIExMX0kyQ19FbmFibGVBbmFsb2dGaWx0ZXIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUFuYWxvZ0ZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTkZPRkYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQW5hbG9nIE5vaXNlIEZpbHRlci4KKyAgKiBAbm90ZSAgIFRoaXMgZmlsdGVyIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFORk9GRiAgICAgICAgTExfSTJDX0Rpc2FibGVBbmFsb2dGaWx0ZXIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVBbmFsb2dGaWx0ZXIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQW5hbG9nIE5vaXNlIEZpbHRlciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFORk9GRiAgICAgICAgTExfSTJDX0lzRW5hYmxlZEFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEFuYWxvZ0ZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRikgIT0gKEkyQ19DUjFfQU5GT0ZGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgdHJhbnNtaXNzaW9uIHJlcXVlc3RzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJDX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlRE1BUmVxX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMkNfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZURNQVJlcV9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgdHJhbnNtaXNzaW9uIHJlcXVlc3RzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZERNQVJlcV9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYRE1BRU4pID09IChJMkNfQ1IxX1RYRE1BRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSByZWNlcHRpb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMkNfRW5hYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVETUFSZXFfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIHJlY2VwdGlvbiByZXF1ZXN0cy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyQ19EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlRE1BUmVxX1JYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSByZWNlcHRpb24gcmVxdWVzdHMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMkNfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkRE1BUmVxX1JYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhETUFFTikgPT0gKEkyQ19DUjFfUlhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAgKiBAcm10b2xsIFRYRFIgICAgICAgICBUWERBVEEgICAgICAgIExMX0kyQ19ETUFfR2V0UmVnQWRkclxuCisgICogICAgICAgICBSWERSICAgICAgICAgUlhEQVRBICAgICAgICBMTF9JMkNfRE1BX0dldFJlZ0FkZHIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlCisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRE1BX1JFR19EQVRBX1RSQU5TTUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0RNQV9SRUdfREFUQV9SRUNFSVZFCisgICogQHJldHZhbCBBZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfRE1BX0dldFJlZ0FkZHIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IERpcmVjdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgZGF0YV9yZWdfYWRkcjsKKworICBpZiAoRGlyZWN0aW9uID09IExMX0kyQ19ETUFfUkVHX0RBVEFfVFJBTlNNSVQpCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBUWERSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoSTJDeC0+VFhEUik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUlhEUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKEkyQ3gtPlJYRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENsb2NrIHN0cmV0Y2hpbmcuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOT1NUUkVUQ0ggICAgIExMX0kyQ19FbmFibGVDbG9ja1N0cmV0Y2hpbmcKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUNsb2NrU3RyZXRjaGluZyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9OT1NUUkVUQ0gpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2xvY2sgc3RyZXRjaGluZy4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5PU1RSRVRDSCAgICAgTExfSTJDX0Rpc2FibGVDbG9ja1N0cmV0Y2hpbmcKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVDbG9ja1N0cmV0Y2hpbmcoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05PU1RSRVRDSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ2xvY2sgc3RyZXRjaGluZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5PU1RSRVRDSCAgICAgTExfSTJDX0lzRW5hYmxlZENsb2NrU3RyZXRjaGluZworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZENsb2NrU3RyZXRjaGluZyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05PU1RSRVRDSCkgIT0gKEkyQ19DUjFfTk9TVFJFVENIKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTQkMgICAgICAgICAgIExMX0kyQ19FbmFibGVTbGF2ZUJ5dGVDb250cm9sCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTbGF2ZUJ5dGVDb250cm9sKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TQkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaGFyZHdhcmUgYnl0ZSBjb250cm9sIGluIHNsYXZlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU0JDICAgICAgICAgICBMTF9JMkNfRGlzYWJsZVNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVTbGF2ZUJ5dGVDb250cm9sKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NCQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgaGFyZHdhcmUgYnl0ZSBjb250cm9sIGluIHNsYXZlIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTQkMgICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTbGF2ZUJ5dGVDb250cm9sCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkU2xhdmVCeXRlQ29udHJvbChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NCQykgPT0gKEkyQ19DUjFfU0JDKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtldXAgZnJvbSBTVE9QLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JMkNfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlVXBGcm9tU3RvcCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBEaWdpdGFsIEZpbHRlciBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBXVVBFTiAgICAgICAgIExMX0kyQ19FbmFibGVXYWtlVXBGcm9tU3RvcAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlV2FrZVVwRnJvbVN0b3AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2V1cCBmcm9tIFNUT1AuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0kyQ19XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2VVcEZyb21TdG9wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdVUEVOICAgICAgICAgTExfSTJDX0Rpc2FibGVXYWtlVXBGcm9tU3RvcAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVdha2VVcEZyb21TdG9wKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgZnJvbSBTVE9QIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0kyQ19XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2VVcEZyb21TdG9wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdVUEVOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZFdha2VVcEZyb21TdG9wCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkV2FrZVVwRnJvbVN0b3AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9XVVBFTikgPT0gKEkyQ19DUjFfV1VQRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEdlbmVyYWwgQ2FsbC4KKyAgKiBAbm90ZSAgIFdoZW4gZW5hYmxlZCB0aGUgQWRkcmVzcyAweDAwIGlzIEFDS2VkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEdDRU4gICAgICAgICAgTExfSTJDX0VuYWJsZUdlbmVyYWxDYWxsCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVHZW5lcmFsQ2FsbChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfR0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBHZW5lcmFsIENhbGwuCisgICogQG5vdGUgICBXaGVuIGRpc2FibGVkIHRoZSBBZGRyZXNzIDB4MDAgaXMgTkFDS2VkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEdDRU4gICAgICAgICAgTExfSTJDX0Rpc2FibGVHZW5lcmFsQ2FsbAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUdlbmVyYWxDYWxsKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0dDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEdlbmVyYWwgQ2FsbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEdDRU4gICAgICAgICAgTExfSTJDX0lzRW5hYmxlZEdlbmVyYWxDYWxsCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkR2VuZXJhbENhbGwoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9HQ0VOKSA9PSAoSTJDX0NSMV9HQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTWFzdGVyIHRvIG9wZXJhdGUgaW4gNy1iaXQgb3IgMTAtYml0IGFkZHJlc3NpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoaXMgYml0IGlzIG5vdCBhbGxvd2VkLCB3aGVuIHRoZSBTVEFSVCBiaXQgaXMgc2V0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERDEwICAgICAgICAgTExfSTJDX1NldE1hc3RlckFkZHJlc3NpbmdNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIEFkZHJlc3NpbmdNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FERFJFU1NJTkdfTU9ERV83QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FERFJFU1NJTkdfTU9ERV8xMEJJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldE1hc3RlckFkZHJlc3NpbmdNb2RlKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBBZGRyZXNzaW5nTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfQUREMTAsIEFkZHJlc3NpbmdNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIE1hc3RlciBhZGRyZXNzaW5nIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9JMkNfR2V0TWFzdGVyQWRkcmVzc2luZ01vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzEwQklUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldE1hc3RlckFkZHJlc3NpbmdNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfQUREMTApKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIE93biBBZGRyZXNzMS4KKyAgKiBAcm10b2xsIE9BUjEgICAgICAgICBPQTEgICAgICAgICAgIExMX0kyQ19TZXRPd25BZGRyZXNzMVxuCisgICogICAgICAgICBPQVIxICAgICAgICAgT0ExTU9ERSAgICAgICBMTF9JMkNfU2V0T3duQWRkcmVzczEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgT3duQWRkcmVzczEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHgzRkYuCisgICogQHBhcmFtICBPd25BZGRyU2l6ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMV83QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MxXzEwQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0T3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IE93bkFkZHJlc3MxLCB1aW50MzJfdCBPd25BZGRyU2l6ZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5PQVIxLCBJMkNfT0FSMV9PQTEgfCBJMkNfT0FSMV9PQTFNT0RFLCBPd25BZGRyZXNzMSB8IE93bkFkZHJTaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MxIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9JMkNfRW5hYmxlT3duQWRkcmVzczEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZU93bkFkZHJlc3MxKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPk9BUjEsIEkyQ19PQVIxX09BMUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFja25vd2xlZGdlIG9uIE93biBBZGRyZXNzMSBtYXRjaCBhZGRyZXNzLgorICAqIEBybXRvbGwgT0FSMSAgICAgICAgIE9BMUVOICAgICAgICAgTExfSTJDX0Rpc2FibGVPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MxKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+T0FSMSwgSTJDX09BUjFfT0ExRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE93biBBZGRyZXNzMSBhY2tub3dsZWRnZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgT0FSMSAgICAgICAgIE9BMUVOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZE93bkFkZHJlc3MxCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPk9BUjEsIEkyQ19PQVIxX09BMUVOKSA9PSAoSTJDX09BUjFfT0ExRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSA3Yml0cyBPd24gQWRkcmVzczIuCisgICogQG5vdGUgICBUaGlzIGFjdGlvbiBoYXMgbm8gZWZmZWN0IGlmIG93biBhZGRyZXNzMiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMiAgICAgICAgICAgTExfSTJDX1NldE93bkFkZHJlc3MyXG4KKyAgKiAgICAgICAgIE9BUjIgICAgICAgICBPQTJNU0sgICAgICAgIExMX0kyQ19TZXRPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBPd25BZGRyZXNzMiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4N0YuCisgICogQHBhcmFtICBPd25BZGRyTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9OT01BU0sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0T3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IE93bkFkZHJlc3MyLCB1aW50MzJfdCBPd25BZGRyTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5PQVIyLCBJMkNfT0FSMl9PQTIgfCBJMkNfT0FSMl9PQTJNU0ssIE93bkFkZHJlc3MyIHwgT3duQWRkck1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2tub3dsZWRnZSBvbiBPd24gQWRkcmVzczIgbWF0Y2ggYWRkcmVzcy4KKyAgKiBAcm10b2xsIE9BUjIgICAgICAgICBPQTJFTiAgICAgICAgIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlT3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgIGFja25vd2xlZGdlIG9uIE93biBBZGRyZXNzMiBtYXRjaCBhZGRyZXNzLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfSTJDX0Rpc2FibGVPd25BZGRyZXNzMgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIE93biBBZGRyZXNzMSBhY2tub3dsZWRnZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfSTJDX0lzRW5hYmxlZE93bkFkZHJlc3MyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPk9BUjIsIEkyQ19PQVIyX09BMkVOKSA9PSAoSTJDX09BUjJfT0EyRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgVElNSU5HUiAgICAgICBMTF9JMkNfU2V0VGltaW5nCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRpbWluZyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGLgorICAqIEBub3RlICAgVGhpcyBwYXJhbWV0ZXIgaXMgY29tcHV0ZWQgd2l0aCB0aGUgU1RNMzJDdWJlTVggVG9vbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRUaW1pbmcoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWluZykKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRJTUlOR1IsIFRpbWluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUaW1pbmcgUHJlc2NhbGVyIHNldHRpbmcuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgUFJFU0MgICAgICAgICBMTF9JMkNfR2V0VGltaW5nUHJlc2NhbGVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VGltaW5nUHJlc2NhbGVyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1JTkdSLCBJMkNfVElNSU5HUl9QUkVTQykgPj4gSTJDX1RJTUlOR1JfUFJFU0NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNDTCBsb3cgcGVyaW9kIHNldHRpbmcuCisgICogQHJtdG9sbCBUSU1JTkdSICAgICAgU0NMTCAgICAgICAgICBMTF9JMkNfR2V0Q2xvY2tMb3dQZXJpb2QKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldENsb2NrTG93UGVyaW9kKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1JTkdSLCBJMkNfVElNSU5HUl9TQ0xMKSA+PiBJMkNfVElNSU5HUl9TQ0xMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTQ0wgaGlnaCBwZXJpb2Qgc2V0dGluZy4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBTQ0xIICAgICAgICAgIExMX0kyQ19HZXRDbG9ja0hpZ2hQZXJpb2QKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldENsb2NrSGlnaFBlcmlvZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNSU5HUiwgSTJDX1RJTUlOR1JfU0NMSCkgPj4gSTJDX1RJTUlOR1JfU0NMSF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU0RBIGhvbGQgdGltZS4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBTREFERUwgICAgICAgIExMX0kyQ19HZXREYXRhSG9sZFRpbWUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXREYXRhSG9sZFRpbWUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUlOR1IsIEkyQ19USU1JTkdSX1NEQURFTCkgPj4gSTJDX1RJTUlOR1JfU0RBREVMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTREEgc2V0dXAgdGltZS4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBTQ0xERUwgICAgICAgIExMX0kyQ19HZXREYXRhU2V0dXBUaW1lCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0RGF0YVNldHVwVGltZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNSU5HUiwgSTJDX1RJTUlOR1JfU0NMREVMKSA+PiBJMkNfVElNSU5HUl9TQ0xERUxfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgcGVyaXBoZXJhbCBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNNQkhFTiAgICAgICAgTExfSTJDX1NldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNNQkRFTiAgICAgICAgTExfSTJDX1NldE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgUGVyaXBoZXJhbE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9JMkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19IT1NUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfREVWSUNFX0FSUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFBlcmlwaGVyYWxNb2RlKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMSwgSTJDX0NSMV9TTUJIRU4gfCBJMkNfQ1IxX1NNQkRFTiwgUGVyaXBoZXJhbE1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwZXJpcGhlcmFsIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU01CSEVOICAgICAgICBMTF9JMkNfR2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU01CREVOICAgICAgICBMTF9JMkNfR2V0TW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX0kyQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0hPU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0VfQVJQCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TTUJIRU4gfCBJMkNfQ1IxX1NNQkRFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTTUJ1cyBhbGVydCAoSG9zdCBvciBEZXZpY2UgbW9kZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFNNQnVzIERldmljZSBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gaXMgZHJpdmVkIGxvdyBhbmQKKyAgKiAgICAgICAgICAgQWxlcnQgUmVzcG9uc2UgQWRkcmVzcyBIZWFkZXIgYWNrbm93bGVkZ2UgaXMgZW5hYmxlZC4KKyAgKiAgICAgICAgIFNNQnVzIEhvc3QgbW9kZToKKyAgKiAgICAgICAgIC0gU01CdXMgQWxlcnQgcGluIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFMRVJURU4gICAgICAgTExfSTJDX0VuYWJsZVNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNNQnVzQWxlcnQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU01CdXMgYWxlcnQgKEhvc3Qgb3IgRGV2aWNlIG1vZGUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBTTUJ1cyBEZXZpY2UgbW9kZToKKyAgKiAgICAgICAgIC0gU01CdXMgQWxlcnQgcGluIGlzIG5vdCBkcml2ZWQgKGNhbiBiZSB1c2VkIGFzIGEgc3RhbmRhcmQgR1BJTykgYW5kCisgICogICAgICAgICAgIEFsZXJ0IFJlc3BvbnNlIEFkZHJlc3MgSGVhZGVyIGFja25vd2xlZGdlIGlzIGRpc2FibGVkLgorICAqICAgICAgICAgU01CdXMgSG9zdCBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gbWFuYWdlbWVudCBpcyBub3Qgc3VwcG9ydGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFMRVJURU4gICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c0FsZXJ0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlU01CdXNBbGVydChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BTEVSVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTTUJ1cyBhbGVydCAoSG9zdCBvciBEZXZpY2UgbW9kZSkgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTEVSVEVOICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c0FsZXJ0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkU01CdXNBbGVydChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pID09IChJMkNfQ1IxX0FMRVJURU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNNQnVzIFBhY2tldCBFcnJvciBDYWxjdWxhdGlvbiAoUEVDKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlU01CdXNQRUMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNNQnVzIFBhY2tldCBFcnJvciBDYWxjdWxhdGlvbiAoUEVDKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0kyQ19EaXNhYmxlU01CdXNQRUMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVTTUJ1c1BFQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9QRUNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVDRU4gICAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKSA9PSAoSTJDX0NSMV9QRUNFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIGFzc29jaWF0ZWQgVGltZW91dCBpcyBkaXNhYmxlZCAoVGltZW91dEEgYW5kL29yVGltZW91dEIpLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX0NvbmZpZ1NNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfQ29uZmlnU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEBwYXJhbSAgVGltZW91dEIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBLCB1aW50MzJfdCBUaW1lb3V0QU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXRCKQoreworICBNT0RJRllfUkVHKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElNRU9VVEEgfCBJMkNfVElNRU9VVFJfVElETEUgfCBJMkNfVElNRU9VVFJfVElNRU9VVEIsCisgICAgICAgICAgICAgVGltZW91dEEgfCBUaW1lb3V0QU1vZGUgfCAoVGltZW91dEIgPDwgSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgKFNDTCBsb3cgdGltZW91dCBvciBTQ0wgYW5kIFNEQSBoaWdoIHRpbWVvdXQgZGVwZW5kcyBvbiBUaW1lb3V0QSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIGJpdHMgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIFRpbWVvdXRBIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRBICAgICAgTExfSTJDX1NldFNNQnVzVGltZW91dEEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEEgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEEoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBKQoreworICBXUklURV9SRUcoSTJDeC0+VElNRU9VVFIsIFRpbWVvdXRBKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIHNldHRpbmcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNNQnVzVGltZW91dEEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElNRU9VVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QU1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEFNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0NMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEFNb2RlKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1lb3V0QU1vZGUpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEFNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXRBIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElETEUgICAgICAgICBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QU1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNNQnVzVGltZW91dEFNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgSTJDX1RJTUVPVVRSX1RJRExFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTTUJ1cyBFeHRlbmRlZCBDdW11bGF0aXZlIENsb2NrIFRpbWVvdXRCIChNYXN0ZXIgb3IgU2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBiaXRzIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBUaW1lb3V0QiBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19TZXRTTUJ1c1RpbWVvdXRCCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXRCIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuICBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRTTUJ1c1RpbWVvdXRCKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUaW1lb3V0QikKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRJTUVPVVRSLCBUaW1lb3V0QiA8PCBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIEV4dGVudGVkIEN1bXVsYXRpdmUgQ2xvY2sgVGltZW91dEIgc2V0dGluZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQiAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRCCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIEkyQ19USU1FT1VUUl9USU1FT1VUQikgPj4gSTJDX1RJTUVPVVRSX1RJTUVPVVRCX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0LgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0VuYWJsZVNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNNQnVzVGltZW91dChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgQ2xvY2tUaW1lb3V0KQoreworICBTRVRfQklUKEkyQ3gtPlRJTUVPVVRSLCBDbG9ja1RpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzVGltZW91dAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBDbG9ja1RpbWVvdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfQUxMX1RJTUVPVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlU01CdXNUaW1lb3V0KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBDbG9ja1RpbWVvdXQpCit7CisgIENMRUFSX0JJVChJMkN4LT5USU1FT1VUUiwgQ2xvY2tUaW1lb3V0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU01CdXMgQ2xvY2sgVGltZW91dCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTU9VVEVOICAgICAgTExfSTJDX0lzRW5hYmxlZFNNQnVzVGltZW91dFxuCisgICogICAgICAgICBUSU1FT1VUUiAgICAgVEVYVEVOICAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IENsb2NrVGltZW91dCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIChJMkNfVElNRU9VVFJfVElNT1VURU4gfCBJMkNfVElNRU9VVFJfVEVYVEVOKSkgPT0gKENsb2NrVGltZW91dCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFhJUyBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfVFgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRYSVMgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYSUUgICAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBUWElTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYSUUgICAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkSVRfVFgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UWElFKSA9PSAoSTJDX0NSMV9UWElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWE5FIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19FbmFibGVJVF9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlhORSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJYTkUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1JYSUUpID09IChJMkNfQ1IxX1JYSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IChzbGF2ZSBtb2RlIG9ubHkpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FERFJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBZGRyZXNzIG1hdGNoIGludGVycnVwdCAoc2xhdmUgbW9kZSBvbmx5KS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBRERSSUUgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBZGRyZXNzIG1hdGNoIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKSA9PSAoSTJDX0NSMV9BRERSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9JMkNfRW5hYmxlSVRfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE5vdCBhY2tub3dsZWRnZSByZWNlaXZlZCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05BQ0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5BQ0tJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX05BQ0sKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKSA9PSAoSTJDX0NSMV9OQUNLSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTVE9QSUUgICAgICAgIExMX0kyQ19FbmFibGVJVF9TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TVE9QSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfU1RPUChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TVE9QSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0lzRW5hYmxlZElUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU1RPUElFKSA9PSAoSTJDX0NSMV9TVE9QSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1RDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdC4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBldmVudHMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgKFRDKQorICAqICAgICAgICAgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkIChUQ1IpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfVEMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RDSUUpID09IChJMkNfQ1IxX1RDSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEVycm9yIGludGVycnVwdHMuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBBbnkgb2YgdGhlc2UgZXJyb3JzIHdpbGwgZ2VuZXJhdGUgaW50ZXJydXB0IDoKKyAgKiAgICAgICAgIEFyYml0cmF0aW9uIExvc3MgKEFSTE8pCisgICogICAgICAgICBCdXMgRXJyb3IgZGV0ZWN0aW9uIChCRVJSKQorICAqICAgICAgICAgT3ZlcnJ1bi9VbmRlcnJ1biAoT1ZSKQorICAqICAgICAgICAgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gKFRJTUVPVVQpCisgICogICAgICAgICBTTUJ1cyBQRUMgZXJyb3IgZGV0ZWN0aW9uIChQRUNFUlIpCisgICogICAgICAgICBTTUJ1cyBBbGVydCBwaW4gZXZlbnQgZGV0ZWN0aW9uIChBTEVSVCkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyQ19FbmFibGVJVF9FUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfRVJSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXJyb3IgaW50ZXJydXB0cy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBlcnJvcnMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgQXJiaXRyYXRpb24gTG9zcyAoQVJMTykKKyAgKiAgICAgICAgIEJ1cyBFcnJvciBkZXRlY3Rpb24gKEJFUlIpCisgICogICAgICAgICBPdmVycnVuL1VuZGVycnVuIChPVlIpCisgICogICAgICAgICBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiAoVElNRU9VVCkKKyAgKiAgICAgICAgIFNNQnVzIFBFQyBlcnJvciBkZXRlY3Rpb24gKFBFQ0VSUikKKyAgKiAgICAgICAgIFNNQnVzIEFsZXJ0IHBpbiBldmVudCBkZXRlY3Rpb24gKEFMRVJUKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9FUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfRVJSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVycm9yIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkSVRfRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfRVJSSUUpID09IChJMkNfQ1IxX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9GTEFHX21hbmFnZW1lbnQgRkxBR19tYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXaGVuIG5leHQgZGF0YSBpcyB3cml0dGVuIGluIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIuCisgICogICAgICAgICBTRVQ6IFdoZW4gVHJhbnNtaXQgZGF0YSByZWdpc3RlciBpcyBlbXB0eS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEUgICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhFCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1RYRShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1RYRSkgPT0gKEkyQ19JU1JfVFhFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNtaXQgaW50ZXJydXB0IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogV2hlbiBuZXh0IGRhdGEgaXMgd3JpdHRlbiBpbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyLgorICAqICAgICAgICAgU0VUOiBXaGVuIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgaXMgZW1wdHkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhJUyAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1RYSVMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhJUyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1RYSVMpID09IChJMkNfSVNSX1RYSVMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogV2hlbiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgaXMgcmVhZC4KKyAgKiAgICAgICAgIFNFVDogV2hlbiB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBjb3BpZWQgaW4gUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkUgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19SWE5FCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX1JYTkUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9SWE5FKSA9PSAoSTJDX0lTUl9SWE5FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgQWRkcmVzcyBtYXRjaGVkIGZsYWcgKHNsYXZlIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gdGhlIHJlY2VpdmVkIHNsYXZlIGFkZHJlc3MgbWF0Y2hlZCB3aXRoIG9uZSBvZiB0aGUgZW5hYmxlZCBzbGF2ZSBhZGRyZXNzLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFERFIgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19BRERSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9BRERSKSA9PSAoSTJDX0lTUl9BRERSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgTm90IEFja25vd2xlZGdlIHJlY2VpdmVkIGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIE5BQ0sgaXMgcmVjZWl2ZWQgYWZ0ZXIgYSBieXRlIHRyYW5zbWlzc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBOQUNLRiAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfTkFDS0YpID09IChJMkNfSVNSX05BQ0tGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU3RvcCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGEgU3RvcCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU1RPUEYgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfU1RPUChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1NUT1BGKSA9PSAoSTJDX0lTUl9TVE9QRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIFJFTE9BRD0wLCBBVVRPRU5EPTAgYW5kIE5CWVRFUyBkYXRlIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQyAgICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVEMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UQykgPT0gKEkyQ19JU1JfVEMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBSRUxPQUQ9MSBhbmQgTkJZVEVTIGRhdGUgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDUiAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UQ1IKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVENSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVENSKSA9PSAoSTJDX0lTUl9UQ1IpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBCdXMgZXJyb3IgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGEgbWlzcGxhY2VkIFN0YXJ0IG9yIFN0b3AgY29uZGl0aW9uIGlzIGRldGVjdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEJFUlIgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19CRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX0JFUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9CRVJSKSA9PSAoSTJDX0lTUl9CRVJSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgQXJiaXRyYXRpb24gbG9zdCBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYXJiaXRyYXRpb24gbG9zdC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBUkxPICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfQVJMTworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19BUkxPKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQVJMTykgPT0gKEkyQ19JU1JfQVJMTykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIE92ZXJydW4vVW5kZXJydW4gZmxhZyAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhbiBvdmVycnVuL3VuZGVycnVuIGVycm9yIG9jY3VycyAoQ2xvY2sgU3RyZXRjaGluZyBEaXNhYmxlZCkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX09WUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19PVlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9PVlIpID09IChJMkNfSVNSX09WUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIFBFQyBlcnJvciBmbGFnIGluIHJlY2VwdGlvbi4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIHRoZSByZWNlaXZlZCBQRUMgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgUEVDIHJlZ2lzdGVyIGNvbnRlbnQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEVDRVJSICAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfUEVDRVJSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfUEVDRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfUEVDRVJSKSA9PSAoSTJDX0lTUl9QRUNFUlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiBmbGFnLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSB0aW1lb3V0IG9yIGV4dGVuZGVkIGNsb2NrIHRpbWVvdXQgb2NjdXJzLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRJTUVPVVQgICAgICAgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1RJTUVPVVQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19USU1FT1VUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVElNRU9VVCkgPT0gKEkyQ19JU1JfVElNRU9VVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIGFsZXJ0IGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBTTUJ1cyBob3N0IGNvbmZpZ3VyYXRpb24sIFNNQnVzIGFsZXJ0IGVuYWJsZWQgYW5kCisgICogICAgICAgICAgICAgIGEgZmFsbGluZyBlZGdlIGV2ZW50IG9jY3VycyBvbiBTTUJBIHBpbi4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTEVSVCAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19BTEVSVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX0FMRVJUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQUxFUlQpID09IChJMkNfSVNSX0FMRVJUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgQnVzIEJ1c3kgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGEgU3RhcnQgY29uZGl0aW9uIGlzIGRldGVjdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEJVU1kgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19CVVNZCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX0JVU1koSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9CVVNZKSA9PSAoSTJDX0lTUl9CVVNZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFkZHJlc3MgTWF0Y2hlZCBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFERFJDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19BRERSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfQUREUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfQUREUkNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBOb3QgQWNrbm93bGVkZ2UgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBOQUNLQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX05BQ0soSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX05BQ0tDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3RvcCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBTVE9QQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfU1RPUAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX1NUT1BDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnIChUWEUpLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIGJlIGNsZWFyIGJ5IHNvZnR3YXJlIGluIG9yZGVyIHRvIGZsdXNoIHRoZSB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIChUWERSKS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEUgICAgICAgICAgIExMX0kyQ19DbGVhckZsYWdfVFhFCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfVFhFKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBXUklURV9SRUcoSTJDeC0+SVNSLCBJMkNfSVNSX1RYRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQnVzIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQkVSUkNGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX0JFUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19CRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9CRVJSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFyYml0cmF0aW9uIGxvc3QgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBUkxPQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfQVJMTworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX0FSTE8oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0FSTE9DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIE9WUkNGICAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19PVlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19PVlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX09WUkNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTTUJ1cyBQRUMgZXJyb3IgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNDRiAgICAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19QRUNFUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyU01CdXNGbGFnX1BFQ0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfUEVDQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVElNT1VUQ0YgICAgICBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfVElNRU9VVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfVElNRU9VVChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfVElNT1VUQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIEFsZXJ0IGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQUxFUlRDRiAgICAgICBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfQUxFUlQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyU01CdXNGbGFnX0FMRVJUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9BTEVSVENGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9tYXRpYyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBBdXRvbWF0aWMgZW5kIG1vZGUgOiBhIFNUT1AgY29uZGl0aW9uIGlzIGF1dG9tYXRpY2FsbHkgc2VudCB3aGVuIE5CWVRFUyBkYXRhIGFyZSB0cmFuc2ZlcnJlZC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3QgaW4gc2xhdmUgbW9kZSBvciB3aGVuIFJFTE9BRCBiaXQgaXMgc2V0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFVVE9FTkQgICAgICAgTExfSTJDX0VuYWJsZUF1dG9FbmRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVBdXRvRW5kTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfQVVUT0VORCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvbWF0aWMgU1RPUCBjb25kaXRpb24gZ2VuZXJhdGlvbiAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgU29mdHdhcmUgZW5kIG1vZGUgOiBUQyBmbGFnIGlzIHNldCB3aGVuIE5CWVRFUyBkYXRhIGFyZSB0cmFuc2ZlcnJlLCBzdHJldGNoaW5nIFNDTCBsb3cuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfRGlzYWJsZUF1dG9FbmRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlQXV0b0VuZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfQVVUT0VORCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgYXV0b21hdGljIFNUT1AgY29uZGl0aW9uIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfSXNFbmFibGVkQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRBdXRvRW5kTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0FVVE9FTkQpID09IChJMkNfQ1IyX0FVVE9FTkQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJlbG9hZCBtb2RlIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgdHJhbnNmZXIgaXMgbm90IGNvbXBsZXRlZCBhZnRlciB0aGUgTkJZVEVTIGRhdGEgdHJhbnNmZXIsIE5CWVRFUyB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gVENSIGZsYWcgaXMgc2V0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9JMkNfRW5hYmxlUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlUmVsb2FkTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUkVMT0FEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJlbG9hZCBtb2RlIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGVkIGFmdGVyIHRoZSBOQllURVMgZGF0YSB0cmFuc2ZlcihTVE9QIG9yIFJFU1RBUlQgd2lsbCBmb2xsb3cpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9JMkNfRGlzYWJsZVJlbG9hZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVSZWxvYWRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JFTE9BRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgcmVsb2FkIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSRUxPQUQgICAgICAgTExfSTJDX0lzRW5hYmxlZFJlbG9hZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRSZWxvYWRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUkVMT0FEKSA9PSAoSTJDX0NSMl9SRUxPQUQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHRyYW5zZmVyLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhlc2UgYml0cyB3aGVuIFNUQVJUIGJpdCBpcyBzZXQgaXMgbm90IGFsbG93ZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTkJZVEVTICAgICAgICAgICBMTF9JMkNfU2V0VHJhbnNmZXJTaXplCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyU2l6ZSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFRyYW5zZmVyU2l6ZShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVHJhbnNmZXJTaXplKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9OQllURVMsIFRyYW5zZmVyU2l6ZSA8PCBJMkNfQ1IyX05CWVRFU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbmZpZ3VyZWQgZm9yIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5CWVRFUyAgICAgICAgICAgTExfSTJDX0dldFRyYW5zZmVyU2l6ZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRUcmFuc2ZlclNpemUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9OQllURVMpID4+IEkyQ19DUjJfTkJZVEVTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJlcGFyZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIEFDS25vd2xlZGdlIG9yIE5vbiBBQ0tub3dsZWRnZSBjb25kaXRpb24gYWZ0ZXIgdGhlIGFkZHJlc3MgcmVjZWl2ZSBtYXRjaCBjb2RlIG9yIG5leHQgcmVjZWl2ZWQgYnl0ZS4KKyAgKiBAbm90ZSAgIFVzYWdlIGluIFNsYXZlIG1vZGUgb25seS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOQUNLICAgICAgICAgIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFR5cGVBY2tub3dsZWRnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BQ0sKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTkFDSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Fja25vd2xlZGdlTmV4dERhdGEoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFR5cGVBY2tub3dsZWRnZSkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfTkFDSywgVHlwZUFja25vd2xlZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIFNUQVJUIG9yIFJFU1RBUlQgY29uZGl0aW9uCisgICogQG5vdGUgICBUaGUgU1RBUlQgYml0IGNhbiBiZSBzZXQgZXZlbiBpZiBidXMgaXMgQlVTWSBvciBJMkMgaXMgaW4gc2xhdmUgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBSRUxPQUQgaXMgc2V0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUQVJUICAgICAgICAgICBMTF9JMkNfR2VuZXJhdGVTdGFydENvbmRpdGlvbgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfR2VuZXJhdGVTdGFydENvbmRpdGlvbihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfU1RBUlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU1RPUCBjb25kaXRpb24gYWZ0ZXIgdGhlIGN1cnJlbnQgYnl0ZSB0cmFuc2ZlciAobWFzdGVyIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfSTJDX0dlbmVyYXRlU3RvcENvbmRpdGlvbgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfR2VuZXJhdGVTdG9wQ29uZGl0aW9uKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9TVE9QKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIFJFU1RBUlQgUmVhZCByZXF1ZXN0IGNvbmRpdGlvbiBmb3IgMTBiaXQgYWRkcmVzcyBoZWFkZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSBtYXN0ZXIgc2VuZHMgdGhlIGNvbXBsZXRlIDEwYml0IHNsYXZlIGFkZHJlc3MgcmVhZCBzZXF1ZW5jZSA6CisgICogICAgICAgICBTdGFydCArIDIgYnl0ZXMgMTBiaXQgYWRkcmVzcyBpbiBXcml0ZSBkaXJlY3Rpb24gKyBSZXN0YXJ0ICsgZmlyc3QgNyBiaXRzIG9mIDEwYml0IGFkZHJlc3MgaW4gUmVhZCBkaXJlY3Rpb24uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9JMkNfRW5hYmxlQXV0bzEwQml0UmVhZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlQXV0bzEwQml0UmVhZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9IRUFEMTBSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBSRVNUQVJUIFJlYWQgcmVxdWVzdCBjb25kaXRpb24gZm9yIDEwYml0IGFkZHJlc3MgaGVhZGVyIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBUaGUgbWFzdGVyIG9ubHkgc2VuZHMgdGhlIGZpcnN0IDcgYml0cyBvZiAxMGJpdCBhZGRyZXNzIGluIFJlYWQgZGlyZWN0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0Rpc2FibGVBdXRvMTBCaXRSZWFkCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlQXV0bzEwQml0UmVhZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfSEVBRDEwUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgYXV0b21hdGljIFJFU1RBUlQgUmVhZCByZXF1ZXN0IGNvbmRpdGlvbiBmb3IgMTBiaXQgYWRkcmVzcyBoZWFkZXIgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0kyQ19Jc0VuYWJsZWRBdXRvMTBCaXRSZWFkCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkQXV0bzEwQml0UmVhZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0hFQUQxMFIpICE9IChJMkNfQ1IyX0hFQUQxMFIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24gKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJEX1dSTiAgICAgICAgICAgTExfSTJDX1NldFRyYW5zZmVyUmVxdWVzdAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUcmFuc2ZlclJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfUkVRVUVTVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19SRVFVRVNUX1JFQUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRUcmFuc2ZlclJlcXVlc3QoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRyYW5zZmVyUmVxdWVzdCkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfUkRfV1JOLCBUcmFuc2ZlclJlcXVlc3QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgdHJhbnNmZXIgZGlyZWN0aW9uIHJlcXVlc3RlZCAobWFzdGVyIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJEX1dSTiAgICAgICAgICAgTExfSTJDX0dldFRyYW5zZmVyUmVxdWVzdAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19SRVFVRVNUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfUkVBRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRUcmFuc2ZlclJlcXVlc3QoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRF9XUk4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHNsYXZlIGFkZHJlc3MgZm9yIHRyYW5zZmVyIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBDaGFuZ2luZyB0aGVzZSBiaXRzIHdoZW4gU1RBUlQgYml0IGlzIHNldCBpcyBub3QgYWxsb3dlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTQUREICAgICAgICAgICBMTF9JMkNfU2V0U2xhdmVBZGRyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkciBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNsYXZlQWRkcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgU2xhdmVBZGRyKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9TQURELCBTbGF2ZUFkZHIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2xhdmUgYWRkcmVzcyBwcm9ncmFtbWVkIGZvciB0cmFuc2Zlci4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTQUREICAgICAgICAgICBMTF9JMkNfR2V0U2xhdmVBZGRyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNsYXZlQWRkcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NBREQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIEkyQ3ggY29tbXVuaWNhdGlvbiB3aGVuIHN0YXJ0aW5nIHRyYW5zZmVyIG9yIGR1cmluZyB0cmFuc2ZlciAoVEMgb3IgVENSIGZsYWcgYXJlIHNldCkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0FERCAgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEFERDEwICAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBSRF9XUk4gICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RBUlQgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBSRUxPQUQgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgTkJZVEVTICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEFVVE9FTkQgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBTbGF2ZUFkZHIgU3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBTbGF2ZUFkZHJTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FERFJTTEFWRV83QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FERFJTTEFWRV8xMEJJVAorICAqIEBwYXJhbSAgVHJhbnNmZXJTaXplIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQuCisgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NS4KKyAgKiBAcGFyYW0gIEVuZE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9SRUxPQUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9BVVRPRU5ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU09GVEVORAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX1JFTE9BRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfTk9fUEVDCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfU09GVEVORF9OT19QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19BVVRPRU5EX1dJVEhfUEVDCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfU09GVEVORF9XSVRIX1BFQworICAqIEBwYXJhbSAgUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9OT1NUQVJUU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF83QklUX1JFQUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF83QklUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzEwQklUX1dSSVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfSGFuZGxlVHJhbnNmZXIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFNsYXZlQWRkciwgdWludDMyX3QgU2xhdmVBZGRyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmFuc2ZlclNpemUsIHVpbnQzMl90IEVuZE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX0FERDEwIHwgKEkyQ19DUjJfUkRfV1JOICYgKHVpbnQzMl90KShSZXF1ZXN0ID4+ICgzMVUgLSBJMkNfQ1IyX1JEX1dSTl9Qb3MpKSkgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9TVE9QIHwgSTJDX0NSMl9SRUxPQUQgfAorICAgICAgICAgICAgIEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9BVVRPRU5EIHwgSTJDX0NSMl9IRUFEMTBSLAorICAgICAgICAgICAgIFNsYXZlQWRkciB8IFNsYXZlQWRkclNpemUgfCAoVHJhbnNmZXJTaXplIDw8IEkyQ19DUjJfTkJZVEVTX1BvcykgfCBFbmRNb2RlIHwgUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHZhbHVlIG9mIHRyYW5zZmVyIGRpcmVjdGlvbiAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogV3JpdGUgdHJhbnNmZXIsIFNsYXZlIGVudGVycyBpbiByZWNlaXZlciBtb2RlLgorICAqICAgICAgICAgU0VUOiBSZWFkIHRyYW5zZmVyLCBTbGF2ZSBlbnRlcnMgaW4gdHJhbnNtaXR0ZXIgbW9kZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBESVIgICAgICAgICAgIExMX0kyQ19HZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19ESVJFQ1RJT05fV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRElSRUNUSU9OX1JFQUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0VHJhbnNmZXJEaXJlY3Rpb24oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9ESVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIHNsYXZlIG1hdGNoZWQgYWRkcmVzcy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBRERDT0RFICAgICAgIExMX0kyQ19HZXRBZGRyZXNzTWF0Y2hDb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRBZGRyZXNzTWF0Y2hDb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfQUREQ09ERSkgPj4gSTJDX0lTUl9BRERDT0RFX1BvcyA8PCAxKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJuYWwgY29tcGFyaXNvbiBvZiB0aGUgU01CdXMgUGFja2V0IEVycm9yIGJ5dGUgKHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24gbW9kZSkuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGZlYXR1cmUgaXMgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHRoZSBQRUMgYnl0ZSBpcyB0cmFuc2ZlcnJlZCwgb3Igd2hlbiBhIFNUT1AgY29uZGl0aW9uIG9yIGFuIEFkZHJlc3MgTWF0Y2hlZCBpcyByZWNlaXZlZC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgd2hlbiBSRUxPQUQgYml0IGlzIHNldC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGhhcyBubyBlZmZlY3QgaW4gZGV2aWNlIG1vZGUgd2hlbiBTQkMgYml0IGlzIG5vdCBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUEVDQllURSAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNQRUNDb21wYXJlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c1BFQ0NvbXBhcmUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1BFQ0JZVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSBpbnRlcm5hbCBjb21wYXJpc29uIGlzIHJlcXVlc3RlZCBvciBub3QuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUEVDQllURSAgICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUNDb21wYXJlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkU01CdXNQRUNDb21wYXJlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUEVDQllURSkgPT0gKEkyQ19DUjJfUEVDQllURSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNNQnVzIFBhY2tldCBFcnJvciBieXRlIGNhbGN1bGF0ZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBQRUNSICAgICAgICAgUEVDICAgICAgICAgICBMTF9JMkNfR2V0U01CdXNQRUMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRTTUJ1c1BFQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+UEVDUiwgSTJDX1BFQ1JfUEVDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlIERhdGEgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBSWERSICAgICAgICAgUlhEQVRBICAgICAgICBMTF9JMkNfUmVjZWl2ZURhdGE4CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfSTJDX1JlY2VpdmVEYXRhOChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChJMkN4LT5SWERSLCBJMkNfUlhEUl9SWERBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIC4KKyAgKiBAcm10b2xsIFRYRFIgICAgICAgICBUWERBVEEgICAgICAgIExMX0kyQ19UcmFuc21pdERhdGE4CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfVHJhbnNtaXREYXRhOChJMkNfVHlwZURlZiAqSTJDeCwgdWludDhfdCBEYXRhKQoreworICBXUklURV9SRUcoSTJDeC0+VFhEUiwgRGF0YSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0kyQ19Jbml0KEkyQ19UeXBlRGVmICpJMkN4LCBMTF9JMkNfSW5pdFR5cGVEZWYgKkkyQ19Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX0kyQ19EZUluaXQoSTJDX1R5cGVEZWYgKkkyQ3gpOwordm9pZCBMTF9JMkNfU3RydWN0SW5pdChMTF9JMkNfSW5pdFR5cGVEZWYgKkkyQ19Jbml0U3RydWN0KTsKKworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSTJDMSB8fCBJMkMyICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfSTJDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfaXdkZy5oIGIvSW5jL3N0bTMyZzB4eF9sbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlYWE2YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfaXdkZy5oCkBAIC0wLDAgKzEsMzQyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2l3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfSVdER19ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9JV0RHX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKElXREcpCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTCBJV0RHCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfTExfUHJpdmF0ZV9Db25zdGFudHMgSVdERyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIExMX0lXREdfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgMHgwMDAwQUFBQVUgICAgICAgICAgICAgICAvKiE8IElXREcgUmVsb2FkIENvdW50ZXIgRW5hYmxlICAgKi8KKyNkZWZpbmUgTExfSVdER19LRVlfRU5BQkxFICAgICAgICAgICAgICAgICAweDAwMDBDQ0NDVSAgICAgICAgICAgICAgIC8qITwgSVdERyBQZXJpcGhlcmFsIEVuYWJsZSAgICAgICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRU5BQkxFICAgICAgIDB4MDAwMDU1NTVVICAgICAgICAgICAgICAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBFbmFibGUgICovCisjZGVmaW5lIExMX0lXREdfS0VZX1dSX0FDQ0VTU19ESVNBQkxFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IElXREcgS1IgV3JpdGUgQWNjZXNzIERpc2FibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJV0RHIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSVdER19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSVdER19TUl9QVlUgICAgICAgICAgICAgICAgICAgICBJV0RHX1NSX1BWVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2F0Y2hkb2cgcHJlc2NhbGVyIHZhbHVlIHVwZGF0ZSAqLworI2RlZmluZSBMTF9JV0RHX1NSX1JWVSAgICAgICAgICAgICAgICAgICAgIElXREdfU1JfUlZVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYXRjaGRvZyBjb3VudGVyIHJlbG9hZCB2YWx1ZSB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSVdER19TUl9XVlUgICAgICAgICAgICAgICAgICAgICBJV0RHX1NSX1dWVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2F0Y2hkb2cgY291bnRlciB3aW5kb3cgdmFsdWUgdXBkYXRlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfUFJFU0NBTEVSICBQcmVzY2FsZXIgRGl2aWRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgNCAgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgOCAgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMTYgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSB8IElXREdfUFJfUFJfMCkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMzIgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzY0ICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMikgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpdmlkZXIgYnkgNjQgICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMCkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMTI4ICovCisjZGVmaW5lIExMX0lXREdfUFJFU0NBTEVSXzI1NiAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMSkgICAgICAgICAvKiE8IERpdmlkZXIgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX01hY3JvcyBJV0RHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIElXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9JV0RHX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gSVdERyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSVdER19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIElXREdfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgSW5kZXBlbmRlbnQgV2F0Y2hkb2cKKyAgKiBAbm90ZSAgIEV4Y2VwdCBpZiB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb3B0aW9uIGlzIHNlbGVjdGVkCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX0VuYWJsZQorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19FbmFibGUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5LUiwgTExfSVdER19LRVlfRU5BQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxvYWRzIElXREcgY291bnRlciB3aXRoIHZhbHVlIGRlZmluZWQgaW4gdGhlIHJlbG9hZCByZWdpc3RlcgorICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19SZWxvYWRDb3VudGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX1JlbG9hZENvdW50ZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5LUiwgTExfSVdER19LRVlfUkVMT0FEKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX0VuYWJsZVdyaXRlQWNjZXNzCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX0VuYWJsZVdyaXRlQWNjZXNzKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX1dSX0FDQ0VTU19FTkFCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgd3JpdGUgYWNjZXNzIHRvIElXREdfUFIsIElXREdfUkxSIGFuZCBJV0RHX1dJTlIgcmVnaXN0ZXJzCisgICogQHJtdG9sbCBLUiAgICAgICAgICAgS0VZICAgICAgICAgICBMTF9JV0RHX0Rpc2FibGVXcml0ZUFjY2VzcworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19EaXNhYmxlV3JpdGVBY2Nlc3MoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5LUiwgTExfSVdER19LRVlfV1JfQUNDRVNTX0RJU0FCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcHJlc2NhbGVyIG9mIHRoZSBJV0RHCisgICogQHJtdG9sbCBQUiAgICAgICAgICAgUFIgICAgICAgICAgICBMTF9JV0RHX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8yNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0UHJlc2NhbGVyKElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5QUiwgSVdER19QUl9QUiAmIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBwcmVzY2FsZXIgb2YgdGhlIElXREcKKyAgKiBAcm10b2xsIFBSICAgICAgICAgICBQUiAgICAgICAgICAgIExMX0lXREdfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMjU2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19HZXRQcmVzY2FsZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRyhJV0RHeC0+UFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBJV0RHIGRvd24tY291bnRlciByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfU2V0UmVsb2FkQ291bnRlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19TZXRSZWxvYWRDb3VudGVyKElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IENvdW50ZXIpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+UkxSLCBJV0RHX1JMUl9STCAmIENvdW50ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWVkIElXREcgZG93bi1jb3VudGVyIHJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgUkxSICAgICAgICAgIFJMICAgICAgICAgICAgTExfSVdER19HZXRSZWxvYWRDb3VudGVyCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfR2V0UmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKFJFQURfUkVHKElXREd4LT5STFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IGhpZ2ggbGltaXQgb2YgdGhlIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bi1jb3VudGVyLgorICAqIEBybXRvbGwgV0lOUiAgICAgICAgIFdJTiAgICAgICAgICAgTExfSVdER19TZXRXaW5kb3cKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdpbmRvdyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19TZXRXaW5kb3coSVdER19UeXBlRGVmICpJV0RHeCwgdWludDMyX3QgV2luZG93KQoreworICBXUklURV9SRUcoSVdER3gtPldJTlIsIElXREdfV0lOUl9XSU4gJiBXaW5kb3cpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgaGlnaCBsaW1pdCBvZiB0aGUgd2luZG93IHZhbHVlIHNwZWNpZmllZC4KKyAgKiBAcm10b2xsIFdJTlIgICAgICAgICBXSU4gICAgICAgICAgIExMX0lXREdfR2V0V2luZG93CisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4MEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfR2V0V2luZG93KElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoUkVBRF9SRUcoSVdER3gtPldJTlIpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYWcgUHJlc2NhbGVyIFZhbHVlIFVwZGF0ZSBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUFZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19QVlUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1BWVSkgPT0gKElXREdfU1JfUFZVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYWcgUmVsb2FkIFZhbHVlIFVwZGF0ZSBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUlZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19SVlUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1JWVSkgPT0gKElXREdfU1JfUlZVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYWcgV2luZG93IFZhbHVlIFVwZGF0ZSBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgV1ZVICAgICAgICAgICBMTF9JV0RHX0lzQWN0aXZlRmxhZ19XVlUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0lzQWN0aXZlRmxhZ19XVlUoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVdER3gtPlNSLCBJV0RHX1NSX1dWVSkgPT0gKElXREdfU1JfV1ZVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGFsbCBmbGFncyBQcmVzY2FsZXIsIFJlbG9hZCAmIFdpbmRvdyBWYWx1ZSBVcGRhdGUgYXJlIHJlc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFBWVSAgICAgICAgICAgTExfSVdER19Jc1JlYWR5XG4KKyAgKiAgICAgICAgIFNSICAgICAgICAgICBXVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeVxuCisgICogICAgICAgICBTUiAgICAgICAgICAgUlZVICAgICAgICAgICBMTF9JV0RHX0lzUmVhZHkKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdHMgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc1JlYWR5KElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9QVlUgfCBJV0RHX1NSX1JWVSB8IElXREdfU1JfV1ZVKSA9PSAwVSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJV0RHKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX0lXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9scHRpbS5oIGIvSW5jL3N0bTMyZzB4eF9sbF9scHRpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzhkODYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX2xwdGltLmgKQEAgLTAsMCArMSwxNDYwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2xwdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIExQVElNIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfTFBUSU1fSAorI2RlZmluZSBTVE0zMkcweHhfTExfTFBUSU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVElNMSkgfHwgZGVmaW5lZCAoTFBUSU0yKQorCQorLyoqIEBkZWZncm91cCBMUFRJTV9MTCBMUFRJTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBMUFRJTV9MTF9Qcml2YXRlX01hY3JvcyBMUFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRVNfSU5JVCBMUFRJTSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tTb3VyY2U7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIGNsb2NrIHVzZWQgYnkgdGhlIExQVElNIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX0NMS19TT1VSQ0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFRJTV9TZXRDbG9ja1NvdXJjZSgpLiovCisKKyAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgZGl2aXNpb24gcmF0aW8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fTExfRUNfUFJFU0NBTEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBUSU1fU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBXYXZlZm9ybTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHdhdmVmb3JtIHNoYXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX09VVFBVVF9XQVZFRk9STS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0NvbmZpZ091dHB1dCgpLiovCisKKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdhdmVmb3JtIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0xMX0VDX09VVFBVVF9QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0NvbmZpZ091dHB1dCgpLiovCit9IExMX0xQVElNX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgTFBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfTFBUSU1fUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9DTVBNICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0NNUE0gICAgIC8qITwgQ29tcGFyZSBtYXRjaCAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfQVJSTSAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJNICAgICAvKiE8IEF1dG9yZWxvYWQgbWF0Y2ggKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0VYVFRSSUcgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRVhUVFJJRyAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0NNUE9LICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQ01QT0sgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfQVJST0sgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9BUlJPSyAgICAvKiE8IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9VUCAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX1VQICAgICAgIC8qITwgQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0RPV04gICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfRE9XTiAgICAgLyohPCBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgdG8gZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFRJTV9SZWFkUmVnIGFuZCAgTExfTFBUSU1fV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX0NNUE1JRSAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfQ01QTUlFICAgICAgIC8qITwgQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9BUlJNSUUgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk1JRSAgICAgICAvKiE8IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfRVhUVFJJR0lFICAgICAgICAgICAgICAgIExQVElNX0lFUl9FWFRUUklHSUUgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfQ01QT0tJRSAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBPS0lFICAgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9BUlJPS0lFICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk9LSUUgICAgICAvKiE8IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX1VQSUUgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfVVBJRSAgICAgICAgIC8qITwgRGlyZWN0aW9uIGNoYW5nZSB0byBVUCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9ET1dOSUUgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0RPV05JRSAgICAgICAvKiE8IERpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBJbnRlcnJ1cHQgRW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09QRVJBVElOR19NT0RFIE9wZXJhdGluZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfQ09OVElOVU9VUyAgICBMUFRJTV9DUl9DTlRTVFJUICAgICAgIC8qITxMUCBUaW1lciBzdGFydHMgaW4gY29udGludW91cyBtb2RlKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVCAgICAgICBMUFRJTV9DUl9TTkdTVFJUICAgICAgIC8qITxMUCBUaWxtZXIgc3RhcnRzIGluIHNpbmdsZSBtb2RlKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfVVBEQVRFX01PREUgVXBkYXRlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9VUERBVEVfTU9ERV9JTU1FRElBVEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxQcmVsb2FkIGlzIGRpc2FibGVkOiByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBBUEIgYnVzIHdyaXRlIGFjY2VzcyovCisjZGVmaW5lIExMX0xQVElNX1VQREFURV9NT0RFX0VORE9GUEVSSU9EICAgICAgTFBUSU1fQ0ZHUl9QUkVMT0FEICAgICAgLyohPHByZWxvYWQgaXMgZW5hYmxlZDogcmVnaXN0ZXJzIGFyZSB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgTFBUSU0gcGVyaW9kKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ09VTlRFUl9NT0RFIENvdW50ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0NPVU5URVJfTU9ERV9JTlRFUk5BTCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvbGxvd2luZyBlYWNoIGludGVybmFsIGNsb2NrIHB1bHNlKi8KKyNkZWZpbmUgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0VYVEVSTkFMICAgICAgICBMUFRJTV9DRkdSX0NPVU5UTU9ERSAgICAvKiE8VGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9sbG93aW5nIGVhY2ggdmFsaWQgY2xvY2sgcHVsc2Ugb24gdGhlIExQVElNIGV4dGVybmFsIElucHV0MSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09VVFBVVF9XQVZFRk9STSBPdXRwdXQgV2F2ZWZvcm0gVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00gICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPExQVElNICBnZW5lcmF0ZXMgZWl0aGVyIGEgUFdNIHdhdmVmb3JtIG9yIGEgT25lIHB1bHNlIHdhdmVmb3JtIGRlcGVuZGluZyBvbiBjaG9zZW4gb3BlcmF0aW5nIG1vZGUgQ09OVElOT1VTIG9yIFNJTkdMRSovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFICAgICAgTFBUSU1fQ0ZHUl9XQVZFICAgICAgICAgLyohPExQVElNICBnZW5lcmF0ZXMgYSBTZXQgT25jZSB3YXZlZm9ybSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09VVFBVVF9QT0xBUklUWSBPdXRwdXQgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8VGhlIExQVElNIG91dHB1dCByZWZsZWN0cyB0aGUgY29tcGFyZSByZXN1bHRzIGJldHdlZW4gTFBUSU14X0FSUiBhbmQgTFBUSU14X0NNUCByZWdpc3RlcnMqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRSAgICAgIExQVElNX0NGR1JfV0FWUE9MICAgICAgICAvKiE8VGhlIExQVElNIG91dHB1dCByZWZsZWN0cyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcGFyZSByZXN1bHRzIGJldHdlZW4gTFBUSU14X0FSUiBhbmQgTFBUSU14X0NNUCByZWdpc3RlcnMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19QUkVTQ0FMRVIgUHJlc2NhbGVyIFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gMSovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18wICAgICAgICAgICAgICAgICAgICAgICAgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDIqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byA0Ki8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18xIHwgTFBUSU1fQ0ZHUl9QUkVTQ18wKSAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gOCovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxNiAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18yICAgICAgICAgICAgICAgICAgICAgICAgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDE2Ki8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjMyICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18yIHwgTFBUSU1fQ0ZHUl9QUkVTQ18wKSAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gMzIqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzIgfCBMUFRJTV9DRkdSX1BSRVNDXzEpIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byA2NCovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxMjggICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDEyOCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfU09VUkNFIFRyaWdnZXIgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfR1BJTyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFRJTXhfRVRSIGlucHV0Ki8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBBbGFybSBBKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBBbGFybSBCKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzEgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMCkgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMSovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAyICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDIqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMSAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMiB8IExQVElNX0NGR1JfVFJJR1NFTF8xKSAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0Ki8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDIgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfRklMVEVSIFRyaWdnZXIgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8QW55IHRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzIgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMCAgICAgLyohPFRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgMiBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyaWdnZXIqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX0ZJTFRFUl80ICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJHRkxUXzEgICAgIC8qITxUcmlnZ2VyIGFjdGl2ZSBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDQgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmlnZ2VyKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfOCAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSR0ZMVCAgICAgICAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfUE9MQVJJVFkgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU5fMCAgICAvKiE8TFBUSU0gY291bnRlciBzdGFydHMgd2hlbiBhIHJpc2luZyBlZGdlIGlzIGRldGVjdGVkKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8xICAgIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORyBMUFRJTV9DRkdSX1RSSUdFTiAgICAgIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgcmlzaW5nIG9yIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ0xLX1NPVVJDRSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxMUFRJTSBpcyBjbG9ja2VkIGJ5IGludGVybmFsIGNsb2NrIHNvdXJjZSAoQVBCIGNsb2NrIG9yIGFueSBvZiB0aGUgZW1iZWRkZWQgb3NjaWxsYXRvcnMpKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTCAgICAgICAgICBMUFRJTV9DRkdSX0NLU0VMICAgICAgICAvKiE8TFBUSU0gaXMgY2xvY2tlZCBieSBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UgdGhyb3VnaCB0aGUgTFBUSU0gZXh0ZXJuYWwgSW5wdXQxKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ0xLX0ZJTFRFUiBDbG9jayBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxBbnkgZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfMiAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wICAgICAgLyohPEV4dGVybmFsIGNsb2NrIHNpZ25hbCBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDIgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmFuc2l0aW9uKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX0ZJTFRFUl80ICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX0NLRkxUXzEgICAgICAvKiE8RXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgNCBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyYW5zaXRpb24qLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSXzggICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tGTFQgICAgICAgIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0NMS19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUaGUgcmlzaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICBMUFRJTV9DRkdSX0NLUE9MXzAgICAgICAvKiE8IFRoZSBmYWxsaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICBMUFRJTV9DRkdSX0NLUE9MXzEgICAgICAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0VOQ09ERVJfTU9ERSBFbmNvZGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9FTkNPREVSX01PREVfUklTSU5HICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgVGhlIHJpc2luZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9GQUxMSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8wICAgICAgLyohPCBUaGUgZmFsbGluZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORyAgTFBUSU1fQ0ZHUl9DS1BPTF8xICAgICAgLyohPCBCb3RoIGVkZ2VzIGFyZSBhY3RpdmUgZWRnZXMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FQ19JTlBVVDFfU1JDIElucHV0MSBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9JTlBVVDFfU1JDX0dQSU8gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0xIGFuZCBMUFRJTTIgKi8KKyNkZWZpbmUgTExfTFBUSU1fSU5QVVQxX1NSQ19DT01QMSAgICAgICAgTFBUSU1fQ0ZHUjJfSU4xU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIExQVElNMSBhbmQgTFBUSU0yICovCisjZGVmaW5lIExMX0xQVElNX0lOUFVUMV9TUkNfQ09NUDIgICAgICAgIExQVElNX0NGR1IyX0lOMVNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZvciBMUFRJTTIgKi8KKyNkZWZpbmUgTExfTFBUSU1fSU5QVVQxX1NSQ19DT01QMV9DT01QMiAgKExQVElNX0NGR1IyX0lOMVNFTF8xIHwgTFBUSU1fQ0ZHUjJfSU4xU0VMXzApIC8qITwgRm9yIExQVElNMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FQ19JTlBVVDJfU1JDIElucHV0MiBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9JTlBVVDJfU1JDX0dQSU8gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEZvciBMUFRJTTEgKi8KKyNkZWZpbmUgTExfTFBUSU1fSU5QVVQyX1NSQ19DT01QMiAgICAgICAgTFBUSU1fQ0ZHUjJfSU4yU0VMXzAgICAgLyohPCBGb3IgTFBUSU0xICovCisvKioKKyAgKiBAfQorICAqLworICAKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIExQVElNIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBMUFRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9MUFRJTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIExQVElNIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gTFBUSU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfTFBUSU1fQ29uZmlndXJhdGlvbiBMUFRJTSBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIExQVElNIGluc3RhbmNlCisgICogQG5vdGUgQWZ0ZXIgc2V0dGluZyB0aGUgRU5BQkxFIGJpdCwgYSBkZWxheSBvZiB0d28gY291bnRlciBjbG9jayBpcyBuZWVkZWQKKyAgKiAgICAgICBiZWZvcmUgdGhlIExQVElNIGluc3RhbmNlIGlzIGFjdHVhbGx5IGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU5BQkxFICAgICAgICBMTF9MUFRJTV9FbmFibGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfRU5BQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBMUFRJTSBpbnN0YW5jZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPkNSLCBMUFRJTV9DUl9FTkFCTEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX0VOQUJMRSkgPT0gTFBUSU1fQ1JfRU5BQkxFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBMUFRJTSBjb3VudGVyIGluIHRoZSBkZXNpcmVkIG1vZGUuCisgICogQG5vdGUgTFBUSU0gaW5zdGFuY2UgbXVzdCBiZSBlbmFibGVkIGJlZm9yZSBzdGFydGluZyB0aGUgY291bnRlci4KKyAgKiBAbm90ZSBJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2Ugb24gdGhlIGZseSBmcm9tIE9uZSBTaG90IG1vZGUgdG8KKyAgKiAgICAgICBDb250aW51b3VzIG1vZGUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ05UU1RSVCAgICAgICBMTF9MUFRJTV9TdGFydENvdW50ZXJcbgorICAqICAgICAgICAgQ1IgICAgICAgICAgIFNOR1NUUlQgICAgICAgTExfTFBUSU1fU3RhcnRDb3VudGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPcGVyYXRpbmdNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfQ09OVElOVU9VUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09QRVJBVElOR19NT0RFX09ORVNIT1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1N0YXJ0Q291bnRlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IE9wZXJhdGluZ01vZGUpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DUiwgTFBUSU1fQ1JfQ05UU1RSVCB8IExQVElNX0NSX1NOR1NUUlQsIE9wZXJhdGluZ01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByZXNldCBhZnRlciByZWFkLgorICAqIEBub3RlIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbnkgcmVhZCBhY2Nlc3MgdG8gTFBUSU1fQ05UCisgICogICAgICAgIHJlZ2lzdGVyIHdpbGwgYXN5bmNocm9ub3VzbHkgcmVzZXQgdGhlIExQVElNX0NOVCByZWdpc3RlciBjb250ZW50LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJTVEFSRSAgICAgICAgTExfTFBUSU1fRW5hYmxlUmVzZXRBZnRlclJlYWQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZVJlc2V0QWZ0ZXJSZWFkKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPkNSLCBMUFRJTV9DUl9SU1RBUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmVzZXQgYWZ0ZXIgcmVhZC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSU1RBUkUgICAgICAgIExMX0xQVElNX0Rpc2FibGVSZXNldEFmdGVyUmVhZAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZVJlc2V0QWZ0ZXJSZWFkKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX1JTVEFSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgcmVzZXQgYWZ0ZXIgcmVhZCBmZWF0dXJlIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUlNUQVJFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRSZXNldEFmdGVyUmVhZAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZFJlc2V0QWZ0ZXJSZWFkKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX1JTVEFSRSkgPT0gTFBUSU1fQ1JfUlNUQVJFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgb2YgdGhlIExQVElNX0NOVCBjb3VudGVyIHJlZ2lzdGVyIChzeW5jaHJvbm91cykuCisgICogQG5vdGUgRHVlIHRvIHRoZSBzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhpcyByZXNldCwgaXQgb25seSB0YWtlcworICAqICAgICAgIHBsYWNlIGFmdGVyIGEgc3luY2hyb25pemF0aW9uIGRlbGF5IG9mIDMgTFBUSU0gY29yZSBjbG9jayBjeWNsZXMKKyAgKiAgICAgIChMUFRJTSBjb3JlIGNsb2NrIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBBUEIgY2xvY2spLgorICAqIEBub3RlIENPVU5UUlNUIGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBieSBoYXJkd2FyZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENPVU5UUlNUICAgICAgIExMX0xQVElNX1Jlc2V0Q291bnRlclxuCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9SZXNldENvdW50ZXIoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX0NPVU5UUlNUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIExQVElNIHJlZ2lzdGVycyB1cGRhdGUgbW9kZSAoZW5hYmxlL2Rpc2FibGUgcmVnaXN0ZXIgcHJlbG9hZCkKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBSRUxPQUQgICAgICAgTExfTFBUSU1fU2V0VXBkYXRlTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVXBkYXRlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1VQREFURV9NT0RFX0lNTUVESUFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1VQREFURV9NT0RFX0VORE9GUEVSSU9ECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRVcGRhdGVNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgVXBkYXRlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfUFJFTE9BRCwgVXBkYXRlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBMUFRJTSByZWdpc3RlcnMgdXBkYXRlIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUkVMT0FEICAgICAgIExMX0xQVElNX0dldFVwZGF0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVVBEQVRFX01PREVfSU1NRURJQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVVBEQVRFX01PREVfRU5ET0ZQRVJJT0QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRVcGRhdGVNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1BSRUxPQUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGF1dG8gcmVsb2FkIHZhbHVlCisgICogQG5vdGUgVGhlIExQVElNeF9BUlIgcmVnaXN0ZXIgY29udGVudCBtdXN0IG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGUgTFBUSU0gaXMgZW5hYmxlZAorICAqIEBub3RlIEFmdGVyIGEgd3JpdGUgdG8gdGhlIExQVElNeF9BUlIgcmVnaXN0ZXIgYSBuZXcgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZQorICAqICAgICAgIHNhbWUgcmVnaXN0ZXIgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHByZXZpb3VzIHdyaXRlIG9wZXJhdGlvbgorICAqICAgICAgIGlzIGNvbXBsZXRlZC4gQW55IHN1Y2Nlc3NpdmUgd3JpdGUgYmVmb3JlICB0aGUgQVJST0sgZmxhZyBiZSBzZXQsIHdpbGwKKyAgKiAgICAgICBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0cy4KKyAgKiBAbm90ZSBhdXRvcmVsb2FkIHZhbHVlIGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX0xQVElNX1NldEF1dG9SZWxvYWQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEF1dG9SZWxvYWQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldEF1dG9SZWxvYWQoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBBdXRvUmVsb2FkKQoreworICBNT0RJRllfUkVHKExQVElNeC0+QVJSLCBMUFRJTV9BUlJfQVJSLCBBdXRvUmVsb2FkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGF1dG8gcmVsb2FkIHZhbHVlCisgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9MUFRJTV9HZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBdXRvUmVsb2FkIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0QXV0b1JlbG9hZChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+QVJSLCBMUFRJTV9BUlJfQVJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb21wYXJlIHZhbHVlCisgICogQG5vdGUgQWZ0ZXIgYSB3cml0ZSB0byB0aGUgTFBUSU14X0NNUCByZWdpc3RlciBhIG5ldyB3cml0ZSBvcGVyYXRpb24gdG8gdGhlCisgICogICAgICAgc2FtZSByZWdpc3RlciBjYW4gb25seSBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcHJldmlvdXMgd3JpdGUgb3BlcmF0aW9uCisgICogICAgICAgaXMgY29tcGxldGVkLiBBbnkgc3VjY2Vzc2l2ZSB3cml0ZSBiZWZvcmUgdGhlIENNUE9LIGZsYWcgYmUgc2V0LCB3aWxsCisgICogICAgICAgbGVhZCB0byB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCisgICogQHJtdG9sbCBDTVAgICAgICAgICAgQ01QICAgICAgICAgICBMTF9MUFRJTV9TZXRDb21wYXJlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldENvbXBhcmUoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DTVAsIExQVElNX0NNUF9DTVAsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjb21wYXJlIHZhbHVlCisgICogQHJtdG9sbCBDTVAgICAgICAgICAgQ01QICAgICAgICAgICBMTF9MUFRJTV9HZXRDb21wYXJlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRDb21wYXJlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DTVAsIExQVElNX0NNUF9DTVApKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGNvdW50ZXIgdmFsdWUKKyAgKiBAbm90ZSBXaGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBydW5uaW5nIHdpdGggYW4gYXN5bmNocm9ub3VzIGNsb2NrLCByZWFkaW5nCisgICogICAgICAgdGhlIExQVElNeF9DTlQgcmVnaXN0ZXIgbWF5IHJldHVybiB1bnJlbGlhYmxlIHZhbHVlcy4gU28gaW4gdGhpcyBjYXNlCisgICogICAgICAgaXQgaXMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdHdvIGNvbnNlY3V0aXZlIHJlYWQgYWNjZXNzZXMgYW5kIHZlcmlmeQorICAqICAgICAgIHRoYXQgdGhlIHR3byByZXR1cm5lZCB2YWx1ZXMgYXJlIGlkZW50aWNhbC4KKyAgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX0xQVElNX0dldENvdW50ZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRDb3VudGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DTlQsIExQVElNX0NOVF9DTlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvdW50ZXIgbW9kZSAoc2VsZWN0aW9uIG9mIHRoZSBMUFRJTSBjb3VudGVyIGNsb2NrIHNvdXJjZSkuCisgICogQG5vdGUgVGhlIGNvdW50ZXIgbW9kZSBjYW4gYmUgc2V0IG9ubHkgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgQ09VTlRNT0RFICAgICBMTF9MUFRJTV9TZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DT1VOVEVSX01PREVfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DT1VOVEVSX01PREVfRVhURVJOQUwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldENvdW50ZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgQ291bnRlck1vZGUpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NPVU5UTU9ERSwgQ291bnRlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY291bnRlciBtb2RlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgQ09VTlRNT0RFICAgICBMTF9MUFRJTV9HZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DT1VOVEVSX01PREVfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DT1VOVEVSX01PREVfRVhURVJOQUwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRDb3VudGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DT1VOVE1PREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIExQVElNIGluc3RhbmNlIG91dHB1dCAoTFBUSU14X09VVCkKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIFJlZ2FyZGluZyB0aGUgTFBUSU0gb3V0cHV0IHBvbGFyaXR5IHRoZSBjaGFuZ2UgdGFrZXMgZWZmZWN0CisgICogICAgICAgaW1tZWRpYXRlbHksIHNvIHRoZSBvdXRwdXQgZGVmYXVsdCB2YWx1ZSB3aWxsIGNoYW5nZSBpbW1lZGlhdGVseSBhZnRlcgorICAqICAgICAgIHRoZSBwb2xhcml0eSBpcyByZS1jb25maWd1cmVkLCBldmVuIGJlZm9yZSB0aGUgdGltZXIgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBXQVZFICAgICAgICAgIExMX0xQVElNX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDRkdSICAgICAgICAgV0FWUE9MICAgICAgICBMTF9MUFRJTV9Db25maWdPdXRwdXQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdhdmVmb3JtIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1BXTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NvbmZpZ091dHB1dChMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFdhdmVmb3JtLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfV0FWRSB8IExQVElNX0NGR1JfV0FWUE9MLCBXYXZlZm9ybSB8IFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgIHdhdmVmb3JtIHNoYXBlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgV0FWRSAgICAgICAgICBMTF9MUFRJTV9TZXRXYXZlZm9ybQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgV2F2ZWZvcm0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1NFVE9OQ0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldFdhdmVmb3JtKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgV2F2ZWZvcm0pCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1dBVkUsIFdhdmVmb3JtKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIHdhdmVmb3JtIHNoYXBlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgV0FWRSAgICAgICAgICBMTF9MUFRJTV9HZXRXYXZlZm9ybQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1NFVE9OQ0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRXYXZlZm9ybShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9XQVZFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0ICBvdXRwdXQgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBXQVZQT0wgICAgICAgIExMX0xQVElNX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldFBvbGFyaXR5KExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1dBVlBPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb3V0cHV0IHBvbGFyaXR5CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgV0FWUE9MICAgICAgICBMTF9MUFRJTV9HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0UG9sYXJpdHkoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfV0FWUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGFjdHVhbCBwcmVzY2FsZXIgZGl2aXNpb24gcmF0aW8uCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSBXaGVuIHRoZSBMUFRJTSBpcyBjb25maWd1cmVkIHRvIGJlIGNsb2NrZWQgYnkgYW4gaW50ZXJuYWwgY2xvY2sgc291cmNlCisgICogICAgICAgYW5kIHRoZSBMUFRJTSBjb3VudGVyIGlzIGNvbmZpZ3VyZWQgdG8gYmUgdXBkYXRlZCBieSBhY3RpdmUgZWRnZXMKKyAgKiAgICAgICBkZXRlY3RlZCBvbiB0aGUgTFBUSU0gZXh0ZXJuYWwgSW5wdXQxLCB0aGUgaW50ZXJuYWwgY2xvY2sgcHJvdmlkZWQgdG8KKyAgKiAgICAgICB0aGUgTFBUSU0gbXVzdCBiZSBub3QgYmUgcHJlc2NhbGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBSRVNDICAgICAgICAgTExfTFBUSU1fU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldFByZXNjYWxlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfUFJFU0MsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBwcmVzY2FsZXIgZGl2aXNpb24gcmF0aW8uCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFJFU0MgICAgICAgICBMTF9MUFRJTV9HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTI4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0UHJlc2NhbGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1BSRVNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExQVElNIGlucHV0IDEgc291cmNlIChkZWZhdWx0IEdQSU8pLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgICBJTjFTRUwgICAgICAgTExfTFBUSU1fU2V0SW5wdXQxU3JjCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9JTlBVVDFfU1JDX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9JTlBVVDFfU1JDX0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fSU5QVVQxX1NSQ19DT01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0lOUFVUMV9TUkNfQ09NUDFfQ09NUDIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldElucHV0MVNyYyhMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFNyYykKK3sKKyAgV1JJVEVfUkVHKExQVElNeC0+Q0ZHUjIsIFNyYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExQVElNIGlucHV0IDIgc291cmNlIChkZWZhdWx0IEdQSU8pLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgICBJTjJTRUwgICAgICAgTExfTFBUSU1fU2V0SW5wdXQyU3JjCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTcmMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9JTlBVVDJfU1JDX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9JTlBVVDJfU1JDX0NPTVAyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRJbnB1dDJTcmMoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBTcmMpCit7CisgIFdSSVRFX1JFRyhMUFRJTXgtPkNGR1IyLCBTcmMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX1RyaWdnZXJfQ29uZmlndXJhdGlvbiBUcmlnZ2VyIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlIHRyaWdnZXIKKyAgKiAgICAgICBldmVudCB3aWxsIHJlc2V0IHRoZSBjb3VudGVyIGFuZCB0aGUgdGltZXIgd2lsbCByZXN0YXJ0LgorICAqIEBub3RlIFRoZSB0aW1lb3V0IHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBjb21wYXJlIHZhbHVlOyBpZiBubyB0cmlnZ2VyCisgICogICAgICAgb2NjdXJzIHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBmcmFtZSwgdGhlIE1DVSBpcyB3YWtlZC11cCBieSB0aGUKKyAgKiAgICAgICBjb21wYXJlIG1hdGNoIGV2ZW50LgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRJTU9VVCAgICAgICAgTExfTFBUSU1fRW5hYmxlVGltZW91dAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RJTU9VVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgQSB0cmlnZ2VyIGV2ZW50IGFycml2aW5nIHdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkgc3RhcnRlZCB3aWxsIGJlCisgICogICAgICAgaWdub3JlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUSU1PVVQgICAgICAgIExMX0xQVElNX0Rpc2FibGVUaW1lb3V0CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVElNT1VUKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVElNT1VUICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRUaW1lb3V0CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVElNT1VUKSA9PSBMUFRJTV9DRkdSX1RJTU9VVCk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBjb3VudGVyCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUUklHRU4gICAgICAgIExMX0xQVElNX1RyaWdTdworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fVHJpZ1N3KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9UUklHRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciB1c2VkIGFzIGEgdHJpZ2dlciBldmVudCBmb3IgdGhlIExQVElNLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgQW4gaW50ZXJuYWwgY2xvY2sgc291cmNlIG11c3QgYmUgcHJlc2VudCB3aGVuIGEgZGlnaXRhbCBmaWx0ZXIgaXMKKyAgKiAgICAgICByZXF1aXJlZCBmb3IgdGhlIHRyaWdnZXIuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJJR1NFTCAgICAgICBMTF9MUFRJTV9Db25maWdUcmlnZ2VyXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBUUkdGTFQgICAgICAgIExMX0xQVElNX0NvbmZpZ1RyaWdnZXJcbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFRSSUdFTiAgICAgICAgTExfTFBUSU1fQ29uZmlnVHJpZ2dlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfR1BJTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ0FMQVJNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ0FMQVJNQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyCisgICogQHBhcmFtICBGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl84CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnVHJpZ2dlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgRmlsdGVyLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR1NFTCB8IExQVElNX0NGR1JfVFJHRkxUIHwgTFBUSU1fQ0ZHUl9UUklHRU4sIFNvdXJjZSB8IEZpbHRlciB8IFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgc291cmNlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSSUdTRUwgICAgICAgTExfTFBUSU1fR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRUcmlnZ2VyU291cmNlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RSSUdTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgZmlsdGVyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSR0ZMVCAgICAgICAgTExfTFBUSU1fR2V0VHJpZ2dlckZpbHRlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0VHJpZ2dlckZpbHRlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9UUkdGTFQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJJR0VOICAgICAgICBMTF9MUFRJTV9HZXRUcmlnZ2VyUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0VHJpZ2dlclBvbGFyaXR5KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RSSUdFTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX0Nsb2NrX0NvbmZpZ3VyYXRpb24gQ2xvY2sgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGNsb2NrIHVzZWQgYnkgdGhlIExQVElNIGluc3RhbmNlLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgQ0tTRUwgICAgICAgICBMTF9MUFRJTV9TZXRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0Q2xvY2tTb3VyY2UoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDbG9ja1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tTRUwsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIExQVElNIGluc3RhbmNlIGNsb2NrIHNvdXJjZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1NFTCAgICAgICAgIExMX0xQVElNX0dldENsb2NrU291cmNlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q2xvY2tTb3VyY2UoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFjdGl2ZSBlZGdlIG9yIGVkZ2VzIHVzZWQgYnkgdGhlIGNvdW50ZXIgd2hlbiB0aGUgTFBUSU0gaXMgY2xvY2tlZCBieSBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSBXaGVuIGJvdGggZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGVkZ2VzIGFyZSBjb25zaWRlcmVkIGFjdGl2ZSBvbmVzLAorICAqICAgICAgIHRoZSBMUFRJTSBtdXN0IGFsc28gYmUgY2xvY2tlZCBieSBhbiBpbnRlcm5hbCBjbG9jayBzb3VyY2Ugd2l0aCBhCisgICogICAgICAgZnJlcXVlbmN5IGVxdWFsIHRvIGF0IGxlYXN0IGZvdXIgdGltZXMgdGhlIGV4dGVybmFsIGNsb2NrIGZyZXF1ZW5jeS4KKyAgKiBAbm90ZSBBbiBpbnRlcm5hbCBjbG9jayBzb3VyY2UgbXVzdCBiZSBwcmVzZW50IHdoZW4gYSBkaWdpdGFsIGZpbHRlciBpcworICAqICAgICAgIHJlcXVpcmVkIGZvciBleHRlcm5hbCBjbG9jay4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS0ZMVCAgICAgICAgIExMX0xQVElNX0NvbmZpZ0Nsb2NrXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0NvbmZpZ0Nsb2NrCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfOAorICAqIEBwYXJhbSAgQ2xvY2tQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnQ2xvY2soTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDbG9ja0ZpbHRlciwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tGTFQgfCBMUFRJTV9DRkdSX0NLUE9MLCBDbG9ja0ZpbHRlciB8IENsb2NrUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0dldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q2xvY2tQb2xhcml0eShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY2xvY2sgZGlnaXRhbCBmaWx0ZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS0ZMVCAgICAgICAgIExMX0xQVElNX0dldENsb2NrRmlsdGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19GSUxURVJfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldENsb2NrRmlsdGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NLRkxUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfRW5jb2Rlcl9Nb2RlIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBlbmNvZGVyIG1vZGUuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX1NldEVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFbmNvZGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9FTkNPREVSX01PREVfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0RW5jb2Rlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBFbmNvZGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tQT0wsIEVuY29kZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1BPTCAgICAgICAgIExMX0xQVElNX0dldEVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9FTkNPREVSX01PREVfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldEVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBlbmNvZGVyIG1vZGUKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIEluIHRoaXMgbW9kZSB0aGUgTFBUSU0gaW5zdGFuY2UgbXVzdCBiZSBjbG9ja2VkIGJ5IGFuIGludGVybmFsIGNsb2NrCisgICogICAgICAgc291cmNlLiBBbHNvLCB0aGUgcHJlc2NhbGVyIGRpdmlzaW9uIHJhdGlvIG11c3QgYmUgZXF1YWwgdG8gMS4KKyAgKiBAbm90ZSBMUFRJTSBpbnN0YW5jZSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gY29udGludW91cyBtb2RlIHByaW9yIGVuYWJsaW5nCisgICogICAgICAgdGhlIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBFTkMgICAgICAgICAgIExMX0xQVElNX0VuYWJsZUVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVFbmNvZGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0VOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZW5jb2RlciBtb2RlCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBFTkMgICAgICAgICAgIExMX0xQVElNX0Rpc2FibGVFbmNvZGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9FTkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBMUFRJTSBvcGVyYXRlcyBpbiBlbmNvZGVyIG1vZGUuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgRU5DICAgICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRFbmNvZGVyTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZEVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9FTkMpID09IExQVElNX0NGR1JfRU5DKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbXBhcmUgbWF0Y2ggZmxhZyAoQ01QTUNGKQorICAqIEBybXRvbGwgSUNSICAgICAgICAgIENNUE1DRiAgICAgICAgTExfTFBUSU1fQ2xlYXJGTEFHX0NNUE0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRkxBR19DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0NNUE1DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtIGFwcGxpY2F0aW9uIHdoZXRoZXIgYSBjb21wYXJlIG1hdGNoIGludGVycnVwdCBoYXMgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01QTSAgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQ01QTSkgPT0gTFBUSU1fSVNSX0NNUE0pPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgYXV0b3JlbG9hZCBtYXRjaCBmbGFnIChBUlJNQ0YpCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQVJSTUNGICAgICAgICBMTF9MUFRJTV9DbGVhckZMQUdfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGTEFHX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfQVJSTUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm0gYXBwbGljYXRpb24gd2hldGhlciBhIGF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBUlJNICAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19BUlJNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9BUlJNKSA9PSBMUFRJTV9JU1JfQVJSTSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBleHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgZmxhZyhFWFRUUklHQ0YpLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEVYVFRSSUdDRiAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX0VYVFRSSUcKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRmxhZ19FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0VYVFRSSUdDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtIGFwcGxpY2F0aW9uIHdoZXRoZXIgYSB2YWxpZCBlZGdlIG9uIHRoZSBzZWxlY3RlZCBleHRlcm5hbCB0cmlnZ2VyIGlucHV0IGhhcyBvY2N1cnJlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBFWFRUUklHICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19FWFRUUklHCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0VYVFRSSUcoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9FWFRUUklHKSA9PSBMUFRJTV9JU1JfRVhUVFJJRyk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoQ01QT0tDRikuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01QT0tDRiAgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfQ01QT0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRmxhZ19DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9DTVBPS0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm1zIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIEFQQiBidXMgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTXhfQ01QIHJlZ2lzdGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuIElmIHNvLCBhIG5ldyBvbmUgY2FuIGJlIGluaXRpYXRlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTVBPSyAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0NNUE9LKSA9PSBMUFRJTV9JU1JfQ01QT0spPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKEFSUk9LQ0YpLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFSUk9LQ0YgICAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX0FSUk9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZsYWdfQVJST0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfQVJST0tDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtcyBhcHBsaWNhdGlvbiB3aGV0aGVyIHRoZSBBUEIgYnVzIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU14X0FSUiByZWdpc3RlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBJZiBzbywgYSBuZXcgb25lIGNhbiBiZSBpbml0aWF0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQVJST0sgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQVJST0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQVJST0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9BUlJPSykgPT0gTFBUSU1fSVNSX0FSUk9LKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB0byB1cCBpbnRlcnJ1cHQgZmxhZyAoVVBDRikuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVVBDRiAgICAgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfVVAKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRmxhZ19VUChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9VUENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiB3aGV0aGVyIHRoZSBjb3VudGVyIGRpcmVjdGlvbiBoYXMgY2hhbmdlZCBmcm9tIGRvd24gdG8gdXAgKHdoZW4gdGhlIExQVElNIGluc3RhbmNlIG9wZXJhdGVzIGluIGVuY29kZXIgbW9kZSkuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVVAgICAgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfVVAKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9VUCkgPT0gTFBUSU1fSVNSX1VQKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB0byBkb3duIGludGVycnVwdCBmbGFnIChET1dOQ0YpLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIERPV05DRiAgICAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX0RPV04KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0NsZWFyRmxhZ19ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0RPV05DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtcyB0aGUgYXBwbGljYXRpb24gd2hldGhlciB0aGUgY291bnRlciBkaXJlY3Rpb24gaGFzIGNoYW5nZWQgZnJvbSB1cCB0byBkb3duICh3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBvcGVyYXRlcyBpbiBlbmNvZGVyIG1vZGUpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIERPV04gICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0RPV04KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfRE9XTihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0RPV04pID09IExQVElNX0lTUl9ET1dOKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbXBhcmUgbWF0Y2ggaW50ZXJydXB0IChDTVBNSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE1JRSAgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfQ01QTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKENNUE1JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QTUlFICAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21wYXJlIG1hdGNoIGludGVycnVwdCAoQ01QTUlFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE1JRSAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBNSUUpID09IExQVElNX0lFUl9DTVBNSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKEFSUk1JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJSTUlFICAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9BUlJNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9BUlJNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk1JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAoQVJSTUlFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJNSUUgICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9BUlJNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfQVJSTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk1JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0IChBUlJNSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJSTUlFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9BUlJNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfQVJSTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk1JRSkgPT0gTFBUSU1fSUVSX0FSUk1JRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgaW50ZXJydXB0IChFWFRUUklHSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEVYVFRSSUdJRSAgICAgTExfTFBUSU1fRW5hYmxlSVRfRVhUVFJJRworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9FWFRUUklHSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciB2YWxpZCBlZGdlIGludGVycnVwdCAoRVhUVFJJR0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBFWFRUUklHSUUgICAgIExMX0xQVElNX0Rpc2FibGVJVF9FWFRUUklHCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0VYVFRSSUdJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIGV4dGVybmFsIHRyaWdnZXIgdmFsaWQgZWRnZSBpbnRlcnJ1cHQgKEVYVFRSSUdJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBFWFRUUklHSUUgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0VYVFRSSUcKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRVhUVFJJR0lFKSA9PSBMUFRJTV9JRVJfRVhUVFJJR0lFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQ01QT0tJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQ01QT0tJRSAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9DTVBPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfQ01QT0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QT0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKENNUE9LSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE9LSUUgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0NNUE9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfQ01QT0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChDTVBPS0lFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE9LSUUgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfQ01QT0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE9LSUUpID09IExQVElNX0lFUl9DTVBPS0lFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQVJST0tJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJST0tJRSAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9BUlJPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfQVJST0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJST0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKEFSUk9LSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk9LSUUgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0FSUk9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfQVJST0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChBUlJPS0lFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk9LSUUgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfQVJST0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9BUlJPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk9LSUUpID09IExQVElNX0lFUl9BUlJPS0lFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gdXAgaW50ZXJydXB0IChVUElFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBVUElFICAgICAgICAgIExMX0xQVElNX0VuYWJsZUlUX1VQCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9VUChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9VUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gdXAgaW50ZXJydXB0IChVUElFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBVUElFICAgICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9VUAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX1VQKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfVVBJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gdXAgaW50ZXJydXB0IChVUElFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIFVQSUUgICAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfVVAKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9VUChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX1VQSUUpID09IExQVElNX0lFUl9VUElFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBpbnRlcnJ1cHQgKERPV05JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRE9XTklFICAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9ET1dOCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGVJVF9ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0RPV05JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBkaXJlY3Rpb24gY2hhbmdlIHRvIGRvd24gaW50ZXJydXB0IChET1dOSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIERPV05JRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0RPV04KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRE9XTklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlyZWN0aW9uIGNoYW5nZSB0byBkb3duIGludGVycnVwdCAoRE9XTklFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIERPV05JRSAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfRE9XTgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0RPV04oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9ET1dOSUUpID09IExQVElNX0lFUl9ET1dOSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmICpMUFRJTXgpOwordm9pZCBMTF9MUFRJTV9TdHJ1Y3RJbml0KExMX0xQVElNX0luaXRUeXBlRGVmICpMUFRJTV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX0xQVElNX0luaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14LCBMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBUSU0xIHx8IExQVElNMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX0xQVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfbHB1YXJ0LmggYi9JbmMvc3RtMzJnMHh4X2xsX2xwdWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWJmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX2xwdWFydC5oCkBAIC0wLDAgKzEsMjYzMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9scHVhcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTFBVQVJUIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfTFBVQVJUX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX0xQVUFSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBVQVJUMSkKKworLyoqIEBkZWZncm91cCBMUFVBUlRfTEwgTFBVQVJUCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBMUFVBUlQgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIExQVUFSVCBwcmVzY2FsZXIgZGl2aXNpb24gZGVjaW1hbCB2YWx1ZXMgdmVyc3VzIEByZWYgTFBVQVJUX0xMX0VDX1BSRVNDQUxFUiB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBMUFVBUlRfUFJFU0NBTEVSX1RBQltdID0KK3sKKyAgKHVpbnQxNl90KTEsCisgICh1aW50MTZfdCkyLAorICAodWludDE2X3QpNCwKKyAgKHVpbnQxNl90KTYsCisgICh1aW50MTZfdCk4LAorICAodWludDE2X3QpMTAsCisgICh1aW50MTZfdCkxMiwKKyAgKHVpbnQxNl90KTE2LAorICAodWludDE2X3QpMzIsCisgICh1aW50MTZfdCk2NCwKKyAgKHVpbnQxNl90KTEyOCwKKyAgKHVpbnQxNl90KTI1NgorfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBMUFVBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogRGVmaW5lcyB1c2VkIGluIEJhdWQgUmF0ZSByZWxhdGVkIG1hY3JvcyBhbmQgY29ycmVzcG9uZGluZyByZWdpc3RlciBzZXR0aW5nIGNvbXB1dGF0aW9uICovCisjZGVmaW5lIExQVUFSVF9MUFVBUlRESVZfRlJFUV9NVUwgICAgIDI1NlUKKyNkZWZpbmUgTFBVQVJUX0JSUl9NQVNLICAgICAgICAgICAgICAgMHgwMDBGRkZGRlUKKyNkZWZpbmUgTFBVQVJUX0JSUl9NSU5fVkFMVUUgICAgICAgICAgMHgwMDAwMDMwMFUKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfTWFjcm9zIExQVUFSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VTX0lOSVQgTFBVQVJUIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBMTCBMUFVBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFByZXNjYWxlciB0byBjb21wdXRlIHRoZSBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVUFSVF9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIExQVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldERhdGFXaWR0aCgpLiovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpLiovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX1BBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RJUkVDVElPTi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sOyAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoKS4qLworCit9IExMX0xQVUFSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBMUFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX05DRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9ORUNGICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAgICAgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1RYRkVDRiAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UWEZFQ0YgICAgICAgICAgICAgIC8qITwgVFggRklGTyBFbXB0eSBDbGVhciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX0NUU0NGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9DTUNGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVUFSVF9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9QRSAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfRkUgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgICAgICAgLyohPCBGcmFtaW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9ORSAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9PUkUgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0lETEUgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgICAgICAgIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9SWE5FX1JYRk5FICAgICAgICAgICBVU0FSVF9JU1JfUlhORV9SWEZORSAgICAgICAgICAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBvciBSWCBGSUZPIG5vdCBlbXB0eSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBvciBUWCBGSUZPIE5vdCBGdWxsIGZsYWcqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0NUU0lGICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFNJRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ1RTICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgLyohPCBDVFMgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0JVU1kgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgICAgICAgIC8qITwgQnVzeSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ01GICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgIC8qITwgU2VuZCBicmVhayBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUldVICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1dVRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGRSAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRkUgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9SWEZGICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhGVCAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRlQgICAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGVCAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRlQgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfUmVhZFJlZyBhbmQgIExMX0xQVUFSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgIFVTQVJUX0NSMV9JRExFSUUgICAgICAgICAgICAgIC8qITwgSURMRSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhORUlFX1JYRk5FSUUgICAgICAgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFICAgICAgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgYW5kIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RDSUUgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgICBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgYW5kIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1BFSUUgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QRUlFICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfQ01JRSAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RYRkVJRSAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEZFSUUgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhGRklFICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JYRkZJRSAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19FSUUgICAgICAgICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IzX0NUU0lFICAgICAgICAgICAgICAgIFVTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgIC8qITwgQ1RTIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfVFhGVElFICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1RYRlRJRSAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfUlhGVElFICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1JYRlRJRSAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19GSUZPVEhSRVNIT0xEIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84ICAgICAgICAweDAwMDAwMDAwVSAvKiE8IEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNCAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180ICAgICAgICAweDAwMDAwMDAzVSAvKiE8IEZJRk8gcmVhY2hlcyAzLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOCAgICAgICAgMHgwMDAwMDAwNFUgLyohPCBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzggICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRklGTyBiZWNvbWVzIGVtcHR5IGZvciBUWCBhbmQgZnVsbCBmb3IgUlggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RJUkVDVElPTiBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fUlggICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFggICAgICAgICAgICAgVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlggICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUEFSSVRZIFBhcml0eSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfV0FLRVVQIFdha2V1cAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBMUFVBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSyAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgICAgICAgICAgICAgIC8qITwgIExQVUFSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIgICAgICAgICAgICAgVVNBUlRfQ1IxX00wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19QUkVTQ0FMRVIgQ2xvY2sgU291cmNlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBub3QgZGV2aWRlZCAgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDIgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDQgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNiAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDYgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDggICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEwICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4ICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1NiAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMyB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAyNTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9TVE9QQklUU18xICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgIC8qITwgMiBzdG9wIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1RYUlggVFggUlggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFgvUlggcGlucyBhcmUgdXNlZCBhcyBkZWZpbmVkIGluIHN0YW5kYXJkIHBpbm91dCAqLworI2RlZmluZSBMTF9MUFVBUlRfVFhSWF9TV0FQUEVEICAgICAgICAgICAgIChVU0FSVF9DUjJfU1dBUCkgICAgICAgICAgICAgICAgICAgLyohPCBUWCBhbmQgUlggcGlucyBmdW5jdGlvbnMgYXJlIHN3YXBwZWQuICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19SWFBJTl9MRVZFTCBSWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQgICAgIChVU0FSVF9DUjJfUlhJTlYpICAgICAgICAgICAgICAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1RYUElOX0xFVkVMIFRYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRCAgICAgKFVTQVJUX0NSMl9UWElOVikgICAgICAgICAgICAgICAgICAvKiE8IFRYIHBpbiBzaWduYWwgdmFsdWVzIGFyZSBpbnZlcnRlZC4gICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYy4gKDE9SCwgMD1MKSAqLworI2RlZmluZSBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgICAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljLiAoMT1MLCAwPUgpLiBUaGUgcGFyaXR5IGJpdCBpcyBhbHNvIGludmVydGVkLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQklUT1JERVIgQml0IE9yZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0ICovCisjZGVmaW5lIExMX0xQVUFSVF9CSVRPUkRFUl9NU0JGSVJTVCAgICAgICAgVVNBUlRfQ1IyX01TQkZJUlNUICAgICAgICAgICAgICAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQUREUkVTU19ERVRFQ1QgQWRkcmVzcyBMZW5ndGggRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgNC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gbWV0aG9kIHNlbGVjdGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgVVNBUlRfQ1IyX0FERE03ICAgICAgICAgICAgICAgICAgICAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfSFdDT05UUk9MIEhhcmR3YXJlIENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICBVU0FSVF9DUjNfUlRTRSAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRTIG91dHB1dCBlbmFibGVkLCBkYXRhIGlzIG9ubHkgcmVxdWVzdGVkIHdoZW4gdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAvKiE8IENUUyBtb2RlIGVuYWJsZWQsIGRhdGEgaXMgb25seSB0cmFuc21pdHRlZCB3aGVuIHRoZSBuQ1RTIGlucHV0IGlzIGFzc2VydGVkICh0aWVkIHRvIDApICovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUyAgICAgICAgKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpICAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19XQUtFVVBfT04gV2FrZXVwIEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfV0FLRVVQX09OX0FERFJFU1MgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIGFkZHJlc3MgbWF0Y2ggKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORSAgICAgICAgICAgKFVTQVJUX0NSM19XVVNfMCB8IFVTQVJUX0NSM19XVVNfMSkgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gUlhORSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9ERV9QT0xBUklUWV9ISUdIICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAgICAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGxvdyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfRE1BX1JFR19EQVRBIERNQSBSZWdpc3RlciBEYXRhCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRXhwb3J0ZWRfTWFjcm9zIExQVUFSVCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIExQVUFSVCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gTFBVQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0xQVUFSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRU1fRXhwb3J0ZWRfTWFjcm9zX0hlbHBlciBIZWxwZXIgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb21wdXRlIExQVUFSVERJViB2YWx1ZSBhY2NvcmRpbmcgdG8gUGVyaXBoZXJhbCBDbG9jayBhbmQKKyAgKiAgICAgICAgIGV4cGVjdGVkIEJhdWQgUmF0ZSAoMjAtYml0IHZhbHVlIG9mIExQVUFSVERJViBpcyByZXR1cm5lZCkKKyAgKiBAcGFyYW0gIF9fUEVSSVBIQ0xLX18gUGVyaXBoZXJhbCBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCBSYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIExQVUFSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZworICAqLworI2RlZmluZSBfX0xMX0xQVUFSVF9ESVYoX19QRVJJUEhDTEtfXywgX19QUkVTQ0FMRVJfXywgX19CQVVEUkFURV9fKSAodWludDMyX3QpKCgoKCgodWludDY0X3QpKF9fUEVSSVBIQ0xLX18pLyh1aW50NjRfdCkoTFBVQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQxNl90KShfX1BSRVNDQUxFUl9fKV0pKSAqIExQVUFSVF9MUFVBUlRESVZfRlJFUV9NVUwpICsgKHVpbnQzMl90KSgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKSAmIExQVUFSVF9CUlJfTUFTSykKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBMUFVBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIEVuYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIERpc2FibGUKKyAgKiBAbm90ZSAgIFdoZW4gTFBVQVJUIGlzIGRpc2FibGVkLCBMUFVBUlQgcHJlc2NhbGVycyBhbmQgb3V0cHV0cyBhcmUgc3RvcHBlZCBpbW1lZGlhdGVseSwKKyAgKiAgICAgICAgIGFuZCBjdXJyZW50IG9wZXJhdGlvbnMgYXJlIGRpc2NhcmRlZC4gVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIExQVUFSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMKKyAgKiAgICAgICAgIGZsYWdzLCBpbiB0aGUgTFBVQVJUeF9JU1IgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIEluIG9yZGVyIHRvIGdvIGludG8gbG93LXBvd2VyIG1vZGUgd2l0aG91dCBnZW5lcmF0aW5nIGVycm9ycyBvbiB0aGUgbGluZSwKKyAgKiAgICAgICAgIHRoZSBURSBiaXQgbXVzdCBiZSByZXNldCBiZWZvcmUgYW5kIHRoZSBzb2Z0d2FyZSBtdXN0IHdhaXQKKyAgKiAgICAgICAgIGZvciB0aGUgVEMgYml0IGluIHRoZSBMUFVBUlRfSVNSIHRvIGJlIHNldCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBVRSBiaXQuCisgICogICAgICAgICBUaGUgRE1BIHJlcXVlc3RzIGFyZSBhbHNvIHJlc2V0IHdoZW4gVUUgPSAwIHNvIHRoZSBETUEgY2hhbm5lbCBtdXN0CisgICogICAgICAgICBiZSBkaXNhYmxlZCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBVRSBiaXQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgTFBVQVJUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRklGTworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVGSUZPCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEZJRk8gTW9kZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRklGTworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRklGTyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pID09IChVU0FSVF9DUjFfRklGT0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBGSUZPIFRocmVzaG9sZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfTFBVQVJUX1NldFRYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkIDw8IFVTQVJUX0NSM19UWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFRYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggRklGTyBUaHJlc2hvbGQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9TZXRSWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRSWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfR2V0UlhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UlhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+IFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIGFuZCBSWCBGSUZPcyBUaHJlc2hvbGQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9Db25maWdGSUZPc1RocmVzaG9sZFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUWFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEBwYXJhbSAgUlhUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdGSUZPc1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUWFRocmVzaG9sZCwgdWludDMyX3QgUlhUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLCAoVFhUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSB8IChSWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBMUFVBUlQgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBMUFVBUlQgaXMgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBTdG9wIG1vZGUsIHByb3ZpZGVkIHRoYXQKKyAgKiAgICAgICAgIExQVUFSVCBjbG9jayBzZWxlY3Rpb24gaXMgSFNJIG9yIExTRSBpbiBSQ0MuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIGRpc2FibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBMUFVBUlQgaXMgbm90IGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIExQVUFSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZQorICAqICAgICAgICAgKGFibGUgdG8gd2FrZSB1cCBNQ1UgZnJvbSBTdG9wIG1vZGUgb3Igbm90KQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSkgPT0gKFVTQVJUX0NSMV9VRVNNKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVyIEVuYWJsZSAoUmVjZWl2ZXIgaXMgZW5hYmxlZCBhbmQgYmVnaW5zIHNlYXJjaGluZyBmb3IgYSBzdGFydCBiaXQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZXIgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHRlciBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHRlciBEaXNhYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaW11bHRhbmVvdXNseSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcworICAqICAgICAgICAgb2YgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcyBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9MUFVBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9UWF9SWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQYXJpdHkgKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgaGFyZHdhcmUgcGFyaXR5IGNvbnRyb2wgKGdlbmVyYXRpb24gYW5kIGRldGVjdGlvbikgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFdoZW4gdGhlIHBhcml0eSBjb250cm9sIGlzIGVuYWJsZWQgKE9kZCBvciBFdmVuKSwgY29tcHV0ZWQgcGFyaXR5IGJpdCBpcyBpbnNlcnRlZCBhdCB0aGUgTVNCIHBvc2l0aW9uCisgICogICAgICAgICAoZGVwZW5kaW5nIG9uIGRhdGEgd2lkdGgpIGFuZCBwYXJpdHkgaXMgY2hlY2tlZCBvbiB0aGUgcmVjZWl2ZWQgZGF0YS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9TZXRQYXJpdHlcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX1NldFBhcml0eQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfTFBVQVJUX0dldFBhcml0eVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9MUFVBUlRfR2V0UGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX09ERAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfTFBVQVJUX1NldFdha2VVcE1ldGhvZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IE1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfTFBVQVJUX0dldFdha2VVcE1ldGhvZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfQUREUkVTU01BUksKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgV29yZCBsZW5ndGggKG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERhdGFXaWR0aCkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBXb3JkIGxlbmd0aCAoaS5lLiBuYiBvZiBkYXRhIGJpdHMsIGV4Y2x1ZGluZyBzdGFydCBhbmQgc3RvcCBiaXRzKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0gICAgICAgICAgICAgTExfTFBVQVJUX0dldERhdGFXaWR0aAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERhdGFXaWR0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxsb3cgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZU11dGVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUgaXMgYWxsb3dlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZE11dGVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpID09IChVU0FSVF9DUjFfTU1FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzb3VyY2UgcHJlc2NhbGVyIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IgYW5kIG92ZXJzYW1wbGluZworICAqIEBybXRvbGwgUFJFU0MgICAgICAgIFBSRVNDQUxFUiAgICAgTExfTFBVQVJUX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQgb3ZlcnNhbXBsaW5nCisgICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfR2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDaGFyYWN0ZXIgZnJhbWUgZm9ybWF0IChEYXRhd2lkdGgsIFBhcml0eSBjb250cm9sLCBTdG9wIEJpdHMpCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIERhdGEgV2lkdGggY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBQYXJpdHkgQ29udHJvbCBhbmQgbW9kZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFN0b3AgYml0cyBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfTFBVQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0RECisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoLCB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0b3BCaXRzKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9NLCBQYXJpdHkgfCBEYXRhV2lkdGgpOworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfTFBVQVJUX1NldFRYUlhTd2FwCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1dBUFBFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFN3YXBDb25maWcpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfTFBVQVJUX0dldFRYUlhTd2FwCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9MUFVBUlRfU2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGluSW52TWV0aG9kKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfTFBVQVJUX0dldFJYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX0xQVUFSVF9TZXRUWFBpbkxldmVsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBQaW5JbnZNZXRob2QpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9MUFVBUlRfR2V0VFhQaW5MZXZlbAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuCisgICoKKyAgKiBAbm90ZSAgIEFsbG93IHRvIGRlZmluZSBob3cgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgOgorICAqICAgICAgICAgZWl0aGVyIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYyAoMT1ILCAwPUwpIG9yIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfTFBVQVJUX1NldEJpbmFyeURhdGFMb2dpYworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERhdGFMb2dpYykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBEYXRhTG9naWMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIEJpbmFyeSBkYXRhIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX0xQVUFSVF9HZXRCaW5hcnlEYXRhTG9naWMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX0xQVUFSVF9TZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEJpdE9yZGVyKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNULCBCaXRPcmRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqIEBub3RlICAgNGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChiNy1iNCBzaG91bGQgYmUgc2V0IHRvIDApCisgICogICAgICAgICA4Yml0cyBhZGRyZXNzIG5vZGUgaXMgdXNlZCB3aGVuIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LgorICAqICAgICAgICAgKFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqICAgICAgICAgVGhlIE1TQiBvZiB0aGUgY2hhcmFjdGVyIHNlbnQgYnkgdGhlIHRyYW5zbWl0dGVyIHNob3VsZCBiZSBlcXVhbCB0byAxLgorICAqICAgICAgICAgSXQgbWF5IGFsc28gYmUgdXNlZCBmb3IgY2hhcmFjdGVyIGRldGVjdGlvbiBkdXJpbmcgbm9ybWFsIHJlY2VwdGlvbiwKKyAgKiAgICAgICAgIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzIHByb3RvY29sKS4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHdob2xlIHJlY2VpdmVkIGNoYXJhY3RlciAoOC1iaXQpIGlzIGNvbXBhcmVkIHRvIHRoZSBBRERbNzowXQorICAqICAgICAgICAgdmFsdWUgYW5kIENNRiBmbGFnIGlzIHNldCBvbiBtYXRjaCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdOb2RlQWRkcmVzc1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnTm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBZGRyZXNzTGVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzdCCisgICogQHBhcmFtICBOb2RlQWRkcmVzcyA0IG9yIDcgYml0IEFkZHJlc3Mgb2YgdGhlIExQVUFSVCBub2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEFkZHJlc3NMZW4sIHVpbnQzMl90IE5vZGVBZGRyZXNzKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywKKyAgICAgICAgICAgICAodWludDMyX3QpKEFkZHJlc3NMZW4gfCAoTm9kZUFkZHJlc3MgPDwgVVNBUlRfQ1IyX0FERF9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDggYml0IEFkZHJlc3Mgb2YgdGhlIExQVUFSVCBub2RlIGFzIHNldCBpbiBBREQgZmllbGQgb2YgQ1IyLgorICAqIEBub3RlICAgSWYgNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsCisgICogICAgICAgICBvbmx5IDRiaXRzIChiMy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjQgYXJlIG5vdCByZWxldmFudCkKKyAgKiAgICAgICAgIElmIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICAqICAgICAgICAgb25seSA4Yml0cyAoYjctYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI4IGFyZSBub3QgcmVsZXZhbnQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldE5vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCkgPj4gVVNBUlRfQ1IyX0FERF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBMZW5ndGggb2YgTm9kZSBBZGRyZXNzIHVzZWQgaW4gQWRkcmVzcyBEZXRlY3Rpb24gbW9kZSAoNy1iaXQgb3IgNC1iaXQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3NMZW4KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF83QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXROb2RlQWRkcmVzc0xlbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBIVyBGbG93IENvbnRyb2wgbW9kZSAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgSGFyZHdhcmVGbG93Q29udHJvbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLCBIYXJkd2FyZUZsb3dDb250cm9sKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfTFBVQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE92ZXJydW4gZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX1NldFdLVVBUeXBlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUeXBlKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9MUFVBUlRfR2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIExQVUFSVCBCUlIgcmVnaXN0ZXIgZm9yIGFjaGlldmluZyBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWUuCisgICoKKyAgKiBAbm90ZSAgIENvbXB1dGUgYW5kIHNldCBMUFVBUlRESVYgdmFsdWUgaW4gQlJSIFJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHVzZWQgUGVyaXBoZXJhbCBDbG9jayBhbmQgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlcworICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBhbmQgQmF1ZCBSYXRlIHZhbHVlcyBwcm92aWRlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB2YWxpZAorICAqICAgICAgICAgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKS4KKyAgKiBAbm90ZSAgIFByb3ZpZGVkIHRoYXQgTFBVQVJUeF9CUlIgbXVzdCBiZSA+ID0gMHgzMDAgYW5kIExQVUFSVF9CUlIgaXMgMjAtYml0LAorICAqICAgICAgICAgYSBjYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGdlbmVyYXRpbmcgaGlnaCBiYXVkIHJhdGVzIHVzaW5nIGhpZ2ggUGVyaXBoQ2xrCisgICogICAgICAgICB2YWx1ZXMuIFBlcmlwaENsayBtdXN0IGJlIGluIHRoZSByYW5nZSBbMyB4IEJhdWRSYXRlLCA0MDk2IHggQmF1ZFJhdGVdLgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfTFBVQVJUX1NldEJhdWRSYXRlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBCYXVkUmF0ZSBCYXVkIFJhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRCYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLCB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgTFBVQVJUeC0+QlJSID0gX19MTF9MUFVBUlRfRElWKFBlcmlwaENsaywgUHJlc2NhbGVyVmFsdWUsIEJhdWRSYXRlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBCYXVkIFJhdGUgdmFsdWUsIGFjY29yZGluZyB0byBMUFVBUlRESVYgcHJlc2VudCBpbiBCUlIgcmVnaXN0ZXIKKyAgKiAgICAgICAgIChmdWxsIEJSUiBjb250ZW50KSwgYW5kIHRvIHVzZWQgUGVyaXBoZXJhbCBDbG9jayB2YWx1ZXMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwgdmFsdWUgMCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfTFBVQVJUX0dldEJhdWRSYXRlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHJldHZhbCBCYXVkIFJhdGUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgbHB1YXJ0ZGl2OworICByZWdpc3RlciB1aW50MzJfdCBicnJyZXN1bHQ7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHBlcmlwaGNsa3ByZXNjID0gKHVpbnQzMl90KShQZXJpcGhDbGsgLyAoTFBVQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQxNl90KVByZXNjYWxlclZhbHVlXSkpOworCisgIGxwdWFydGRpdiA9IExQVUFSVHgtPkJSUiAmIExQVUFSVF9CUlJfTUFTSzsKKworICBpZiAobHB1YXJ0ZGl2ID49IExQVUFSVF9CUlJfTUlOX1ZBTFVFKQorICB7CisgICAgYnJycmVzdWx0ID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KShwZXJpcGhjbGtwcmVzYykgKiBMUFVBUlRfTFBVQVJURElWX0ZSRVFfTVVMKSAvIGxwdWFydGRpdik7CisgIH0KKyAgZWxzZQorICB7CisgICAgYnJycmVzdWx0ID0gMHgwVUw7CisgIH0gIAorCisgIHJldHVybiAoYnJycmVzdWx0KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbl9IYWxmRHVwbGV4IENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gSGFsZiBEdXBsZXggZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9FbmFibGVIYWxmRHVwbGV4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKSA9PSAoVVNBUlRfQ1IzX0hEU0VMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Db25maWd1cmF0aW9uX0RFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gRHJpdmVyIEVuYWJsZSBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgREVEVCAoRHJpdmVyIEVuYWJsZSBEZS1Bc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9MUFVBUlRfU2V0REVEZWFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gREVEVCAoRHJpdmVyIEVuYWJsZSBEZS1Bc3NlcnRpb24gVGltZSkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX0xQVUFSVF9HZXRERURlYXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBjCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQpID4+IFVTQVJUX0NSMV9ERURUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERFQVQgKERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfTFBVQVJUX1NldERFQXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX0xQVUFSVF9HZXRERUFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFUKSA+PiBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURFTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlREVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERFTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkREVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSkgPT0gKFVTQVJUX0NSM19ERU0pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX0xQVUFSVF9TZXRERVNpZ25hbFBvbGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRERVNpZ25hbFBvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFUCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBEcml2ZXIgRW5hYmxlIFBvbGFyaXR5CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERFU2lnbmFsUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUGFyaXR5IEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFBFICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1BFKSA9PSAoVVNBUlRfSVNSX1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBGRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfRkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19GRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9GRSkgPT0gKFVTQVJUX0lTUl9GRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIE5vaXNlIGVycm9yIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE5FICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19ORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX05FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgT3ZlclJ1biBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBPUkUgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfT1JFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0lETEUpID09IChVU0FSVF9JU1JfSURMRSkpID8gMVVMIDogMFVMKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkUgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVhZCBEYXRhIFJlZ2lzdGVyIG9yIExQVUFSVCBSWCBGSUZPIE5vdCBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWE5FX1JYRk5FICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhORV9SWEZORSkgPT0gKFVTQVJUX0lTUl9SWE5FX1JYRk5FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UQworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RDKSA9PSAoVVNBUlRfSVNSX1RDKSkgPyAxVUwgOiAwVUwpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBvciBMUFVBUlQgVFggRklGTyBOb3QgRnVsbCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEVfVFhGTkYgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgPT0gKFVTQVJUX0lTUl9UWEVfVFhGTkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDVFMgaW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENUU0lGICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19uQ1RTCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFNJRikgPT0gKFVTQVJUX0lTUl9DVFNJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFMgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ1RTCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0NUUykgPT0gKFVTQVJUX0lTUl9DVFMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBCdXN5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEJVU1kgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19CVVNZCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQlVTWShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9CVVNZKSA9PSAoVVNBUlRfSVNSX0JVU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDaGFyYWN0ZXIgTWF0Y2ggRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01GICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0NNCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ01GKSA9PSAoVVNBUlRfSVNSX0NNRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFNlbmQgQnJlYWsgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0JLRiAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1NCSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9TQktGKSA9PSAoVVNBUlRfSVNSX1NCS0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSZWNlaXZlIFdha2UgVXAgZnJvbSBtdXRlIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUldVICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JXVQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JXVShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SV1UpID09IChVU0FSVF9JU1JfUldVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBXVUYgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfV1VGKSA9PSAoVVNBUlRfSVNSX1dVRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRyYW5zbWl0IEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUFDSyAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVEVBQ0sKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19URUFDSyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJlY2VpdmUgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJFQUNLICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SRUFDSworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JFQUNLKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JFQUNLKSA9PSAoVVNBUlRfSVNSX1JFQUNLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRklGTyBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEZFICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGRSkgPT0gKFVTQVJUX0lTUl9UWEZFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggRklGTyBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYRkYgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZGCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhGRihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWEZGKSA9PSAoVVNBUlRfSVNSX1JYRkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEZUICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGVAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGVCkgPT0gKFVTQVJUX0lTUl9UWEZUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUlggRklGTyBUaHJlc2hvbGQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGVCAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRlQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZUKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JYRlQpID09IChVU0FSVF9JU1JfUlhGVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1BFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEZyYW1pbmcgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEZFQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19GRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0ZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vaXNlIGRldGVjdGVkIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBORUNGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX05FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9ORUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBPdmVyUnVuIEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBPUkVDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfT1JFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX09SRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIElETEVDRiAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19JRExFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9JRExFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFRYIEZJRk8gRW1wdHkgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRYRkVDRiAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19UWEZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19UWEZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UWEZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVENDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RDCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ1RTIEludGVycnVwdCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ1RTQ0YgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX25DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX25DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0NUU0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFyYWN0ZXIgTWF0Y2ggRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIENNQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19DTQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0NNQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFdVQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19XS1VQKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9XVUNGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSURMRSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9JRExFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX0xQVUFSVF9FbmFibGVJVF9SWE5FICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfTFBVQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RDCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0VuYWJsZUlUX1RYRSAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWCBFbXB0eSBhbmQgVFggRklGTyBOb3QgRnVsbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX0xQVUFSVF9FbmFibGVJVF9UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUlFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ00KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9DTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9UWEZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhGRklFICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhGRgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXJyb3IgSW50ZXJydXB0CisgICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBhIGZyYW1pbmcKKyAgKiAgICAgICAgIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIpLgorICAqICAgICAgICAgLSAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgICogICAgICAgICAtIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIExQVUFSVHhfSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX0VSUk9SCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX0NUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9UWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9SWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1JYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSURMRSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfSURMRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9MUFVBUlRfRGlzYWJsZUlUX1JYTkUgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlggTm90IEVtcHR5IGFuZCBSWCBGSUZPIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORV9SWEZORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9UQworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVEMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRW1wdHkgYW5kIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFX1RYRk5GCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9QRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DTQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGRgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGRihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVycm9yIEludGVycnVwdAorICAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgYSBmcmFtaW5nCisgICogICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIExQVUFSVHhfSVNSIHJlZ2lzdGVyKS4KKyAgKiAgICAgICAgIC0gMDogSW50ZXJydXB0IGlzIGluaGliaXRlZAorICAqICAgICAgICAgLSAxOiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBMUFVBUlR4X0lTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRlQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGVAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIElETEUgSW50ZXJydXB0ICBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9JRExFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSkgPT0gKFVTQVJUX0NSMV9JRExFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBOb3QgRW1wdHkgYW5kIExQVUFSVCBSWCBGSUZPIE5vdCBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSA9PSAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RDCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSA9PSAoVVNBUlRfQ1IxX1RDSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRSAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRW1wdHkgYW5kIExQVUFSVCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICBUWEVJRV9UWEZORklFICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgPT0gKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ00KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NNKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpID09IChVU0FSVF9DUjFfQ01JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEZJRk8gRW1wdHkgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSkgPT0gKFVTQVJUX0NSMV9UWEZFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZGCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYRkZJRSkgPT0gKFVTQVJUX0NSMV9SWEZGSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBFcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9FUlJPUgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKSA9PSAoVVNBUlRfQ1IzX0VJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSkgPT0gKFVTQVJUX0NSM19DVFNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSkgPT0gKFVTQVJUX0NSM19XVUZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMUFVBUlQgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSkgPT0gKFVTQVJUX0NSM19UWEZUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFBVQVJUIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVElFICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUlhGVAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUlhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpID09IChVU0FSVF9DUjNfUlhGVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgcmVjZXB0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BUiAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfUlgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZERNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKSA9PSAoVVNBUlRfQ1IzX0RNQVIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFSZXFfVFgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZERNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSkgPT0gKFVTQVJUX0NSM19ERFJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTFBVQVJUIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX0xQVUFSVF9ETUFfR2V0UmVnQWRkclxuCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9MUFVBUlRfRE1BX0dldFJlZ0FkZHIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFCisgICogQHJldHZhbCBBZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfRE1BX0dldFJlZ0FkZHIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCkKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFREUiByZWdpc3RlciAqLworICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKExQVUFSVHgtPlREUik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoTFBVQVJUeC0+UkRSKTsKKyAgfQorCisgIHJldHVybiBkYXRhX3JlZ19hZGRyOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOCBiaXRzKQorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9MUFVBUlRfUmVjZWl2ZURhdGE4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoTFBVQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSAmIDB4RkZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIFJlY2VpdmVyIERhdGEgcmVnaXN0ZXIgKFJlY2VpdmUgRGF0YSB2YWx1ZSwgOSBiaXRzKQorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX1JlY2VpdmVEYXRhOQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0xQVUFSVF9SZWNlaXZlRGF0YTkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoTFBVQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOCBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9UcmFuc21pdERhdGE4KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQ4X3QgVmFsdWUpCit7CisgIExQVUFSVHgtPlREUiA9IFZhbHVlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX0xQVUFSVF9UcmFuc21pdERhdGE5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDE2X3QgVmFsdWUpCit7CisgIExQVUFSVHgtPlREUiA9IFZhbHVlICYgMHgxRkZVTDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRXhlY3V0aW9uIEV4ZWN1dGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBCcmVhayBzZW5kaW5nCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgU0JLUlEgICAgICAgICBMTF9MUFVBUlRfUmVxdWVzdEJyZWFrU2VuZGluZworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1NCS1JRKTsKK30KKworLyoqCisgICogQGJyaWVmICBQdXQgTFBVQVJUIGluIG11dGUgbW9kZSBhbmQgc2V0IHRoZSBSV1UgZmxhZworICAqIEBybXRvbGwgUlFSICAgICAgICAgIE1NUlEgICAgICAgICAgTExfTFBVQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX01NUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgYSBSZWNlaXZlIERhdGEgYW5kIEZJRk8gZmx1c2gKKyAgKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQgYW4gb3ZlcnJ1bgorICAqICAgICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfTFBVQVJUX1JlcXVlc3RSeERhdGFGbHVzaAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9SZXF1ZXN0UnhEYXRhRmx1c2goVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfUlhGUlEpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KTsKK0Vycm9yU3RhdHVzIExMX0xQVUFSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIExMX0xQVUFSVF9Jbml0VHlwZURlZiAqTFBVQVJUX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfTFBVQVJUX1N0cnVjdEluaXQoTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBVQVJUMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX0xQVUFSVF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX3B3ci5oIGIvSW5jL3N0bTMyZzB4eF9sbF9wd3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFhMTRhCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9wd3IuaApAQCAtMCwwICsxLDEzMzYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfcHdyLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfUFdSX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX1BXUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1IpCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBQV1IgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9QV1JfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfU0NSX0NTQkYgICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1NCRgorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUYgICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1dVRgorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUY2ICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1dVRjYKKyNkZWZpbmUgTExfUFdSX1NDUl9DV1VGNSAgICAgICAgICAgICAgICAgICBQV1JfU0NSX0NXVUY1CisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjQgICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DV1VGNAorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUYyICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1dVRjIKKyNkZWZpbmUgTExfUFdSX1NDUl9DV1VGMSAgICAgICAgICAgICAgICAgICBQV1JfU0NSX0NXVUYxCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUFdSX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfU1IxX1dVRkkgICAgICAgICAgICAgICAgICAgIFBXUl9TUjFfV1VGSQorI2RlZmluZSBMTF9QV1JfU1IxX1NCRiAgICAgICAgICAgICAgICAgICAgIFBXUl9TUjFfU0JGCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGNiAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUY2CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGNSAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUY1CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGNCAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUY0CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMiAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUYyCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMSAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUYxCisjaWYgZGVmaW5lZChQV1JfU1IyX1BWRE8pCisjZGVmaW5lIExMX1BXUl9TUjJfUFZETyAgICAgICAgICAgICAgICAgICAgUFdSX1NSMl9QVkRPCisjZW5kaWYKKyNkZWZpbmUgTExfUFdSX1NSMl9WT1NGICAgICAgICAgICAgICAgICAgICBQV1JfU1IyX1ZPU0YKKyNkZWZpbmUgTExfUFdSX1NSMl9SRUdMUEYgICAgICAgICAgICAgICAgICBQV1JfU1IyX1JFR0xQRgorI2RlZmluZSBMTF9QV1JfU1IyX1JFR0xQUyAgICAgICAgICAgICAgICAgIFBXUl9TUjJfUkVHTFBTCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19SRUdVX1ZPTFRBR0UgUkVHVSBWT0xUQUdFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEgICAgICAgICBQV1JfQ1IxX1ZPU18wCisjZGVmaW5lIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUyICAgICAgICAgUFdSX0NSMV9WT1NfMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfTU9ERV9QV1IgTU9ERSBQV1IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfTU9ERV9TVE9QMCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUT1AxICAgICAgICAgICAgICAgICAgKFBXUl9DUjFfTFBNU18wKQorI2RlZmluZSBMTF9QV1JfTU9ERV9TVEFOREJZICAgICAgICAgICAgICAgIChQV1JfQ1IxX0xQTVNfMXxQV1JfQ1IxX0xQTVNfMCkKKyNpZiBkZWZpbmVkIChQV1JfQ1IxX0xQTVNfMikKKyNkZWZpbmUgTExfUFdSX01PREVfU0hVVERPV04gICAgICAgICAgICAgICAoUFdSX0NSMV9MUE1TXzIpCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFBXUl9DUjJfUFZERSkKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1BWRExFVkVMIFBWRExFVkVMCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExMRVZFTF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMCA+IDIuMDUgViAqLworI2RlZmluZSBMTF9QV1JfUFZETExFVkVMXzEgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRGVF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZQVkQwID4gMi4yIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExMRVZFTF8yICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMSA+IDIuMzYgViAqLworI2RlZmluZSBMTF9QV1JfUFZETExFVkVMXzMgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRGVF8xIHwgUFdSX0NSMl9QVkRGVF8wKSAgICAgICAgIC8qIFZQVkQyID4gMi41MiBWICovCisjZGVmaW5lIExMX1BXUl9QVkRMTEVWRUxfNCAgICAgICAgICAgICAgICAgIChQV1JfQ1IyX1BWREZUXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlBWRDMgPiAyLjY0IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExMRVZFTF81ICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZERlRfMiB8IFBXUl9DUjJfUFZERlRfMCkgICAgICAgICAvKiBWUFZENCA+IDIuODEgViAqLworI2RlZmluZSBMTF9QV1JfUFZETExFVkVMXzYgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRGVF8yIHwgUFdSX0NSMl9QVkRGVF8xKSAgICAgICAgIC8qIFZQVkQ1ID4gMi45MSBWICovCisKKyNkZWZpbmUgTExfUFdSX1BWREhMRVZFTF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUEREMCA+IDIuMTUgViAqLworI2RlZmluZSBMTF9QV1JfUFZESExFVkVMXzEgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRSVF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZQVkQxID4gMi4zIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWREhMRVZFTF8yICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZEUlRfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMSA+IDIuNDYgViAqLworI2RlZmluZSBMTF9QV1JfUFZESExFVkVMXzMgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRSVF8xIHwgUFdSX0NSMl9QVkRSVF8wKSAgICAgICAgIC8qIFZQVkQyID4gMi42MiBWICovCisjZGVmaW5lIExMX1BXUl9QVkRITEVWRUxfNCAgICAgICAgICAgICAgICAgIChQV1JfQ1IyX1BWRFJUXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlBWRDMgPiAyLjc0IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWREhMRVZFTF81ICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUFZEUlRfMiB8IFBXUl9DUjJfUFZEUlRfMCkgICAgICAgICAvKiBWUFZENCA+IDIuOTEgViAqLworI2RlZmluZSBMTF9QV1JfUFZESExFVkVMXzYgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QVkRSVF8yIHwgUFdSX0NSMl9QVkRSVF8xKSAgICAgICAgIC8qIFZQVkQ1ID4gMy4wMSBWICovCisjZGVmaW5lIExMX1BXUl9QVkRITEVWRUxfNyAgICAgICAgICAgICAgICAgIChQV1JfQ1IyX1BWRFJUXzIgfCBQV1JfQ1IyX1BWRFJUXzEgfCBQV1JfQ1IyX1BWRFJUXzApICAvKiBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAgIChDb21wYXJlIGludGVybmFsbHkgdG8gVlJFRklOVCkgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfV0FLRVVQIFdBS0VVUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMSAgICAgICAgICAgICAgICAgKFBXUl9DUjNfRVdVUDEpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElOMiAgICAgICAgICAgICAgICAgKFBXUl9DUjNfRVdVUDIpCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElONCAgICAgICAgICAgICAgICAgKFBXUl9DUjNfRVdVUDQpCisjaWYgZGVmaW5lZChQV1JfQ1IzX0VXVVA1KQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjUgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVA1KQorI2VuZGlmCisjZGVmaW5lIExMX1BXUl9XQUtFVVBfUElONiAgICAgICAgICAgICAgICAgKFBXUl9DUjNfRVdVUDYpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19CQVRUX0NIQVJHX1JFU0lTVE9SIEJBVFQgQ0hBUkcgUkVTSVNUT1IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfQkFUVENIQVJHX1JFU0lTVE9SXzVLICAgICAgIDB4MDAwMDAwMDAwdQorI2RlZmluZSBMTF9QV1JfQkFUVENIQVJHX1JFU0lTVE9SXzFfNUsgICAgIChQV1JfQ1I0X1ZCUlMpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HUElPIEdQSU8KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfR1BJT19BICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCYoUFdSLT5QVUNSQSkpKQorI2RlZmluZSBMTF9QV1JfR1BJT19CICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCYoUFdSLT5QVUNSQikpKQorI2RlZmluZSBMTF9QV1JfR1BJT19DICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCYoUFdSLT5QVUNSQykpKQorI2RlZmluZSBMTF9QV1JfR1BJT19EICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCYoUFdSLT5QVUNSRCkpKQorI2RlZmluZSBMTF9QV1JfR1BJT19GICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKCYoUFdSLT5QVUNSRikpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfR1BJT19CSVQgR1BJTyBCSVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDF1CisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMnUKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzIgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0dQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDh1CisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF80ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMHUKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzUgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwdQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfNiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDB1CisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF83ICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MHUKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzggICAgICAgICAgICAgICAgICAweDAwMDAwMTAwdQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfOSAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDB1CisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMCAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMHUKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzExICAgICAgICAgICAgICAgICAweDAwMDAwODAwdQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTIgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDB1CisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMyAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMHUKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzE0ICAgICAgICAgICAgICAgICAweDAwMDA0MDAwdQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTUgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDB1CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfTWFjcm9zIFBXUiBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFBXUiByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfUFdSX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKFBXUi0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFBXUiByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9QV1JfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhQV1ItPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBWT1MgICAgICAgICAgIExMX1BXUl9TZXRSZWd1bFZvbHRhZ2VTY2FsaW5nCisgICogQHBhcmFtICBWb2x0YWdlU2NhbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgVm9sdGFnZVNjYWxpbmcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBWT1MgICAgICAgICAgIExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0UmVndWxWb2x0YWdlU2NhbGluZyh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN3aXRjaCB0aGUgcmVndWxhdG9yIGZyb20gbWFpbiBtb2RlIHRvIGxvdy1wb3dlciBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRW5hYmxlTG93UG93ZXJSdW5Nb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBSKTsKK30KKworLyoqCisgICogQGJyaWVmICBTd2l0Y2ggdGhlIHJlZ3VsYXRvciBmcm9tIGxvdy1wb3dlciBtb2RlIHRvIG1haW4gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQUiAgICAgICAgICAgTExfUFdSX0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSByZWd1bGF0b3IgaXMgaW4gbG93LXBvd2VyIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRMb3dQb3dlclJ1bk1vZGUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUikgPT0gKFBXUl9DUjFfTFBSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN3aXRjaCBmcm9tIHJ1biBtYWluIG1vZGUgdG8gcnVuIGxvdy1wb3dlciBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQUiAgICAgICAgICAgTExfUFdSX0VudGVyTG93UG93ZXJSdW5Nb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW50ZXJMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgTExfUFdSX0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN3aXRjaCBmcm9tIHJ1biBtYWluIG1vZGUgdG8gbG93LXBvd2VyIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRXhpdExvd1Bvd2VyUnVuTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0V4aXRMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgTExfUFdSX0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREJQICAgICAgICAgICBMTF9QV1JfRW5hYmxlQmtVcEFjY2VzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREJQICAgICAgICAgICBMTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlQmtVcEFjY2Vzcyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgYmFja3VwIGRvbWFpbiBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREJQICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkQmtVcEFjY2VzcworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCa1VwQWNjZXNzKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkgPT0gKFBXUl9DUjFfREJQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIGxvdyBwb3dlciBzbGVlcCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0ZJUERfU0xQICAgICBMTF9QV1JfRW5hYmxlRmxhc2hQb3dlckRvd25JbkxQU2xlZXAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVGbGFzaFBvd2VyRG93bkluTFBTbGVlcCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0ZQRF9MUFNMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbGFzaCBQb3dlci1kb3duIG1vZGUgZHVyaW5nIExvdyBwb3dlciBzbGVlcCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0ZJUERfU0xQICAgICBMTF9QV1JfRGlzYWJsZUZsYXNoUG93ZXJEb3duSW5MUFNsZWVwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUZsYXNoUG93ZXJEb3duSW5MUFNsZWVwKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9GUERfTFBTTFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgbG93IHBvd2VyIHNsZWVwIG1vZGUgZG9tYWluIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRklQRF9TTFAgICAgIExMX1BXUl9Jc0VuYWJsZUZsYXNoUG93ZXJEb3duSW5MUFNsZWVwCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlRmxhc2hQb3dlckRvd25JbkxQU2xlZXAodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfRlBEX0xQU0xQKSA9PSAoUFdSX0NSMV9GUERfTFBTTFApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZsYXNoIFBvd2VyLWRvd24gbW9kZSBkdXJpbmcgbG93IHBvd2VyIHJ1biBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0ZJUERfUlVOICAgICBMTF9QV1JfRW5hYmxlRmxhc2hQb3dlckRvd25JbkxQUnVuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlRmxhc2hQb3dlckRvd25JbkxQUnVuKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfRlBEX0xQUlVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsYXNoIFBvd2VyLWRvd24gbW9kZSBkdXJpbmcgTG93IHBvd2VyIHJ1biBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0ZJUERfUlVOICAgICBMTF9QV1JfRGlzYWJsZUZsYXNoUG93ZXJEb3duSW5MUFJ1bgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVGbGFzaFBvd2VyRG93bkluTFBSdW4odm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0ZQRF9MUFJVTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgZmxhc2ggcG93ZXItZG93biBtb2RlIGR1cmluZyBsb3cgcG93ZXIgcnVuIG1vZGUgZG9tYWluIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRklQRF9SVU4gICAgIExMX1BXUl9Jc0VuYWJsZUZsYXNoUG93ZXJEb3duSW5MUFJ1bgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZUZsYXNoUG93ZXJEb3duSW5MUFJ1bih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9GUERfTFBSVU4pID09IChQV1JfQ1IxX0ZQRF9MUFJVTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBzdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRklQRF9TVE9QICAgIExMX1BXUl9FbmFibGVGbGFzaFBvd2VyRG93bkluU3RvcAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUZsYXNoUG93ZXJEb3duSW5TdG9wKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfRlBEX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRmxhc2ggUG93ZXItZG93biBtb2RlIGR1cmluZyBzdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRklQRF9TVE9QICAgIExMX1BXUl9EaXNhYmxlRmxhc2hQb3dlckRvd25JblN0b3AKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlRmxhc2hQb3dlckRvd25JblN0b3Aodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0ZQRF9TVE9QKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFzaCBwb3dlci1kb3duIG1vZGUgZHVyaW5nIHN0b3AgbW9kZSBkb21haW4gaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENGSVBEX1NUT1AgICAgTExfUFdSX0lzRW5hYmxlRmxhc2hQb3dlckRvd25JblN0b3AKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVGbGFzaFBvd2VyRG93bkluU3RvcCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9GUERfU1RPUCkgPT0gKFBXUl9DUjFfRlBEX1NUT1ApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExvdy1Qb3dlciBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBNUyAgICAgICAgICBMTF9QV1JfU2V0UG93ZXJNb2RlCisgICogQHBhcmFtICBMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0UG93ZXJNb2RlKHVpbnQzMl90IExvd1Bvd2VyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9MUE1TLCBMb3dQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBMb3ctUG93ZXIgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIExQTVMgICAgICAgICAgTExfUFdSX0dldFBvd2VyTW9kZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldFBvd2VyTW9kZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUE1TKSk7Cit9CisKKyNpZiBkZWZpbmVkIChQV1JfQ1IyX1BWREUpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgaGlnaCB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3RlZCBieSB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBMUyAgICAgICAgICAgTExfUFdSX1NldFBWREhpZ2hMZXZlbAorICAqIEBwYXJhbSAgUFZESGlnaExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWREhMRVZFTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0UFZESGlnaExldmVsKHVpbnQzMl90IFBWREhpZ2hMZXZlbCkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSMiwgUFdSX0NSMl9QVkRSVCwgUFZESGlnaExldmVsKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBMUyAgICAgICAgICAgTExfUFdSX0dldFBWREhpZ2hMZXZlbAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZESExFVkVMXzcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0UFZESGlnaExldmVsKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWRFJUKSk7Cit9CisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgbG93IHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUExTICAgICAgICAgICBMTF9QV1JfU2V0UFZETG93TGV2ZWwKKyAgKiBAcGFyYW0gIFBWRExvd0xldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExMRVZFTF82CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0UFZETG93TGV2ZWwodWludDMyX3QgUFZETG93TGV2ZWwpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUjIsIFBXUl9DUjJfUFZERlQsIFBWRExvd0xldmVsKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGxvdyB2b2x0YWdlIHRocmVzaG9sZCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQTFMgICAgICAgICAgIExMX1BXUl9HZXRQVkRMb3dMZXZlbAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETExFVkVMXzYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0UFZETG93TGV2ZWwodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfUFZERlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0VuYWJsZVBWRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlUFZEKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIERldGVjdG9yIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQVkRFICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVkQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFZEKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpID09IChQV1JfQ1IyX1BWREUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSW50ZXJuYWwgV2FrZS11cCBsaW5lCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlXRiAgICAgICAgICBMTF9QV1JfRW5hYmxlSW50ZXJuV1UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVJbnRlcm5XVSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV1VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEludGVybmFsIFdha2UtdXAgbGluZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0Rpc2FibGVJbnRlcm5XVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVJbnRlcm5XVSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUlXVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEludGVybmFsIFdha2UtdXAgbGluZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlXRiAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkSW50ZXJuV1UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkSW50ZXJuV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUlXVUwpID09IChQV1JfQ1IzX0VJV1VMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0VuYWJsZVBVUERDZmcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVQVVBEQ2ZnKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQVBDICAgICAgICAgICBMTF9QV1JfRGlzYWJsZVBVUERDZmcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlUFVQRENmZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbiAgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBVUERDZmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFVQRENmZyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpID09IChQV1JfQ1IzX0FQQykpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUFdSX0NSM19SUlMpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTUkFNIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJSUyAgICAgICAgICAgTExfUFdSX0VuYWJsZVNSQU1SZXRlbnRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVTUkFNUmV0ZW50aW9uKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNSQU0gY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlJTICAgICAgICAgICBMTF9QV1JfRGlzYWJsZVNSQU1SZXRlbnRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlU1JBTVJldGVudGlvbih2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTUkFNIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlJTICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkU1JBTVJldGVudGlvbgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRTUkFNUmV0ZW50aW9uKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUykgPT0gKFBXUl9DUjNfUlJTKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfRU5CX1VMUCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHNhbXBsaW5nIG1vZGUgb2YgTFBNTVUgcmVzZXQgYmxvY2sKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFTkJfVUxQICAgICAgIExMX1BXUl9FbmFibGVMUE1VUmVzZXRTYW1wbGluZ01vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVMUE1VUmVzZXRTYW1wbGluZ01vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FTkJfVUxQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHNhbXBsaW5nIG1vZGUgb2YgTFBNTVUgcmVzZXQgYmxvY2sKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFTkJfVUxQICAgICAgIExMX1BXUl9EaXNhYmxlTFBNVVJlc2V0U2FtcGxpbmdNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUxQTVVSZXNldFNhbXBsaW5nTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRU5CX1VMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgc2FtcGxpbmcgbW9kZSBvZiBMUE1NVSByZXNldCBibG9jaworICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVOQl9VTFAgICAgICAgTExfUFdSX0lzRW5hYmxlTFBNVVJlc2V0U2FtcGxpbmdNb2RlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlTFBNVVJlc2V0U2FtcGxpbmdNb2RlKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VOQl9VTFApID09IChQV1JfQ1IzX0VOQl9VTFApKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFV1VQMSAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAyICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNSAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA2ICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpbgorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU42CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDIgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDUgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDYgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpbgorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU42CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIENMRUFSX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMiAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA0ICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDUgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNiAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKSA9PSAoV2FrZVVwUGluKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcmVzaXN0b3IgaW1wZWRhbmNlCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJSUyAgICAgICAgICBMTF9QV1JfU2V0QmF0dENoYXJnUmVzaXN0b3IKKyAgKiBAcGFyYW0gIFJlc2lzdG9yIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JBVFRDSEFSR19SRVNJU1RPUl81SworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUQ0hBUkdfUkVTSVNUT1JfMV81SworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldEJhdHRDaGFyZ1Jlc2lzdG9yKHVpbnQzMl90IFJlc2lzdG9yKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCUlMsIFJlc2lzdG9yKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQorICAqIEBybXRvbGwgQ1I0ICAgICAgICAgIFZCUlMgICAgICAgICAgTExfUFdSX0dldEJhdHRDaGFyZ1Jlc2lzdG9yCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUQ0hBUkdfUkVTSVNUT1JfNUsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfQkFUVENIQVJHX1JFU0lTVE9SXzFfNUsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0QmF0dENoYXJnUmVzaXN0b3Iodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJSUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJFICAgICAgICAgICBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGJhdHRlcnkgY2hhcmdpbmcKKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUJhdHRlcnlDaGFyZ2luZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBiYXR0ZXJ5IGNoYXJnaW5nIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRCYXR0ZXJ5Q2hhcmdpbmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkQmF0dGVyeUNoYXJnaW5nKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSkgPT0gKFBXUl9DUjRfVkJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgbG93IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDQgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A1ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93KHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgU0VUX0JJVChQV1ItPkNSNCwgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFdha2UtVXAgcGluIHBvbGFyaXR5IGhpZ2ggZm9yIHRoZSBldmVudCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBXUDEgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2hcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaFxuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDUgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2hcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaAorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU42CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgZm9yIHRoZSBldmVudCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBXUDEgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDIgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDQgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDUgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDYgICAgICAgICAgIExMX1BXUl9Jc1dha2VVcFBpblBvbGFyaXR5TG93CisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvdyh1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1I0LCBXYWtlVXBQaW4pID09IChXYWtlVXBQaW4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICAqIEBybXRvbGwgUFVDUkEgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkIgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkMgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkQgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkYgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsVXAKKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICBTRVRfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMKKyAgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgICogICAgICAgICBQVUNSQiAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkMgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgICogICAgICAgICBQVUNSRiAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXAKKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXAodWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcikKK3sKKyAgQ0xFQVJfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLXVwIHN0YXRlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JGICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwCisgICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YKKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIHJldHVybiAoKFJFQURfQklUKCooKF9fSU8gdWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcikgPT0gKEdQSU9OdW1iZXIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEdQSU8gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzCisgICogQHJtdG9sbCBQRENSQSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JCICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkMgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSRCAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JGICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd24KKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIFNFVF9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkMgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkYgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd24KKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRgorICAqIEBwYXJhbSAgR1BJT051bWJlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICBDTEVBUl9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLWRvd24gc3RhdGUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSQiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSRiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duCisgICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0YKKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcikKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoKigoX19JTyB1aW50MzJfdCAqKShHUElPICsgNFUpKSwgR1BJT051bWJlcikgPT0gKEdQSU9OdW1iZXIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbnRlcm5hbCBXYWtlLXVwIGxpbmUgRmxhZworICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRkkgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19JbnRlcm5XVQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfSW50ZXJuV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGSSkgPT0gKFBXUl9TUjFfV1VGSSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3RhbmQtQnkgRmxhZworICAqIEBybXRvbGwgU1IxICAgICAgICAgIFNCRiAgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19TQgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfU0Iodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfU0JGKSA9PSAoUFdSX1NSMV9TQkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2UtdXAgRmxhZyA2CisgICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGNiAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1U2KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRjYpID09IChQV1JfU1IxX1dVRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfRVdVUDUpCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgNQorICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjUgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUY1KSA9PSAoUFdSX1NSMV9XVUY1KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2UtdXAgRmxhZyA0CisgICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGNCAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1U0KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1dVRjQpID09IChQV1JfU1IxX1dVRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDIKKyAgKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUYyICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UyCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGMikgPT0gKFBXUl9TUjFfV1VGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2FrZS11cCBGbGFnIDEKKyAgKiBAcm10b2xsIFNSMSAgICAgICAgICBXVUYxICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfV1UxCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfV1VGMSkgPT0gKFBXUl9TUjFfV1VGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTdGFuZC1CeSBGbGFnCisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1NCRiAgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1NCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1NCKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DU0JGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWdzCisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRiAgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgNgorICAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUY2ICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1U2KHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGNik7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfRVdVUDUpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyA1CisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjUgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTUodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUY1KTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyA0CisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjQgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVNAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTQodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUY0KTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyAyCisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjIgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTIodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgMQorICAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUYxICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1UxKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGMSk7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9TUjJfUFZETykKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWREQgdm9sdGFnZSBpcyBiZWxvdyBvciBhYm92ZSB0aGUgc2VsZWN0ZWQgUFZECisgICogICAgICAgICB0aHJlc2hvbGQKKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBQVkRPICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVkRPKSA9PSAoUFdSX1NSMl9QVkRPKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgcmVndWxhdG9yIGlzIHJlYWR5IGluIHRoZSBzZWxlY3RlZCB2b2x0YWdlCisgICogICAgICAgICByYW5nZSBvciBpZiBpdHMgb3V0cHV0IHZvbHRhZ2UgaXMgc3RpbGwgY2hhbmdpbmcgdG8gdGhlIHJlcXVpcmVkCisgICogICAgICAgICB2b2x0YWdlIGxldmVsCisgICogQG5vdGU6ICBUYWtlIGNhcmUsIHJldHVybiB2YWx1ZSAiMCIgbWVhbnMgdGhlIHJlZ3VsYXRvciBpcyByZWFkeS4KKyAgKiAgICAgICAgIFJldHVybiB2YWx1ZSAiMSIgbWVhbnMgdGhlIG91dHB1dCB2b2x0YWdlIHJhbmdlIGlzIHN0aWxsIGNoYW5naW5nLgorICAqIEBybXRvbGwgU1IyICAgICAgICAgIFZPU0YgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1MKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1ZPUyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9WT1NGKSA9PSAoUFdSX1NSMl9WT1NGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlZ3VsYXRvciBpcyByZWFkeSBpbiBtYWluIG1vZGUgb3IgaXMgaW4KKyAgKiAgICAgICAgIGxvdy1wb3dlciBtb2RlCisgICogQG5vdGU6ICBUYWtlIGNhcmUsIHJldHVybiB2YWx1ZSAiMCIgbWVhbnMgcmVndWxhdG9yIGlzIHJlYWR5IGluIG1haW4gbW9kZQorICAqICAgICAgICAgUmV0dXJuIHZhbHVlICIxIiBtZWFucyByZWd1bGF0b3IgaXMgaW4gbG93LXBvd2VyIG1vZGUgKExQUikKKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBSRUdMUEYgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBGCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19SRUdMUEYodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSA9PSAoUFdSX1NSMl9SRUdMUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaXMgcmVhZHkKKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBSRUdMUFMgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19SRUdMUFModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBTKSA9PSAoUFdSX1NSMl9SRUdMUFMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGZsYXNoIGlzIHJlYWR5IHRvIGJlIGFjY2Vzc2VkCisgICogQHJtdG9sbCBTUjIgICAgICAgICAgRkxBU0hfUkRZICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0ZMQVNIX1JEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfRkxBU0hfUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX0ZMQVNIX1JEWSkgPT0gKFBXUl9TUjJfRkxBU0hfUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUFdSX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9QV1JfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF9yY2MuaCBiL0luYy9zdG0zMmcweHhfbGxfcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzNzdlNgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmcweHhfbGxfcmNjLmgKQEAgLTAsMCArMSwzMDQyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3JjYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSQ0MgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9SQ0NfSAorI2RlZmluZSBTVE0zMkcweHhfTExfUkNDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJDQykKKworLyoqIEBkZWZncm91cCBSQ0NfTEwgUkNDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9Qcml2YXRlX1ZhcmlhYmxlcyBSQ0MgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MgUkNDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfVHlwZXMgUkNDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMTF9FU19DTE9DS19GUkVRIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSQ0MgQ2xvY2tzIEZyZXF1ZW5jeSBTdHJ1Y3R1cmUKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3k7ICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgSENMS19GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgUENMSzFfRnJlcXVlbmN5OyAgICAgICAgIC8qITwgUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCit9IExMX1JDQ19DbG9ja3NUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFJDQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19PU0NfVkFMVUVTIE9zY2lsbGF0b3IgVmFsdWVzIGFkYXB0YXRpb24KKyAgKiBAYnJpZWYgICAgRGVmaW5lcyB1c2VkIHRvIGFkYXB0IHZhbHVlcyBvZiBkaWZmZXJlbnQgb3NjaWxsYXRvcnMKKyAgKiBAbm90ZSAgICAgVGhlc2UgdmFsdWVzIGNvdWxkIGJlIG1vZGlmaWVkIGluIHRoZSB1c2VyIGVudmlyb25tZW50IGFjY29yZGluZyB0bworICAqICAgICAgICAgICBIVyBzZXQtdXAuCisgICogQHsKKyAgKi8KKyNpZiAhZGVmaW5lZCAgKEhTRV9WQUxVRSkKKyNkZWZpbmUgSFNFX1ZBTFVFICAgIDgwMDAwMDBVICAgLyohPCBWYWx1ZSBvZiB0aGUgSFNFIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBIU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorI2RlZmluZSBIU0lfVkFMVUUgICAgMTYwMDAwMDBVICAvKiE8IFZhbHVlIG9mIHRoZSBIU0kgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEhTSV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisjZGVmaW5lIExTRV9WQUxVRSAgICAzMjc2OFUgICAgIC8qITwgVmFsdWUgb2YgdGhlIExTRSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogTFNFX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZCAgKExTSV9WQUxVRSkKKyNkZWZpbmUgTFNJX1ZBTFVFICAgIDMyMDAwVSAgICAgLyohPCBWYWx1ZSBvZiB0aGUgTFNJIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBMU0lfVkFMVUUgKi8KKyNpZiAhZGVmaW5lZCAgKEVYVEVSTkFMX0NMT0NLX1ZBTFVFKQorI2RlZmluZSBFWFRFUk5BTF9DTE9DS19WQUxVRSAgICA0ODAwMDAwMFUgLyohPCBWYWx1ZSBvZiB0aGUgSTJTX0NLSU4gZXh0ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEVYVEVSTkFMX0NMT0NLX1ZBTFVFICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JDQ19Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTSVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTFNJUkRZQyAgICAgLyohPCBMU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTFNFUkRZQyAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0hTSVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfSFNJUkRZQyAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0hTRVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfSFNFUkRZQyAgICAgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX1BMTFJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfUExMUkRZQyAgICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRUNTU0MgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTFNFQ1NTQyAgICAgLyohPCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBDbGVhciAqLworI2RlZmluZSBMTF9SQ0NfQ0lDUl9DU1NDICAgICAgICAgICAgICAgICAgIFJDQ19DSUNSX0NTU0MgICAgICAgIC8qITwgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBDbGVhciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JDQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTFNJUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9MU0lSRFlGICAgICAvKiE8IExTSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0VSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX0xTRVJEWUYgICAgIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0hTSVJEWUYgICAgICAgICAgICAgICAgUkNDX0NJRlJfSFNJUkRZRiAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfSFNFUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9IU0VSRFlGICAgICAvKiE8IEhTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9QTExSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX1BMTFJEWUYgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0xTRUNTU0YgICAgICAgICAgICAgICAgUkNDX0NJRlJfTFNFQ1NTRiAgICAgLyohPCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0NTU0YgICAgICAgICAgICAgICAgICAgUkNDX0NJRlJfQ1NTRiAgICAgICAgLyohPCBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9MUFdSUlNURiAgICAgICAgICAgICAgICBSQ0NfQ1NSX0xQV1JSU1RGICAgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX09CTFJTVEYgICAgICAgICAgICAgICAgIFJDQ19DU1JfT0JMUlNURiAgICAvKiE8IE9CTCByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfUElOUlNURiAgICAgICAgICAgICAgICAgUkNDX0NTUl9QSU5SU1RGICAgIC8qITwgUElOIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9TRlRSU1RGICAgICAgICAgICAgICAgICBSQ0NfQ1NSX1NGVFJTVEYgICAgLyohPCBTb2Z0d2FyZSBSZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfSVdER1JTVEYgICAgICAgICAgICAgICAgUkNDX0NTUl9JV0RHUlNURiAgIC8qITwgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX1dXREdSU1RGICAgICAgICAgICAgICAgIFJDQ19DU1JfV1dER1JTVEYgICAvKiE8IFdpbmRvdyB3YXRjaGRvZyByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfUFdSUlNURiAgICAgICAgICAgICAgICAgUkNDX0NTUl9QV1JSU1RGICAgIC8qITwgQk9SIG9yIFBPUi9QRFIgcmVzZXQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUkNDX1JlYWRSZWcgYW5kICBMTF9SQ0NfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9MU0lSRFlJRSAgICAgIC8qITwgTFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfTFNFUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9MU0VSRFlJRSAgICAgIC8qITwgTFNFIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfSFNJUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9IU0lSRFlJRSAgICAgIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfSFNFUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9IU0VSRFlJRSAgICAgIC8qITwgSFNFIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfUkNDX0NJRVJfUExMUkRZSUUgICAgICAgICAgICAgICBSQ0NfQ0lFUl9QTExSRFlJRSAgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xTRURSSVZFICBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFh0YWwgbW9kZSBsb3dlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVyAgICAgICAgICBSQ0NfQkRDUl9MU0VEUlZfMCAgICAgICAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gbG93IGRyaXZpbmcgY2FwYWJpbGl0eSAqLworI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgIFJDQ19CRENSX0xTRURSVl8xICAgICAgIC8qITwgWHRhbCBtb2RlIG1lZGl1bSBoaWdoIGRyaXZpbmcgY2FwYWJpbGl0eSAqLworI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfSElHSCAgICAgICAgICAgICAgIFJDQ19CRENSX0xTRURSViAgICAgICAgIC8qITwgWHRhbCBtb2RlIGhpZ2hlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xTQ09fQ0xLU09VUkNFICBMU0NPIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0kgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITwgTFNJIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrICAqLworI2RlZmluZSBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNFICAgICAgICAgIFJDQ19CRENSX0xTQ09TRUwgICAgICAgICAgICAvKiE8IExTRSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU19DTEtTT1VSQ0UgIFN5c3RlbSBjbG9jayBzd2l0Y2gKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0kgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0UgICAgICAgICAgIFJDQ19DRkdSX1NXXzAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9QTEwgICAgICAgICAgIFJDQ19DRkdSX1NXXzEgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTEwgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9MU0kgICAgICAgICAgIChSQ0NfQ0ZHUl9TV18xIHwgUkNDX0NGR1JfU1dfMCkgICAgLyohPCBMU0kgc2VsZWN0aW9uIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0xTRSAgICAgICAgICAgUkNDX0NGR1JfU1dfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTRSBzZWxlY3Rpb24gdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NZU19DTEtTT1VSQ0VfU1RBVFVTICBTeXN0ZW0gY2xvY2sgc3dpdGNoIHN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRSAgICBSQ0NfQ0ZHUl9TV1NfMCAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMICAgIFJDQ19DRkdSX1NXU18xICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19MU0kgICAgKFJDQ19DRkdSX1NXU18xIHwgUkNDX0NGR1JfU1dTXzApICAgLyohPCBMU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0xTRSAgICBSQ0NfQ0ZHUl9TV1NfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU1lTQ0xLX0RJViAgQUhCIHByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMiAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfNCAgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfOCAgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTYgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8xIHwgUkNDX0NGR1JfSFBSRV8wKSAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzY0ICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjggICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzMgfCBSQ0NfQ0ZHUl9IUFJFXzIgfCBSQ0NfQ0ZHUl9IUFJFXzApICAgICAgICAgICAgICAgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMTI4ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzI1NiAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMiB8IFJDQ19DRkdSX0hQUkVfMSkgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfNTEyICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8yIHwgUkNDX0NGR1JfSFBSRV8xIHwgUkNDX0NGR1JfSFBSRV8wKSAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDUxMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQVBCMV9ESVYgIEFQQiBsb3ctc3BlZWQgcHJlc2NhbGVyIChBUEIxKQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl8xICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfNCAgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFXzIgfCBSQ0NfQ0ZHUl9QUFJFXzApICAgICAgICAgICAgICAgICAgIC8qITwgSENMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzggICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfUFBSRV8yIHwgUkNDX0NGR1JfUFBSRV8xKSAgICAgICAgICAgICAgICAgICAvKiE8IEhDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl8xNiAgICAgICAgICAgICAgICAgKFJDQ19DRkdSX1BQUkVfMiB8IFJDQ19DRkdSX1BQUkVfMSB8IFJDQ19DRkdSX1BQUkVfMCkgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0hTSV9ESVYgIEhTSSBkaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSFNJX0RJVl8xICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19IU0lfRElWXzIgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19IU0lfRElWXzQgICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19IU0lfRElWXzggICAgICAgICAgICAgICAgICAoUkNDX0NSX0hTSURJVl8xIHwgUkNDX0NSX0hTSURJVl8wKSAgICAgICAgLyohPCBIU0kgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19IU0lfRElWXzE2ICAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfSFNJX0RJVl8zMiAgICAgICAgICAgICAgICAgKFJDQ19DUl9IU0lESVZfMiB8IFJDQ19DUl9IU0lESVZfMCkgICAgICAgIC8qITwgSFNJIGRpdmlkZWQgYnkgMzIgKi8KKyNkZWZpbmUgTExfUkNDX0hTSV9ESVZfNjQgICAgICAgICAgICAgICAgIChSQ0NfQ1JfSFNJRElWXzIgfCBSQ0NfQ1JfSFNJRElWXzEpICAgICAgICAvKiE8IEhTSSBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1JDQ19IU0lfRElWXzEyOCAgICAgICAgICAgICAgICBSQ0NfQ1JfSFNJRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0kgZGl2aWRlZCBieSAxMjggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFTT1VSQ0UgIE1DTzEgU09VUkNFIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX05PQ0xPQ0sgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNQ08gb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08gKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfMCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPU0VMXzB8IFJDQ19DRkdSX01DT1NFTF8xKSAvKiE8IEhTSTE2IHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0UgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF8yICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfMHxSQ0NfQ0ZHUl9NQ09TRUxfMikgIC8qITwgTWFpbiBQTEwgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTSSAgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8xfFJDQ19DRkdSX01DT1NFTF8yKSAgLyohPCBMU0kgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8wfFJDQ19DRkdSX01DT1NFTF8xfFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFfRElWICBNQ08xIHByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNQ08xIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNQ08xIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfNCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1BSRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPMSBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzggICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzEgfCBSQ0NfQ0ZHUl9NQ09QUkVfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTzEgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xNiAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNQ08xIGRpdmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzMyICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzIgfCBSQ0NfQ0ZHUl9NQ09QUkVfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTzEgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfNjQgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09QUkVfMiB8IFJDQ19DRkdSX01DT1BSRV8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPMSBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xMjggICAgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1BSRV8yIHwgUkNDX0NGR1JfTUNPUFJFXzEgfCBSQ0NfQ0ZHUl9NQ09QUkVfMCkgLyohPCBNQ08xIGRpdmlkZWQgYnkgMTI4ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QRVJJUEhfRlJFUVVFTkNZIFBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IE5vIGNsb2NrIGVuYWJsZWQgZm9yIHRoZSBwZXJpcGhlcmFsICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkEgICAgICAgIDB4RkZGRkZGRkZVICAgICAgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBjYW5ub3QgYmUgcHJvdmlkZWQgYXMgZXh0ZXJuYWwgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQVJUeF9DTEtTT1VSQ0UgIFBlcmlwaGVyYWwgVVNBUlQgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsxICAgICAgKChSQ0NfQ0NJUFJfVVNBUlQxU0VMIDw8IDE2VSkgfCAweDAwMDAwMDAwVSkgICAgICAgICAgICAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsgICAgICgoUkNDX0NDSVBSX1VTQVJUMVNFTCA8PCAxNlUpIHwgUkNDX0NDSVBSX1VTQVJUMVNFTF8wKSAgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBVU0FSVDEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSSAgICAgICAgKChSQ0NfQ0NJUFJfVVNBUlQxU0VMIDw8IDE2VSkgfCBSQ0NfQ0NJUFJfVVNBUlQxU0VMXzEpICAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFICAgICAgICAoKFJDQ19DQ0lQUl9VU0FSVDFTRUwgPDwgMTZVKSB8IFJDQ19DQ0lQUl9VU0FSVDFTRUwpICAgIC8qITwgTFNFIGNsb2NrIHVzZWQgYXMgVVNBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9QQ0xLMSAgICAgICgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgMHgwMDAwMDAwMFUpICAgICAgICAgICAgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLICAgICAoKFJDQ19DQ0lQUl9VU0FSVDJTRUwgPDwgMTZVKSB8IFJDQ19DQ0lQUl9VU0FSVDJTRUxfMCkgIC8qITwgU1lTQ0xLIGNsb2NrIHVzZWQgYXMgVVNBUlQyIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9IU0kgICAgICAgICgoUkNDX0NDSVBSX1VTQVJUMlNFTCA8PCAxNlUpIHwgUkNDX0NDSVBSX1VTQVJUMlNFTF8xKSAgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBVU0FSVDIgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0xTRSAgICAgICAgKChSQ0NfQ0NJUFJfVVNBUlQyU0VMIDw8IDE2VSkgfCBSQ0NfQ0NJUFJfVVNBUlQyU0VMKSAgICAvKiE8IExTRSBjbG9jayB1c2VkIGFzIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKExQVUFSVDEpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFVBUlQxX0NMS1NPVVJDRSBQZXJpcGhlcmFsIExQVUFSVCBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzAgICAgICAgICAgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzEgICAgICAgICAgLyohPCBIU0kgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMICAgICAgICAgICAgLyohPCBMU0UgY2xvY2sgdXNlZCBhcyBMUFVBUlQxIGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBMUFVBUlQxICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQzFfQ0xLU09VUkNFIFBlcmlwaGVyYWwgSTJDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzEgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPCBQQ0xLMSBjbG9jayB1c2VkIGFzIEkyQzEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsgICAgICAgUkNDX0NDSVBSX0kyQzFTRUxfMCAgICAgICAgICAvKiE8IFNZU0NMSyBjbG9jayB1c2VkIGFzIEkyQzEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9IU0kgICAgICAgICAgUkNDX0NDSVBSX0kyQzFTRUxfMSAgICAgICAgICAvKiE8IEhTSSBjbG9jayB1c2VkIGFzIEkyQzEgY2xvY2sgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19JMlMxX0NMS1NPVVJDRSBQZXJpcGhlcmFsIEkyUyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0kyUzFfQ0xLU09VUkNFX1NZU0NMSyAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgY2xvY2sgdXNlZCBhcyBJMlMxIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfSTJTMV9DTEtTT1VSQ0VfUExMICAgICAgICAgUkNDX0NDSVBSX0kyUzFTRUxfMCAgICAgICAgICAvKiE8IFBMTCBjbG9jayB1c2VkIGFzIEkyUzEgY2xvY2sgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9IU0kgICAgICAgICBSQ0NfQ0NJUFJfSTJTMVNFTF8xICAgICAgICAgIC8qITwgSFNJIGNsb2NrIHVzZWQgYXMgSTJTMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX0kyUzFfQ0xLU09VUkNFX1BJTiAgICAgICAgIFJDQ19DQ0lQUl9JMlMxU0VMICAgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayB1c2VkIGFzIEkyUzEgY2xvY2sgc291cmNlICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTFTRUwpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19USU14X0NMS1NPVVJDRSBQZXJpcGhlcmFsIFRJTSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BDTEsxICAgICAgICAoUkNDX0NDSVBSX1RJTTFTRUwgICB8ICgweDAwMDAwMDAwVSA+PiAxNlUpKSAgICAgICAgICAvKiE8IFBDTEsxIGNsb2NrIHVzZWQgYXMgVElNMSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BMTCAgICAgICAgICAoUkNDX0NDSVBSX1RJTTFTRUwgICB8IChSQ0NfQ0NJUFJfVElNMVNFTCA+PiAxNlUpKSAgICAvKiE8IFBMTCB1c2VkIGFzIFRJTTEgY2xvY2sgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xNVNFTCkKKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfRUNfVElNeF9DTEtTT1VSQ0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BDTEsxICAgICAgIChSQ0NfQ0NJUFJfVElNMTVTRUwgIHwgKDB4MDAwMDAwMDBVID4+IDE2VSkpICAgICAgICAgIC8qITwgUENMSzEgY2xvY2sgdXNlZCBhcyBUSU0xNSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1RJTTE1X0NMS1NPVVJDRV9QTEwgICAgICAgICAoUkNDX0NDSVBSX1RJTTE1U0VMICB8IChSQ0NfQ0NJUFJfVElNMTVTRUwgPj4gMTZVKSkgICAvKiE8IFBMTCB1c2VkIGFzIFRJTTE1IGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKworI2lmIGRlZmluZWQoTFBUSU0xKSAmJiBkZWZpbmVkKExQVElNMikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVElNeF9DTEtTT1VSQ0UgUGVyaXBoZXJhbCBMUFRJTSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEgICAgICAoUkNDX0NDSVBSX0xQVElNMVNFTCB8ICgweDAwMDAwMDAwVSA+PiAxNlUpKSAgICAgICAgICAgLyohPCBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJICAgICAgICAoUkNDX0NDSVBSX0xQVElNMVNFTCB8IChSQ0NfQ0NJUFJfTFBUSU0xU0VMXzAgPj4gMTZVKSkgLyohPCBMU0kgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0hTSSAgICAgICAgKFJDQ19DQ0lQUl9MUFRJTTFTRUwgfCAoUkNDX0NDSVBSX0xQVElNMVNFTF8xID4+IDE2VSkpIC8qITwgSFNJIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UgICAgICAgIChSQ0NfQ0NJUFJfTFBUSU0xU0VMIHwgKFJDQ19DQ0lQUl9MUFRJTTFTRUwgPj4gMTZVKSkgICAvKiE8IExTRSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfUENMSzEgICAgICAoUkNDX0NDSVBSX0xQVElNMlNFTCB8ICgweDAwMDAwMDAwVSA+PiAxNlUpKSAgICAgICAgICAgLyohPCBQQ0xLMSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNJICAgICAgICAoUkNDX0NDSVBSX0xQVElNMlNFTCB8IChSQ0NfQ0NJUFJfTFBUSU0yU0VMXzAgPj4gMTZVKSkgLyohPCBMU0kgc2VsZWN0ZWQgYXMgTFBUSU0yIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0hTSSAgICAgICAgKFJDQ19DQ0lQUl9MUFRJTTJTRUwgfCAoUkNDX0NDSVBSX0xQVElNMlNFTF8xID4+IDE2VSkpIC8qITwgSFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0UgICAgICAgIChSQ0NfQ0NJUFJfTFBUSU0yU0VMIHwgKFJDQ19DQ0lQUl9MUFRJTTJTRUwgPj4gMTZVKSkgICAvKiE8IExTRSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogTFBUSU0xICYmIExQVElNMiovCisKKyNpZiBkZWZpbmVkKENFQykKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0NFQ19DTEtTT1VSQ0VfSFNJIFBlcmlwaGVyYWwgQ0VDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0VDX0NMS1NPVVJDRV9IU0lfRElWNDg4ICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSA0ODggdXNlZCBhcyBDRUMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0NFQ19DTEtTT1VSQ0VfTFNFICAgICAgICAgICBSQ0NfQ0NJUFJfQ0VDU0VMICAgICAgICAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgQ0VDIGNsb2NrICovCisKKy8qKgorICAqIEB9CisqLworI2VuZGlmIC8qIENFQyAqLworCisjaWYgZGVmaW5lZChSTkcpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19STkdfQ0xLU09VUkNFIFBlcmlwaGVyYWwgUk5HIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JOR19DTEtTT1VSQ0VfSFNJX0RJVjggICAgICBSQ0NfQ0NJUFJfUk5HU0VMXzAgICAgICAgICAgICAvKiE8IEhTSSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgOCB1c2VkIGFzIFJORyBjbG9jaywgYXZhaWxhYmxlIG9uIGN1dDIuMCAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9TWVNDTEsgICAgICAgIFJDQ19DQ0lQUl9STkdTRUxfMSAgICAgICAgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMSB1c2VkIGFzIFJORyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwgICAgICAgICAgIFJDQ19DQ0lQUl9STkdTRUwgICAgICAgICAgICAgIC8qITwgUExMIHVzZWQgYXMgUk5HIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJORyAqLworCisjaWYgZGVmaW5lZChSTkcpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19STkdfQ0xLX0RJViBQZXJpcGhlcmFsIFJORyBjbG9jayBkaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS19ESVYxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAvKiE8IFJORyBjbG9jayBub3QgZGl2aWRlZCAgKi8KKyNkZWZpbmUgTExfUkNDX1JOR19DTEtfRElWMiAgICAgICAgICAgICAgICBSQ0NfQ0NJUFJfUk5HRElWXzAgICAgICAgICAgICAgLyohPCBSTkcgY2xvY2sgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19STkdfQ0xLX0RJVjQgICAgICAgICAgICAgICAgUkNDX0NDSVBSX1JOR0RJVl8xICAgICAgICAgICAgIC8qITwgUk5HIGNsb2NrIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS19ESVY4ICAgICAgICAgICAgICAgIFJDQ19DQ0lQUl9STkdESVYgICAgICAgICAgICAgICAvKiE8IFJORyBjbG9jayBkaXZpZGVkIGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogUk5HICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FEQ19DTEtTT1VSQ0UgUGVyaXBoZXJhbCBBREMgY2xvY2sgc291cmNlIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BRENfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgLyohPCBTWVNDTEsgdXNlZCBhcyBBREMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTT1VSQ0VfUExMICAgICAgICAgIFJDQ19DQ0lQUl9BRENTRUxfMCAgICAgICAgICAgICAvKiE8IFBMTCB1c2VkIGFzIEFEQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfQURDX0NMS1NPVVJDRV9IU0kgICAgICAgICAgIFJDQ19DQ0lQUl9BRENTRUwgICAgICAgICAgICAgIC8qITwgSFNJIHVzZWQgYXMgQURDIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0FSVHggUGVyaXBoZXJhbCBVU0FSVHggZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFICAgICAgICAgICAgUkNDX0NDSVBSX1VTQVJUMVNFTCAvKiE8IFVTQVJUMSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFICAgICAgICAgICAgUkNDX0NDSVBSX1VTQVJUMlNFTCAvKiE8IFVTQVJUMiBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChMUFVBUlQxKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfTFBVQVJUMSBQZXJpcGhlcmFsIExQVUFSVCBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFICAgICAgICAgICBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAvKiE8IExQVUFSVDEgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBMUFVBUlQxICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQzEgUGVyaXBoZXJhbCBJMkMgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRSAgICAgICAgICAgICAgUkNDX0NDSVBSX0kyQzFTRUwgLyohPCBJMkMxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyUzEgUGVyaXBoZXJhbCBJMlMgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19JMlMxX0NMS1NPVVJDRSAgICAgICAgICAgICAgUkNDX0NDSVBSX0kyUzFTRUwgLyohPCBJMlMxIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVElNeCBQZXJpcGhlcmFsIFRJTXggZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19USU0xX0NMS1NPVVJDRSAgICAgICAgICAgICAgUkNDX0NDSVBSX1RJTTFTRUwgICAvKiE8IFRJTTEgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTE1U0VMKQorI2RlZmluZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFICAgICAgICAgICAgIFJDQ19DQ0lQUl9USU0xNVNFTCAgLyohPCBUSU0xNSBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTE1U0VMICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICovCisKKyNpZiBkZWZpbmVkKExQVElNMSkgJiYgZGVmaW5lZChMUFRJTTIpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFRJTTEgUGVyaXBoZXJhbCBMUFRJTSBnZXQgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UgICAgICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0xU0VMIC8qITwgTFBUSU0yIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UgICAgICAgICAgICBSQ0NfQ0NJUFJfTFBUSU0yU0VMIC8qITwgTFBUSU0yIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogTFBUSU0xICYmIExQVElNMiAqLworCisjaWYgZGVmaW5lZChDRUMpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19DRUMgUGVyaXBoZXJhbCBDRUMgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19DRUNfQ0xLU09VUkNFICAgICAgICAgICAgICAgUkNDX0NDSVBSX0NFQ1NFTCAgICAgICAgLyohPCBDRUMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIGRlZmluZWQoUk5HKQorLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUk5HIFBlcmlwaGVyYWwgUk5HIGdldCBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRSAgICAgICAgICAgICAgIFJDQ19DQ0lQUl9STkdTRUwgICAgICAgIC8qITwgUk5HIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JOR19ESVYgUGVyaXBoZXJhbCBSTkcgZ2V0IGNsb2NrIGRpdmlzaW9uIGZhY3RvcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19STkdfQ0xLRElWICAgICAgICAgICAgICAgICAgUkNDX0NDSVBSX1JOR0RJViAgICAgICAgLyohPCBSTkcgQ2xvY2sgZGl2aXNpb24gZmFjdG9yICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFJORyAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BREMgUGVyaXBoZXJhbCBBREMgZ2V0IGNsb2NrIHNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BRENfQ0xLU09VUkNFICAgICAgICAgICAgICAgUkNDX0NDSVBSX0FEQ1NFTCAgICAgICAgLyohPCBBREMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUlRDX0NMS1NPVVJDRSAgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfMCAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSSAgICAgICAgICAgUkNDX0JEQ1JfUlRDU0VMXzEgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIgICAgIFJDQ19CRENSX1JUQ1NFTCAgICAgICAgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAzMiB1c2VkIGFzIFJUQyBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExTT1VSQ0UgIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0kgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNJICAvKiE8IEhTSTE2IGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0UgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNFICAvKiE8IEhTRSBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExNX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMTSkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzIgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTV8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTE1fMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgMyAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNCAgICAgICAgICAgICAgICAgICgoUkNDX1BMTENGR1JfUExMTV8xIHwgUkNDX1BMTENGR1JfUExMTV8wKSkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzUgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTV8yKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl82ICAgICAgICAgICAgICAgICAgKChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzApKSAvKiE8IFBMTCBkaXZpc2lvbiBmYWN0b3IgYnkgNiAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNyAgICAgICAgICAgICAgICAgICgoUkNDX1BMTENGR1JfUExMTV8yIHwgUkNDX1BMTENGR1JfUExMTV8xKSkgLyohPCBQTEwgZGl2aXNpb24gZmFjdG9yIGJ5IDcgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzggICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGRpdmlzaW9uIGZhY3RvciBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExSX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUikKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfMiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExSX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFJfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8xfFJDQ19QTExDRkdSX1BMTFJfMCkgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfNSAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSXzIpICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExSX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFJfMnxSQ0NfUExMQ0ZHUl9QTExSXzApICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8yfFJDQ19QTExDRkdSX1BMTFJfMSkgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExQX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUCkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfNSAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMHxSQ0NfUExMQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMikgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl85ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDkgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEwICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzExICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEyICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEzICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE0ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTQgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE1ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE2ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zKS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTcgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTggICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTkgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzF8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjEgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjIgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMiAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjMgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzF8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjQgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI0ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfM3xSQ0NfUExMQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI1ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNiAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMHxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI2ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNyAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI3Ki8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI4ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjkgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMzAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfM3xSQ0NfUExMQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDMwICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zMSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzMyICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzIgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExRX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUSkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfMiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzApICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfMyAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgMyAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzF8UkNDX1BMTENGR1JfUExMUV8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNSAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgNSAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzJ8UkNDX1BMTENGR1JfUExMUV8wKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgNiAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfNyAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRXzJ8UkNDX1BMTENGR1JfUExMUV8xKSAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUV9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExRKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUSBvdXRwdXQgYnkgOCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfTWFjcm9zIFJDQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFJDQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKChSQ0MtPl9fUkVHX18pLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1JDQ19SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKFJDQy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX0NBTENfRlJFUSBDYWxjdWxhdGUgZnJlcXVlbmNpZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTENMSyBmcmVxdWVuY3kgb24gc3lzdGVtIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEgKEhTRV9WQUxVRSxAcmVmIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSwKKyAgKiAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfR2V0TiAoKSwgQHJlZiBMTF9SQ0NfUExMX0dldFIgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBIU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NgorICAqIEBwYXJhbSAgX19QTExSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfOAorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFJfXykgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTE5fXykgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX1BMTFJfXykgPj4gUkNDX1BMTENGR1JfUExMUl9Qb3MpICsgMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTFBDTEsgZnJlcXVlbmN5IHVzZWQgb24gSTJTIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX0kyUzFfRlJFUSAoSFNFX1ZBTFVFLEByZWYgTExfUkNDX1BMTF9HZXREaXZpZGVyICgpLAorICAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0UCAoKSk7CisgICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzIKKyAgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTENMS19JMlMxX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFBfXykgKChfX0lOUFVURlJFUV9fKSAgKiAoX19QTExOX18pIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgKCgoX19QTExQX18pID4+IFJDQ19QTExDRkdSX1BMTFBfUG9zKSArIDFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExQQ0xLIGZyZXF1ZW5jeSB1c2VkIG9uIEFEQyBkb21haW4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19BRENfRlJFUSAoSFNFX1ZBTFVFLEByZWYgTExfUkNDX1BMTF9HZXREaXZpZGVyICgpLAorICAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0UCAoKSk7CisgICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzIKKyAgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTENMS19BRENfRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1fXywgX19QTExOX18sIF9fUExMUF9fKSAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMTl9fKSAvICgoKChfX1BMTE1fXyk+PiBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKyAxVSkpIC8gXAorICAgICAgICAgICAgICAgICAgICgoKF9fUExMUF9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExQX1BvcykgKyAxVSkpCisKKyNpZiBkZWZpbmVkKFJORykKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUExMUUNMSyBmcmVxdWVuY3kgdXNlZCBvbiBSTkcgZG9tYWluCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExDTEtfUk5HX0ZSRVEgKEhTRV9WQUxVRSxAcmVmIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSwKKyAgKiAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfR2V0TiAoKSwgQHJlZiBMTF9SQ0NfUExMX0dldFEgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBIU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NgorICAqIEBwYXJhbSAgX19QTExRX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX1JOR19GUkVRKF9fSU5QVVRGUkVRX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExRX18pICgoX19JTlBVVEZSRVFfXykgKiAoX19QTExOX18pIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgKCgoX19QTExRX18pID4+IFJDQ19QTExDRkdSX1BMTFFfUG9zKSArIDFVKSkKKyNlbmRpZiAvKiBSTkcgKi8KKworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUExMUUNMSyBmcmVxdWVuY3kgdXNlZCBvbiBUSU0xIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX1RJTTFfRlJFUSAoSFNFX1ZBTFVFLEByZWYgTExfUkNDX1BMTF9HZXREaXZpZGVyICgpLAorICAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0USAoKSk7CisgICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIEhTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFFfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl84CisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfVElNMV9GUkVRKF9fSU5QVVRGUkVRX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExRX18pICgoX19JTlBVVEZSRVFfXykgKiAoX19QTExOX18pIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgKCgoX19QTExRX18pID4+IFJDQ19QTExDRkdSX1BMTFFfUG9zKSArIDFVKSkKKyNpZiBkZWZpbmVkKFRJTTE1KQorLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExRQ0xLIGZyZXF1ZW5jeSB1c2VkIG9uIFRJTTE1IGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX1RJTTE1X0ZSRVEgKEhTRV9WQUxVRSxAcmVmIExMX1JDQ19QTExfR2V0RGl2aWRlciAoKSwKKyAgKiAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfR2V0TiAoKSwgQHJlZiBMTF9SQ0NfUExMX0dldFEgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBIU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NgorICAqIEBwYXJhbSAgX19QTExRX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMQ0xLX1RJTTE1X0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFFfXykgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTE5fXykgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX1BMTFFfXykgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpKQorI2VuZGlmIC8qIFRJTTE1ICovCisjZW5kaWYgLyogUkNDX1BMTFFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIEhDTEsgZnJlcXVlbmN5CisgICogQHBhcmFtICBfX1NZU0NMS0ZSRVFfXyBTWVNDTEsgZnJlcXVlbmN5IChiYXNlZCBvbiBIU0UvSFNJL1BMTENMSykKKyAgKiBAcGFyYW0gIF9fQUhCUFJFU0NBTEVSX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqIEByZXR2YWwgSENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX0hDTEtfRlJFUShfX1NZU0NMS0ZSRVFfXyxfX0FIQlBSRVNDQUxFUl9fKSAoKF9fU1lTQ0xLRlJFUV9fKSA+PiAoQUhCUHJlc2NUYWJsZVsoKF9fQUhCUFJFU0NBTEVSX18pICYgUkNDX0NGR1JfSFBSRSkgPj4gIFJDQ19DRkdSX0hQUkVfUG9zXSAmIDB4MUZVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQQ0xLMSBmcmVxdWVuY3kgKEFCUDEpCisgICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fQVBCMVBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMTYKKyAgKiBAcmV0dmFsIFBDTEsxIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzFfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMVBSRVNDQUxFUl9fKSAoKF9fSENMS0ZSRVFfXykgPj4gKEFQQlByZXNjVGFibGVbKF9fQVBCMVBSRVNDQUxFUl9fKSA+PiAgUkNDX0NGR1JfUFBSRV9Qb3NdICYgMHgxRlUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIEhTSVNZUyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fSFNJRElWX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMTI4CisgICogQHJldHZhbCBIU0lTWVMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19IU0lfRlJFUShfX0hTSURJVl9fKSAoSFNJX1ZBTFVFIC8gKDFVIDw8ICgoX19IU0lESVZfXyk+PiBSQ0NfQ1JfSFNJRElWX1BvcykpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9IU0UgSFNFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDU1NPTiAgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0VuYWJsZUNTUyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9DU1NPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9FbmFibGVCeXBhc3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRW5hYmxlQnlwYXNzKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRUJZUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0UgZXh0ZXJuYWwgb3NjaWxsYXRvciAoSFNFIEJ5cGFzcykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VCWVAgICAgICAgIExMX1JDQ19IU0VfRGlzYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTRSBjcnlzdGFsIG9zY2lsbGF0b3IgKEhTRSBPTikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VPTiAgICAgICAgIExMX1JDQ19IU0VfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTRSBvc2NpbGxhdG9yIFJlYWR5CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFUkRZICAgICAgICBMTF9SQ0NfSFNFX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNFX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgPT0gKFJDQ19DUl9IU0VSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTSSBIU0kKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgZXZlbiBpbiBzdG9wIG1vZGUKKyAgKiBAbm90ZSBIU0kgb3NjaWxsYXRvciBpcyBmb3JjZWQgT04gZXZlbiBpbiBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRW5hYmxlSW5TdG9wTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSBpbiBzdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lLRVJPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIGluIHN0b3AgbW9kZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJS0VST04gICAgICAgIExMX1JDQ19IU0lfSXNFbmFibGVkSW5TdG9wTW9kZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0lfSXNFbmFibGVkSW5TdG9wTW9kZSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJS0VST04pID09IChSQ0NfQ1JfSFNJS0VST04pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTSSBvc2NpbGxhdG9yCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNJIG9zY2lsbGF0b3IKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lPTiAgICAgICAgIExMX1JDQ19IU0lfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTSSBjbG9jayBpcyByZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSVJEWSAgICAgICAgTExfUkNDX0hTSV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IChSQ0NfQ1JfSFNJUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBIU0kgQ2FsaWJyYXRpb24gdmFsdWUKKyAgKiBAbm90ZSBXaGVuIEhTSVRSSU0gaXMgd3JpdHRlbiwgSFNJQ0FMIGlzIHVwZGF0ZWQgd2l0aCB0aGUgc3VtIG9mCisgICogICAgICAgSFNJVFJJTSBhbmQgdGhlIGZhY3RvcnkgdHJpbSB2YWx1ZQorICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSUNBTCAgICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbgorICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0lfR2V0Q2FsaWJyYXRpb24odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSUNBTCkgPj4gUkNDX0lDU0NSX0hTSUNBTF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBIU0kgQ2FsaWJyYXRpb24gdHJpbW1pbmcKKyAgKiBAbm90ZSB1c2VyLXByb2dyYW1tYWJsZSB0cmltbWluZyB2YWx1ZSB0aGF0IGlzIGFkZGVkIHRvIHRoZSBIU0lDQUwKKyAgKiBAbm90ZSBEZWZhdWx0IHZhbHVlIGlzIDY0LCB3aGljaCwgd2hlbiBhZGRlZCB0byB0aGUgSFNJQ0FMIHZhbHVlLAorICAqICAgICAgIHNob3VsZCB0cmltIHRoZSBIU0kgdG8gMTYgTUh6ICsvLSAxICUKKyAgKiBAcm10b2xsIElDU0NSICAgICAgICBIU0lUUklNICAgICAgIExMX1JDQ19IU0lfU2V0Q2FsaWJUcmltbWluZworICAqIEBwYXJhbSAgVmFsdWUgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcodWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0sIFZhbHVlIDw8IFJDQ19JQ1NDUl9IU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9HZXRDYWxpYlRyaW1taW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMjcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJX0dldENhbGliVHJpbW1pbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX0hTSVRSSU0pID4+IFJDQ19JQ1NDUl9IU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0xTRSBMU0UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSAgTG93IFNwZWVkIEV4dGVybmFsIChMU0UpIGNyeXN0YWwuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFT04gICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlICBMb3cgU3BlZWQgRXh0ZXJuYWwgKExTRSkgY3J5c3RhbC4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VPTiAgICAgICAgIExMX1JDQ19MU0VfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgc291cmNlIChMU0UgYnlwYXNzKS4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VCWVAgICAgICAgIExMX1JDQ19MU0VfRW5hYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0VuYWJsZUJ5cGFzcyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAoTFNFIGJ5cGFzcykuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFQllQICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGVCeXBhc3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRGlzYWJsZUJ5cGFzcyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgICogQG5vdGUgVGhlIG9zY2lsbGF0b3IgaXMgaW4gWHRhbCBtb2RlIHdoZW4gaXQgaXMgbm90IGluIGJ5cGFzcyBtb2RlLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRURSViAgICAgICAgTExfUkNDX0xTRV9TZXREcml2ZUNhcGFiaWxpdHkKKyAgKiBAcGFyYW0gIExTRURyaXZlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eSh1aW50MzJfdCBMU0VEcml2ZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRURSViwgTFNFRHJpdmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0dldERyaXZlQ2FwYWJpbGl0eSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRURSVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gb24gTFNFLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9FbmFibGVDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRW5hYmxlQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gb24gTFNFLgorICAqIEBub3RlIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBjYW4gYmUgZGlzYWJsZWQgb25seSBhZnRlciBhIExTRQorICAqICAgICAgIGZhaWx1cmUgZGV0ZWN0aW9uLiBJbiB0aGF0IGNhc2UgaXQgTVVTVCBiZSBkaXNhYmxlZCBieSBzb2Z0d2FyZS4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VDU1NPTiAgICAgIExMX1JDQ19MU0VfRGlzYWJsZUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQ1NTKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0Ugb3NjaWxsYXRvciBSZWFkeQorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRVJEWSAgICAgICAgTExfUkNDX0xTRV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSA9PSAoUkNDX0JEQ1JfTFNFUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENTUyBvbiBMU0UgZmFpbHVyZSBEZXRlY3Rpb24KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VDU1NEICAgICAgIExMX1JDQ19MU0VfSXNDU1NEZXRlY3RlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0VfSXNDU1NEZXRlY3RlZCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU0QpID09IChSQ0NfQkRDUl9MU0VDU1NEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0kgTFNJCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNJIE9zY2lsbGF0b3IKKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBMU0lPTiAgICAgICAgIExMX1JDQ19MU0lfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSSBPc2NpbGxhdG9yCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgTFNJT04gICAgICAgICBMTF9SQ0NfTFNJX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0lfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTSSBpcyBSZWFkeQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSVJEWSAgICAgICAgTExfUkNDX0xTSV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTSV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgPT0gKFJDQ19DU1JfTFNJUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0NPIExTQ08KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBMb3cgc3BlZWQgY2xvY2sKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPRU4gICAgICAgIExMX1JDQ19MU0NPX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTQ09fRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTG93IHNwZWVkIGNsb2NrCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNDT0VOICAgICAgICBMTF9SQ0NfTFNDT19EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNDT19EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIExvdyBzcGVlZCBjbG9jayBzZWxlY3Rpb24KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPU0VMICAgICAgIExMX1JDQ19MU0NPX1NldFNvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX1NldFNvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPU0VMLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBMb3cgc3BlZWQgY2xvY2sgc2VsZWN0aW9uCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNDT1NFTCAgICAgICBMTF9SQ0NfTFNDT19HZXRTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0NPX0NMS1NPVVJDRV9MU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNDT19HZXRTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0NPU0VMKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1N5c3RlbSBTeXN0ZW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNXICAgICAgICAgICAgTExfUkNDX1NldFN5c0Nsa1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfUExMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfTFNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNXUyAgICAgICAgICAgTExfUkNDX0dldFN5c0Nsa1NvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0xTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRTeXNDbGtTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TV1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUhCIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQVBCMSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFICAgICAgICAgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBIU0kxNiBkaXZpc2lvbiBmYWN0b3IKKyAgKiBAcm10b2xsIENSICAgICAgICAgSFNJRElWICAgICAgICAgIExMX1JDQ19TZXRIU0lEaXYKKyAgKiBAbm90ZSAgSFNJRElWIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpZWQgdG8gU1lTQ0xLX0ZyZXF1ZW5jeSB3aGVuIEhTSSBpcyB1c2VkIGFzCisgICogc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIEhTSURpdiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfMTI4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0SFNJRGl2KHVpbnQzMl90IEhTSURpdikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWLCBIU0lEaXYpOworfQorLyoqCisgICogQGJyaWVmICBHZXQgQUhCIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX0dldEFIQlByZXNjYWxlcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRBSEJQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFQQjEgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRSAgICAgICAgIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFQQjFQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTSTE2IERpdmlzaW9uIGZhY3RvcgorICAqIEBybXRvbGwgQ1IgICAgICAgICBIU0lESVYgICAgICAgICBMTF9SQ0NfR2V0SFNJRGl2CisgICogQG5vdGUgIEhTSURJViBwYXJhbWV0ZXIgaXMgb25seSBhcHBsaWVkIHRvIFNZU0NMS19GcmVxdWVuY3kgd2hlbiBIU0kgaXMgdXNlZCBhcworICAqIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0lfRElWXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTSV9ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNJX0RJVl8xMjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0SFNJRGl2KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lESVYpKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX01DTyBNQ08KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBNQ094CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgTUNPU0VMICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBNQ09QUkUgICAgICAgIExMX1JDQ19Db25maWdNQ08KKyAgKiBAcGFyYW0gIE1DT3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfUExMQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTFNFCisgICogQHBhcmFtICBNQ094UHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19Db25maWdNQ08odWludDMyX3QgTUNPeFNvdXJjZSwgdWludDMyX3QgTUNPeFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX01DT1NFTCB8IFJDQ19DRkdSX01DT1BSRSwgTUNPeFNvdXJjZSB8IE1DT3hQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9QZXJpcGhlcmFsX0Nsb2NrX1NvdXJjZSBQZXJpcGhlcmFsIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFVTQVJUeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBVU0FSVHhTRUwgICAgIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlCisgICogQHBhcmFtICBVU0FSVHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfTFNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgKFVTQVJUeFNvdXJjZSA+PiAxNlUpLCAoVVNBUlR4U291cmNlICYgMHgwMDAwRkZGRlUpKTsKK30KKworI2lmIGRlZmluZWQoTFBVQVJUMSkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIExQVUFSVDF4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVUFSVDFTRUwgICAgTExfUkNDX1NldExQVUFSVENsb2NrU291cmNlCisgICogQHBhcmFtICBMUFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0TFBVQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgTFBVQVJUeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCwgTFBVQVJUeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogTFBVQVJUMSAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEkyQzFTRUwgICAgICAgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMkN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9IU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRJMkNDbG9ja1NvdXJjZSh1aW50MzJfdCBJMkN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9JMkMxU0VMLCBJMkN4U291cmNlKTsKK30KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTFTRUwpIHx8IGRlZmluZWQoUkNDX0NDSVBSX1RJTTE1U0VMKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVElNeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBUSU14U0VMICAgICAgIExMX1JDQ19TZXRUSU1DbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiBAaWYgZGVmaW5lZChTVE0zMkcwODF4eCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNV9DTEtTT1VSQ0VfUENMSzEKKyAgKiBAZW5kaWYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBUSU14U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChUSU14U291cmNlICYgMHhGRkZGMDAwMFUpLCAoVElNeFNvdXJjZSA8PCAxNikpOworfQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICYmIFJDQ19DQ0lQUl9USU0xNVNFTCAqLworCisjaWYgZGVmaW5lZChMUFRJTTEpICYmIGRlZmluZWQoTFBUSU0yKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTFBUSU14IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVElNeFNFTCAgICAgTExfUkNDX1NldExQVElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlKHVpbnQzMl90IExQVElNeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCAoTFBUSU14U291cmNlICYgMHhGRkZGMDAwMFUpLCAoTFBUSU14U291cmNlIDw8IDE2VSkpOworfQorI2VuZGlmIC8qIExQVElNMSAmJiBMUFRJTTIgKi8KKworI2lmIGRlZmluZWQoQ0VDKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQ0VDIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIENFQ1NFTCAgICAgICAgTExfUkNDX1NldENFQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBDRUN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NFQ19DTEtTT1VSQ0VfSFNJX0RJVjQ4OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19DRUNfQ0xLU09VUkNFX0xTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldENFQ0Nsb2NrU291cmNlKHVpbnQzMl90IENFQ3hTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0NFQ1NFTCwgQ0VDeFNvdXJjZSk7Cit9CisjZW5kaWYgLyogQ0VDICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9STkdESVYpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBSTkcgZGl2aXNpb24gZmFjdG9yCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgUk5HRElWICAgICAgICBMTF9SQ0NfU2V0Uk5HQ2xvY2tEaXYKKyAgKiBAcGFyYW0gIFJOR3hEaXYgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS19ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS19ESVY4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0Uk5HQ2xvY2tEaXYodWludDMyX3QgUk5HeERpdikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfUk5HRElWLCBSTkd4RGl2KTsKK30KKyNlbmRpZiAvKiBSTkcgKi8KKworI2lmIGRlZmluZWQgKFJDQ19DQ0lQUl9STkdTRUwpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBSTkcgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgUk5HU0VMICAgICAgICBMTF9SQ0NfU2V0Uk5HQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFJOR3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0VfSFNJX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9QTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRSTkdDbG9ja1NvdXJjZSh1aW50MzJfdCBSTkd4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdTRUwsIFJOR3hTb3VyY2UpOworfQorI2VuZGlmIC8qIFJORyAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBBREMgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQURDU0VMICAgICAgICBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9IU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBRENDbG9ja1NvdXJjZSh1aW50MzJfdCBBREN4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9BRENTRUwsIEFEQ3hTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMlN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEkyUzFTRUwgICAgICAgTExfUkNDX1NldEkyU0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMlN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyUzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9QSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTMV9DTEtTT1VSQ0VfUExMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyUzFfQ0xLU09VUkNFX0hTSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEkyU0Nsb2NrU291cmNlKHVpbnQzMl90IEkyU3hTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0kyUzFTRUwsIEkyU3hTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBVU0FSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlQxU0VMICAgICBMTF9SQ0NfR2V0VVNBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNBUlR4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBVU0FSVHgpIHwgKFVTQVJUeCA8PCAxNlUpKTsKK30KKworI2lmIGRlZmluZWQgKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorLyoqCisgICogQGJyaWVmICBHZXQgTFBVQVJUeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFVBUlQxU0VMICAgIExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgTFBVQVJUeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tTb3VyY2UodWludDMyX3QgTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgTFBVQVJUeCkpOworfQorI2VuZGlmIC8qIExQVUFSVDEgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBJMkMxU0VMICAgICAgIExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgSTJDeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZSh1aW50MzJfdCBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBJMkN4KSk7Cit9CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKSB8fCBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xNVNFTCkKKy8qKgorICAqIEBicmllZiAgR2V0IFRJTXggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVElNeFNFTCAgICAgICBMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiBAaWYgZGVmaW5lZChTVE0zMkcwODF4eCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNV9DTEtTT1VSQ0VfUENMSzEKKyAgKiBAZW5kaWYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0VElNQ2xvY2tTb3VyY2UodWludDMyX3QgVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKFJDQy0+Q0NJUFIsIFRJTXgpID4+IDE2VSkgfCBUSU14KTsKK30KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMVNFTCB8fCBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKworI2lmIGRlZmluZWQoTFBUSU0xKSAmJiBkZWZpbmVkKExQVElNMikKKy8qKgorICAqIEBicmllZiAgR2V0IExQVElNeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFRJTXhTRUwgICAgIExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlCisgICogQHBhcmFtICBMUFRJTXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZSh1aW50MzJfdCBMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSQ0MtPkNDSVBSLCBMUFRJTXgpID4+IDE2VSkgfCBMUFRJTXgpOworfQorI2VuZGlmIC8qIExQVElNMSAmJiBMUFRJTTIgKi8KKworI2lmIGRlZmluZWQgKFJDQ19DQ0lQUl9DRUNTRUwpCisvKioKKyAgKiBAYnJpZWYgIEdldCBDRUMgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0VDU0VMICAgICAgICBMTF9SQ0NfR2V0Q0VDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIENFQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0VDX0NMS1NPVVJDRV9IU0lfRElWNDg4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NFQ19DTEtTT1VSQ0VfTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldENFQ0Nsb2NrU291cmNlKHVpbnQzMl90IENFQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIENFQ3gpKTsKK30KKyNlbmRpZiAvKiBDRUMgKi8KKworI2lmIGRlZmluZWQoUk5HKQorLyoqCisgICogQGJyaWVmICBHZXQgUk5HeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBSTkdTRUwgICAgICAgIExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgUk5HeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9IU0lfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZSh1aW50MzJfdCBSTkd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSTkd4KSk7Cit9CisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFJORykKKy8qKgorICAqIEBicmllZiAgR2V0IFJOR3ggY2xvY2sgZGl2aXNpb24gZmFjdG9yCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgUk5HRElWICAgICAgICBMTF9SQ0NfR2V0Uk5HQ2xvY2tEaXYKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtfRElWOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSTkdDbG9ja0Rpdih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfUk5HRElWKSk7Cit9CisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQ3ggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQURDU0VMICAgICAgICBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9TWVNDTEsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgQURDeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJMlN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEkyUyAgICAgICAgTExfUkNDX0dldEkyU0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMlN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyUzFfQ0xLU09VUkNFCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9QSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJTMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyUzFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9QTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0STJTQ2xvY2tTb3VyY2UodWludDMyX3QgSTJTeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgSTJTeCkpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUlRDIFJUQworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQyBDbG9jayBTb3VyY2UKKyAgKiBAbm90ZSBPbmNlIHRoZSBSVEMgY2xvY2sgc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkLCBpdCBjYW5ub3QgYmUgY2hhbmdlZCBhbnltb3JlIHVubGVzcworICAqICAgICAgIHRoZSBCYWNrdXAgZG9tYWluIGlzIHJlc2V0LCBvciB1bmxlc3MgYSBmYWlsdXJlIGlzIGRldGVjdGVkIG9uIExTRSAoTFNFQ1NTRCBpcworICAqICAgICAgIHNldCkuIFRoZSBCRFJTVCBiaXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlbS4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENTRUwgICAgICAgIExMX1JDQ19TZXRSVENDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRV9ESVYzMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCwgU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDIENsb2NrIFNvdXJjZQorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRDCisgICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDRU4gICAgICAgICBMTF9SQ0NfRW5hYmxlUlRDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlUlRDKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVEMKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19EaXNhYmxlUlRDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZVJUQyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9SVENFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUlRDIGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDRU4gICAgICAgICBMTF9SQ0NfSXNFbmFibGVkUlRDCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZFJUQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKSA9PSAoUkNDX0JEQ1JfUlRDRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19Gb3JjZUJhY2t1cERvbWFpblJlc2V0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldCh2b2lkKQoreworICBTRVRfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgdGhlIEJhY2t1cCBkb21haW4gcmVzZXQKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBCRFJTVCAgICAgICAgIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19SZWxlYXNlQmFja3VwRG9tYWluUmVzZXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfQkRSU1QpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX1BMTCBQTEwKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQTEwKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwKKyAgKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0gY2xvY2sKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExPTiAgICAgICAgIExMX1JDQ19QTExfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCBSZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBMTFJEWSAgICAgICAgTExfUkNDX1BMTF9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IChSQ0NfQ1JfUExMUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgU1lTQ0xLIERvbWFpbgorICAqIEBub3RlIFBMTCBTb3VyY2UgYW5kIFBMTE0gRGl2aWRlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgUExMTi9QTExSIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExSICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUworICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVModWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExSKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfCBSQ0NfUExMQ0ZHUl9QTExSLAorICAgICAgICAgICAgIFNvdXJjZSB8IFBMTE0gfCAoUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCBQTExSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIEFEQyBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSAgIFBMTCBTb3VyY2UgYW5kIFBMTE0gRGl2aWRlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgICBQTExOL1BMTFAgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqIEBub3RlICAgVXNlciBzaGFsbCB2ZXJpZnkgd2hldGhlciB0aGUgUExMIGNvbmZpZ3VyYXRpb24gaXMgbm90IGRvbmUgdGhyb3VnaAorICAqICAgICAgICAgb3RoZXIgZnVuY3Rpb25zIChleDogSTJTMSkKKyAgKiBAbm90ZSAgIFRoaXMgY2FuIGJlIHNlbGVjdGVkIGZvciBBREMKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQ1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9BRENcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExQICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQworICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFApCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8IFJDQ19QTExDRkdSX1BMTFAsCisgICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgSTJTIGRvbWFpbiBjbG9jaworICAqIEBub3RlICAgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiBAbm90ZSAgIFBMTE4vUExMUCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgICBVc2VyIHNoYWxsIHZlcmlmeSB3aGV0aGVyIHRoZSBQTEwgY29uZmlndXJhdGlvbiBpcyBub3QgZG9uZSB0aHJvdWdoCisgICogICAgICAgICBvdGhlciBmdW5jdGlvbnMgKGV4OiBBREMpCisgICogQG5vdGUgICBUaGlzIGNhbiBiZSBzZWxlY3RlZCBmb3IgSTJTMQorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fSTJTMVxuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9JMlMxXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0kyUzFcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTFAgICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fSTJTMQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0kyUzEodWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExQKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfCBSQ0NfUExMQ0ZHUl9QTExQLAorICAgICAgICAgICAgIFNvdXJjZSB8IFBMTE0gfCAoUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCBQTExQKTsKK30KKworI2lmIGRlZmluZWQoUk5HKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFJORyBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUSBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgICBVc2VyIHNoYWxsIHZlcmlmeSB3aGV0aGVyIHRoZSBQTEwgY29uZmlndXJhdGlvbiBpcyBub3QgZG9uZSB0aHJvdWdoCisgICogICAgICAgICBvdGhlciBmdW5jdGlvbnMgKGV4OiBUSU0xLCBUSU0xNSkKKyAgKiBAbm90ZSBUaGlzICBjYW4gYmUgc2VsZWN0ZWQgZm9yIFJORworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fUk5HXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExNICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1JOR1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9STkdcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTFEgICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fUk5HCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHBhcmFtICBQTExNIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgUExMTiBCZXR3ZWVuIDggYW5kIDg2CisgICogQHBhcmFtICBQTExRIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1JORyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFEpCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8IFJDQ19QTExDRkdSX1BMTFEsCisgICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFEpOworfQorI2VuZGlmIC8qIFJORyAqLworCisjaWYgZGVmaW5lZChSQ0NfUExMUV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFRJTTEgZG9tYWluIGNsb2NrCisgICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiBAbm90ZSBQTExOL1BMTFEgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqIEBub3RlICAgVXNlciBzaGFsbCB2ZXJpZnkgd2hldGhlciB0aGUgUExMIGNvbmZpZ3VyYXRpb24gaXMgbm90IGRvbmUgdGhyb3VnaAorICAqICAgICAgICAgb3RoZXIgZnVuY3Rpb25zIChleDogUk5HLCBUSU0xNSkKKyAgKiBAbm90ZSBUaGlzICBjYW4gYmUgc2VsZWN0ZWQgZm9yIFRJTTEKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1RJTTFcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMVxuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9USU0xXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExRICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1RJTTEKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBQTExOIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIFBMTFEgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMSh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFEpCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8IFJDQ19QTExDRkdSX1BMTFEsCisgICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFEpOworfQorI2VuZGlmIC8qIFJDQ19QTExRX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkgJiYgZGVmaW5lZChUSU0xNSkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTCB1c2VkIGZvciBUSU0xNSBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUSBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgICBVc2VyIHNoYWxsIHZlcmlmeSB3aGV0aGVyIHRoZSBQTEwgY29uZmlndXJhdGlvbiBpcyBub3QgZG9uZSB0aHJvdWdoCisgICogICAgICAgICBvdGhlciBmdW5jdGlvbnMgKGV4OiBSTkcsIFRJTTEpCisgICogQG5vdGUgVGhpcyAgY2FuIGJlIHNlbGVjdGVkIGZvciBUSU0xNQorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMTVcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMTVcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMTVcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTFEgICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMTUKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBQTExOIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIFBMTFEgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fVElNMTUodWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExRKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfCBSQ0NfUExMQ0ZHUl9QTExRLAorICAgICAgICAgICAgIFNvdXJjZSB8IFBMTE0gfCAoUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCBQTExRKTsKK30KKyNlbmRpZiAvKiBSQ0NfUExMUV9TVVBQT1JUICYmIFRJTTE1ICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IE1haW4gUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgVkNPCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0dldE4KKyAgKiBAcmV0dmFsIEJldHdlZW4gOCBhbmQgODYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldE4odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiAgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAKKyAgKiBAbm90ZSAgIHVzZWQgZm9yIFBMTFBDTEsgKEFEQyAmIEkyUyBjbG9jaykKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQICAgICAgIExMX1JDQ19QTExfR2V0UAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRQKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUCkpOworfQorCisjaWYgZGVmaW5lZChSQ0NfUExMUV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRCisgICogQG5vdGUgdXNlZCBmb3IgUExMUUNMSyBzZWxlY3RlZCBmb3IgUk5HLCBUSU0xLCBUSU0xNSBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFEgICAgICAgICAgTExfUkNDX1BMTF9HZXRRCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRRKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkpOworfQorI2VuZGlmIC8qIFJDQ19QTExRX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExSCisgICogQG5vdGUgdXNlZCBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUiAgICAgICAgICBMTF9SQ0NfUExMX0dldFIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldFIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfU2V0TWFpblNvdXJjZQorICAqIEBwYXJhbSBQTExTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UodWludDMyX3QgUExMU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDLCBQTExTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgb3NjaWxsYXRvciB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEaXZpc2lvbiBmYWN0b3IgZm9yIHRoZSBtYWluIFBMTCBhbmQgb3RoZXIgUExMCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0dldERpdmlkZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0RGl2aWRlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIG91dHB1dCBtYXBwZWQgb24gQURDIGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFBFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fQURDCisgICogQG5vdGUgICBVc2VyIHNoYWxsIGNoZWNrIHRoYXQgUExMIGVuYWJsZSBpcyBub3QgZG9uZSB0aHJvdWdoCisgICogICAgICAgICBvdGhlciBmdW5jdGlvbnMgKGV4OiBJMlMxKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fQURDKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMIG91dHB1dCBtYXBwZWQgb24gQURDIGRvbWFpbiBjbG9jaworICAqIEBub3RlIENhbm5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgUExMIGNsb2NrIGlzIHVzZWQgYXMgdGhlIHN5c3RlbSBjbG9jaworICAqIEBub3RlICAgVXNlciBzaGFsbCBjaGVjayB0aGF0IFBMTCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgcGVyaXBoZXJhbAorICAqICAgICAgICAgKGV4OiBJMlMxKQorICAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcworICAqICAgICAgIG5vdCB1c2VkLCAgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9BREMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9BREModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIG91dHB1dCBtYXBwZWQgb24gSTJTIGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFBFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fSTJTMQorICAqIEBub3RlICAgVXNlciBzaGFsbCBjaGVjayB0aGF0IFBMTCBlbmFibGUgaXMgbm90IGRvbmUgdGhyb3VnaAorICAqICAgICAgICAgb3RoZXIgZnVuY3Rpb25zIChleDogQURDKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fSTJTMSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIEkyUzEgZG9tYWluIGNsb2NrCisgICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrCisgICogQG5vdGUgICBVc2VyIHNoYWxsIGNoZWNrIHRoYXQgUExMIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBwZXJpcGhlcmFsCisgICogICAgICAgICAoZXg6IFJORykKKyAgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUEVOICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fSTJTMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX0kyUzEodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKTsKK30KKworI2lmIGRlZmluZWQoUk5HKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIG91dHB1dCBtYXBwZWQgb24gUk5HIGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fUk5HCisgICogQG5vdGUgICBVc2VyIHNoYWxsIGNoZWNrIHRoYXQgUExMIGVuYWJsZSBpcyBub3QgZG9uZSB0aHJvdWdoCisgICogICAgICAgICBvdGhlciBmdW5jdGlvbnMgKGV4OiBUSU0xLCBUSU0xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1JORyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFJORyBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBDYW5ub3QgYmUgZGlzYWJsZWQgaWYgdGhlIFBMTCBjbG9jayBpcyB1c2VkIGFzIHRoZSBzeXN0ZW0gY2xvY2sKKyAgKiBAbm90ZSAgIFVzZXIgc2hhbGwgY2hlY2sgdGhhdCBQTEwgaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgIChleDogVElNLCBUSU0xNSkKKyAgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUUVOICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fUk5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fUk5HKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTik7Cit9CisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBUSU0xIGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fVElNMQorICAqIEBub3RlICAgVXNlciBzaGFsbCBjaGVjayB0aGF0IFBMTCBlbmFibGUgaXMgbm90IGRvbmUgdGhyb3VnaAorICAqICAgICAgICAgb3RoZXIgZnVuY3Rpb25zIChleDogUk5HLCBUSU0xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1RJTTEodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBUSU0xIGRvbWFpbiBjbG9jaworICAqIEBub3RlIENhbm5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgUExMIGNsb2NrIGlzIHVzZWQgYXMgdGhlIHN5c3RlbSBjbG9jaworICAqIEBub3RlICAgVXNlciBzaGFsbCBjaGVjayB0aGF0IFBMTCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgcGVyaXBoZXJhbAorICAqICAgICAgICAgKGV4OiBSTkcsIFRJTTE1KQorICAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcworICAqICAgICAgIG5vdCB1c2VkLCAgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExRRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9USU0xCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fVElNMSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRRU4pOworfQorI2VuZGlmIC8qIFJDQ19QTExRX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkgJiYgZGVmaW5lZChUSU0xNSkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFRJTTE1IGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fVElNMTUKKyAgKiBAbm90ZSAgIFVzZXIgc2hhbGwgY2hlY2sgdGhhdCBQTEwgZW5hYmxlIGlzIG5vdCBkb25lIHRocm91Z2gKKyAgKiAgICAgICAgIG90aGVyIGZ1bmN0aW9ucyAoZXg6IFJORywgVElNMSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1RJTTE1KHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMIG91dHB1dCBtYXBwZWQgb24gVElNMTUgZG9tYWluIGNsb2NrCisgICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrCisgICogQG5vdGUgICBVc2VyIHNoYWxsIGNoZWNrIHRoYXQgUExMIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBwZXJpcGhlcmFsCisgICogICAgICAgICAoZXg6IFJORywgVElNMSkKKyAgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUUVOICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fVElNMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9USU0xNSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRRU4pOworfQorI2VuZGlmIC8qIFJDQ19QTExRX1NVUFBPUlQgJiYgVElNMTUgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIG91dHB1dCBtYXBwZWQgb24gU1lTQ0xLIGRvbWFpbgorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFJFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fU1lTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0VuYWJsZURvbWFpbl9TWVModm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBTWVNDTEsgZG9tYWluCisgICogQG5vdGUgQ2Fubm90IGJlIGRpc2FibGVkIGlmIHRoZSBQTEwgY2xvY2sgaXMgdXNlZCBhcyB0aGUgc3lzdGVtIGNsb2NrCisgICogQG5vdGUgSW4gb3JkZXIgdG8gc2F2ZSBwb3dlciwgd2hlbiB0aGUgUExMQ0xLICBvZiB0aGUgUExMIGlzCisgICogICAgICAgbm90IHVzZWQsIE1haW4gUExMICBzaG91bGQgYmUgMAorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFJFTiAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX1NZUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX1NZUyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSRU4pOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTFNJIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgTFNJUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19MU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0xTSVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExTRSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIExTRVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19MU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNFUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9MU0VSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBIU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBIU0lSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfSFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfSFNJUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgSFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgSFNFUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0hTRVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFBMTCByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIFBMTFJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19QTExSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfUExMUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9QTExSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBDU1NDICAgICAgICAgIExMX1JDQ19DbGVhckZsYWdfSFNFQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0hTRUNTUyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfQ1NTQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIExTRUNTU0MgICAgICAgTExfUkNDX0NsZWFyRmxhZ19MU0VDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNFQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9MU0VDU1NDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0kgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lGUiAgICAgICAgIExTSVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0xTSVJEWUYpID09IChSQ0NfQ0lGUl9MU0lSRFlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFUkRZRikgPT0gKFJDQ19DSUZSX0xTRVJEWUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBIU0lSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9IU0lSRFlGKSA9PSAoUkNDX0NJRlJfSFNJUkRZRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0UgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lGUiAgICAgICAgIEhTRVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0hTRVJEWUYpID09IChSQ0NfQ0lGUl9IU0VSRFlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgUExMUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BMTFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfUExMUkRZRikgPT0gKFJDQ19DSUZSX1BMTFJEWUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBDU1NGICAgICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFQ1NTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0VDU1Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9DU1NGKSA9PSAoUkNDX0NJRlJfQ1NTRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBMU0VDU1NGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0VDU1Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9MU0VDU1NGKSA9PSAoUkNDX0NJRlJfTFNFQ1NTRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIElXREdSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19JV0RHUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0lXREdSU1RGKSA9PSAoUkNDX0NTUl9JV0RHUlNURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBMb3cgUG93ZXIgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBMUFdSUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFBXUlJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFBXUlJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MUFdSUlNURikgPT0gKFJDQ19DU1JfTFBXUlJTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgT3B0aW9uIGJ5dGUgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBPQkxSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfT0JMUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19PQkxSU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfT0JMUlNURikgPT0gKFJDQ19DU1JfT0JMUlNURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBQaW4gcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBQSU5SU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19QSU5SU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUElOUlNURikgPT0gKFJDQ19DU1JfUElOUlNURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBTb2Z0d2FyZSByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNGVFJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19TRlRSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NGVFJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9TRlRSU1RGKSA9PSAoUkNDX0NTUl9TRlRSU1RGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIFdpbmRvdyBXYXRjaGRvZyByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFdXREdSU1RGICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19XV0RHUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19XV0RHUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1dXREdSU1RGKSA9PSAoUkNDX0NTUl9XV0RHUlNURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBCT1Igb3IgUE9SL1BEUiByZXNldCBpcyBzZXQgb3Igbm90LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFBXUlJTVEYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19QV1JSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BXUlJTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9QV1JSU1RGKSA9PSAoUkNDX0NTUl9QV1JSU1RGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSTVZGIGJpdCB0byBjbGVhciB0aGUgcmVzZXQgZmxhZ3MuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgUk1WRiAgICAgICAgICBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJSZXNldEZsYWdzKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfUk1WRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNJUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfSFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfSFNJUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0VSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0VSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX1BMTFJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX1BMTFJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTFNJIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTSVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTFNJUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTRSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfTFNFUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0xTRVJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0VSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNJUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0hTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9IU0lSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNFUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTRVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTCByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX1BMTFJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIExTSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0xTSVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSVJEWUlFKSA9PSAoUkNDX0NJRVJfTFNJUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0xTRVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRVJEWUlFKSA9PSAoUkNDX0NJRVJfTFNFUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIEhTSSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNJUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0hTSVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSVJEWUlFKSA9PSAoUkNDX0NJRVJfSFNJUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIEhTRSByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNFUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0hTRVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTRVJEWUlFKSA9PSAoUkNDX0NJRVJfSFNFUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIFBMTCByZWFkeSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX1BMTFJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX1BMTFJEWUlFKSA9PSAoUkNDX0NJRVJfUExMUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0dldF9GcmVxIEdldCBzeXN0ZW0gYW5kIHBlcmlwaGVyYWxzIGNsb2NrcyBmcmVxdWVuY3kgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgICAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldEkyQ0Nsb2NrRnJlcSh1aW50MzJfdCBJMkN4U291cmNlKTsKKyNpZiBkZWZpbmVkKExQVUFSVDEpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpOworI2VuZGlmIC8qIExQVUFSVDEgKi8KKyNpZiBkZWZpbmVkKExQVElNMSkgJiYgZGVmaW5lZChMUFRJTTIpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0TFBUSU1DbG9ja0ZyZXEodWludDMyX3QgTFBUSU14U291cmNlKTsKKyNlbmRpZiAvKiBMUFRJTTEgJiYgTFBUSU0yICovCisjaWYgZGVmaW5lZChSTkcpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0Uk5HQ2xvY2tGcmVxKHVpbnQzMl90IFJOR3hTb3VyY2UpOworI2VuZGlmIC8qIFJORyAqLwordWludDMyX3QgICAgTExfUkNDX0dldEFEQ0Nsb2NrRnJlcSh1aW50MzJfdCBBREN4U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRJMlNDbG9ja0ZyZXEodWludDMyX3QgSTJTeFNvdXJjZSk7CisjaWYgZGVmaW5lZChDRUMpCit1aW50MzJfdCAgICBMTF9SQ0NfR2V0Q0VDQ2xvY2tGcmVxKHVpbnQzMl90IENFQ3hTb3VyY2UpOworI2VuZGlmIC8qIENFQyAqLwordWludDMyX3QgICAgTExfUkNDX0dldFRJTUNsb2NrRnJlcSh1aW50MzJfdCBUSU14U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRSVENDbG9ja0ZyZXEodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChSQ0MpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfUkNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfcm5nLmggYi9JbmMvc3RtMzJnMHh4X2xsX3JuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmE3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX3JuZy5oCkBAIC0wLDAgKzEsNDAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3JuZy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSTkcgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX1JOR19ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9STkdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUk5HKQorCisvKiogQGRlZmdyb3VwIFJOR19MTCBSTkcKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSTkdfTExfRVNfSW5pdF9TdHJ1Y3QgUk5HIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBMTCBSTkcgSW5pdCBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgICAgICAgICBDbG9ja0Vycm9yRGV0ZWN0aW9uOyAvKiE8IENsb2NrIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIFJOR19MTF9DRUQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfUk5HX0VuYWJsZUNsa0Vycm9yRGV0ZWN0KCkuICovCit9IExMX1JOR19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBSTkcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfQ0VEIENsb2NrIEVycm9yIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JOR19DRURfRU5BQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgQ2xvY2sgZXJyb3IgZGV0ZWN0aW9uIGVuYWJsZWQgICovCisjZGVmaW5lIExMX1JOR19DRURfRElTQUJMRSAgICAgICAgUk5HX0NSX0NFRCAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgZXJyb3IgZGV0ZWN0aW9uIGRpc2FibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUk5HX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9STkdfU1JfRFJEWSBSTkdfU1JfRFJEWSAgICAvKiE8IFJlZ2lzdGVyIGNvbnRhaW5zIHZhbGlkIHJhbmRvbSBkYXRhICovCisjZGVmaW5lIExMX1JOR19TUl9DRUNTIFJOR19TUl9DRUNTICAgIC8qITwgQ2xvY2sgZXJyb3IgY3VycmVudCBzdGF0dXMgKi8KKyNkZWZpbmUgTExfUk5HX1NSX1NFQ1MgUk5HX1NSX1NFQ1MgICAgLyohPCBTZWVkIGVycm9yIGN1cnJlbnQgc3RhdHVzICovCisjZGVmaW5lIExMX1JOR19TUl9DRUlTIFJOR19TUl9DRUlTICAgIC8qITwgQ2xvY2sgZXJyb3IgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBMTF9STkdfU1JfU0VJUyBSTkdfU1JfU0VJUyAgICAvKiE8IFNlZWQgZXJyb3IgaW50ZXJydXB0IHN0YXR1cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUk5HX1JlYWRSZWcgYW5kICBMTF9STkdfV3JpdGVSZWcgbWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUk5HX0NSX0lFICAgUk5HX0NSX0lFICAgICAgLyohPCBSTkcgSW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0V4cG9ydGVkX01hY3JvcyBSTkcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBSTkcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBSTkcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1JOR19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFJORyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFJORyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9STkdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBSTkcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VGX0NvbmZpZ3VyYXRpb24gUk5HIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUk5HRU4gICAgICAgICBMTF9STkdfRW5hYmxlCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0VuYWJsZShSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgU0VUX0JJVChSTkd4LT5DUiwgUk5HX0NSX1JOR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJOR0VOICAgICAgICAgTExfUk5HX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfRGlzYWJsZShSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgQ0xFQVJfQklUKFJOR3gtPkNSLCBSTkdfQ1JfUk5HRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSTkdFTiAgICAgICAgIExMX1JOR19Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzRW5hYmxlZChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+Q1IsIFJOR19DUl9STkdFTikgPT0gKFJOR19DUl9STkdFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VEICAgICAgICAgICBMTF9STkdfRW5hYmxlQ2xrRXJyb3JEZXRlY3QKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfRW5hYmxlQ2xrRXJyb3JEZXRlY3QoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIENMRUFSX0JJVChSTkd4LT5DUiwgUk5HX0NSX0NFRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSTkcgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VEICAgICAgICAgTExfUk5HX0Rpc2FibGVDbGtFcnJvckRldGVjdAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19EaXNhYmxlQ2xrRXJyb3JEZXRlY3QoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFNFVF9CSVQoUk5HeC0+Q1IsIFJOR19DUl9DRUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJORyBDbG9jayBFcnJvciBEZXRlY3Rpb24gaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENFRCAgICAgICAgIExMX1JOR19Jc0VuYWJsZWRDbGtFcnJvckRldGVjdAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNFbmFibGVkQ2xrRXJyb3JEZXRlY3QoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPkNSLCBSTkdfQ1JfQ0VEKSAhPSAoUk5HX0NSX0NFRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIFJORyBEYXRhIHJlYWR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIERSRFkgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19EUkRZCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfRFJEWShSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9EUkRZKSA9PSAoUk5HX1NSX0RSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIENsb2NrIEVycm9yIEN1cnJlbnQgU3RhdHVzIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENFQ1MgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19DRUNTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfQ0VDUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9DRUNTKSA9PSAoUk5HX1NSX0NFQ1MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIFNlZWQgRXJyb3IgQ3VycmVudCBTdGF0dXMgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0VDUyAgICAgICAgICBMTF9STkdfSXNBY3RpdmVGbGFnX1NFQ1MKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUNTKFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSTkd4LT5TUiwgUk5HX1NSX1NFQ1MpID09IChSTkdfU1JfU0VDUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiB0aGUgQ2xvY2sgRXJyb3IgSW50ZXJydXB0IFN0YXR1cyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDRUlTICAgICAgICAgIExMX1JOR19Jc0FjdGl2ZUZsYWdfQ0VJUworICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNBY3RpdmVGbGFnX0NFSVMoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPlNSLCBSTkdfU1JfQ0VJUykgPT0gKFJOR19TUl9DRUlTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBTZWVkIEVycm9yIEludGVycnVwdCBTdGF0dXMgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0VJUyAgICAgICAgICBMTF9STkdfSXNBY3RpdmVGbGFnX1NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUlTKFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSTkd4LT5TUiwgUk5HX1NSX1NFSVMpID09IChSTkdfU1JfU0VJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDbG9jayBFcnJvciBpbnRlcnJ1cHQgU3RhdHVzIChDRUlTKSBGbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0VJUyAgICAgICAgICBMTF9STkdfQ2xlYXJGbGFnX0NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfQ2xlYXJGbGFnX0NFSVMoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFdSSVRFX1JFRyhSTkd4LT5TUiwgflJOR19TUl9DRUlTKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTZWVkIEVycm9yIGludGVycnVwdCBTdGF0dXMgKFNFSVMpIEZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBTRUlTICAgICAgICAgIExMX1JOR19DbGVhckZsYWdfU0VJUworICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19DbGVhckZsYWdfU0VJUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgV1JJVEVfUkVHKFJOR3gtPlNSLCB+Uk5HX1NSX1NFSVMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19MTF9FRl9JVF9NYW5hZ2VtZW50IElUIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBJbnRlcnJ1cHQKKyAgKiAgICAgICAgIChhcHBsaWVzIGZvciBlaXRoZXIgU2VlZCBlcnJvciwgQ2xvY2sgRXJyb3Igb3IgRGF0YSByZWFkeSBpbnRlcnJ1cHRzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIElFICAgICAgICAgICAgTExfUk5HX0VuYWJsZUlUCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0VuYWJsZUlUKFJOR19UeXBlRGVmICpSTkd4KQoreworICBTRVRfQklUKFJOR3gtPkNSLCBSTkdfQ1JfSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgSW50ZXJydXB0CisgICogICAgICAgICAoYXBwbGllcyBmb3IgZWl0aGVyIFNlZWQgZXJyb3IsIENsb2NrIEVycm9yIG9yIERhdGEgcmVhZHkgaW50ZXJydXB0cykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJRSAgICAgICAgICAgIExMX1JOR19EaXNhYmxlSVQKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfRGlzYWJsZUlUKFJOR19UeXBlRGVmICpSTkd4KQoreworICBDTEVBUl9CSVQoUk5HeC0+Q1IsIFJOR19DUl9JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgSW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiAgICAgICAgIChhcHBsaWVzIGZvciBlaXRoZXIgU2VlZCBlcnJvciwgQ2xvY2sgRXJyb3Igb3IgRGF0YSByZWFkeSBpbnRlcnJ1cHRzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIElFICAgICAgICAgICAgTExfUk5HX0lzRW5hYmxlZElUCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0VuYWJsZWRJVChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+Q1IsIFJOR19DUl9JRSkgPT0gKFJOR19DUl9JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuMzItYml0IFJhbmRvbSBOdW1iZXIgdmFsdWUKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBSTkRBVEEgICAgICAgIExMX1JOR19SZWFkUmFuZERhdGEzMgorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEdlbmVyYXRlZCAzMi1iaXQgcmFuZG9tIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX1JlYWRSYW5kRGF0YTMyKFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhSTkd4LT5EUikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJOR19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUk5HX0luaXQoUk5HX1R5cGVEZWYgKlJOR3gsIExMX1JOR19Jbml0VHlwZURlZiAqUk5HX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9STkdfU3RydWN0SW5pdChMTF9STkdfSW5pdFR5cGVEZWYgKlJOR19Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1JOR19EZUluaXQoUk5HX1R5cGVEZWYgKlJOR3gpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChSTkcpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfUk5HX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmcweHhfbGxfcnRjLmggYi9JbmMvc3RtMzJnMHh4X2xsX3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjA1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX3J0Yy5oCkBAIC0wLDAgKzEsNDExOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfUlRDX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX1JUQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSVEMpCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMIFJUQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFJUQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBNYXNrcyBEZWZpbml0aW9uICovCisjZGVmaW5lIFJUQ19MTF9JTklUX01BU0sgICAgICAgICAgICAgIDB4RkZGRkZGRkZVCisjZGVmaW5lIFJUQ19MTF9SU0ZfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRkZGNUZVCisKKy8qIFdyaXRlIHByb3RlY3Rpb24gZGVmaW5lcyAqLworI2RlZmluZSBSVENfV1JJVEVfUFJPVEVDVElPTl9ESVNBQkxFICAoKHVpbnQ4X3QpMHhGRlUpCisjZGVmaW5lIFJUQ19XUklURV9QUk9URUNUSU9OX0VOQUJMRV8xICgodWludDhfdCkweENBVSkKKyNkZWZpbmUgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzIgKCh1aW50OF90KTB4NTNVKQorCisvKiBEZWZpbmVzIHVzZWQgdG8gY29tYmluZSBkYXRlICYgdGltZSAqLworI2RlZmluZSBSVENfT0ZGU0VUX1dFRUtEQVkgICAgICAgICAgICAodWludDMyX3QpMjRVCisjZGVmaW5lIFJUQ19PRkZTRVRfREFZICAgICAgICAgICAgICAgICh1aW50MzJfdCkxNlUKKyNkZWZpbmUgUlRDX09GRlNFVF9NT05USCAgICAgICAgICAgICAgKHVpbnQzMl90KThVCisjZGVmaW5lIFJUQ19PRkZTRVRfSE9VUiAgICAgICAgICAgICAgICh1aW50MzJfdCkxNlUKKyNkZWZpbmUgUlRDX09GRlNFVF9NSU5VVEUgICAgICAgICAgICAgKHVpbnQzMl90KThVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9Qcml2YXRlX01hY3JvcyBSVEMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FU19JTklUIFJUQyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUlRDIEluaXQgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBIb3VyRm9ybWF0OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgSG91cnMgRm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfSE9VUkZPUk1BVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0SG91ckZvcm1hdCgpLiAqLworCisgIHVpbnQzMl90IEFzeW5jaFByZXNjYWxlcjsgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBc3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0QXN5bmNoUHJlc2NhbGVyKCkuICovCisKKyAgdWludDMyX3QgU3luY2hQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFN5bmNocm9ub3VzIFByZWRpdmlkZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SVENfU2V0U3luY2hQcmVzY2FsZXIoKS4gKi8KK30gTExfUlRDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBUaW1lIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUaW1lRm9ybWF0OyAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFNL1BNIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfVElNRV9GT1JNQVQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX1RJTUVfU2V0Rm9ybWF0KCkuICovCisKKyAgdWludDhfdCBIb3VyczsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIEhvdXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTIgaWYgdGhlIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX1BNIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjMgaWYgdGhlIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0IGlzIHNlbGVjdGVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRIb3VyKCkuICovCisKKyAgdWludDhfdCBNaW51dGVzOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIE1pbnV0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRNaW51dGUoKS4gKi8KKworICB1aW50OF90IFNlY29uZHM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgU2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldFNlY29uZCgpLiAqLworfSBMTF9SVENfVGltZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIERhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4X3QgV2Vla0RheTsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX1dFRUtEQVkKKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0RBVEVfU2V0V2Vla0RheSgpLiAqLworCisgIHVpbnQ4X3QgTW9udGg7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBNb250aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19NT05USAorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXRNb250aCgpLiAqLworCisgIHVpbnQ4X3QgRGF5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMQorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXREYXkoKS4gKi8KKworICB1aW50OF90IFllYXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgWWVhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDk5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldFllYXIoKS4gKi8KK30gTExfUlRDX0RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFJUQyBBbGFybSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTExfUlRDX1RpbWVUeXBlRGVmIEFsYXJtVGltZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gVGltZSBtZW1iZXJzLiAqLworCisgIHVpbnQzMl90IEFsYXJtTWFzazsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIE1hc2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19BTE1BX01BU0sgZm9yIEFMQVJNIEEgb3IgQHJlZiBSVENfTExfRUNfQUxNQl9NQVNLIGZvciBBTEFSTSBCLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0TWFzaygpIGZvciBBTEFSTSBBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEByZWYgTExfUlRDX0FMTUJfU2V0TWFzaygpIGZvciBBTEFSTSBCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEFsYXJtRGF0ZVdlZWtEYXlTZWw7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGlzIG9uIGRheSBvciBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19BTE1BX1dFRUtEQVlfU0VMRUNUSU9OIGZvciBBTEFSTSBBIG9yIEByZWYgUlRDX0xMX0VDX0FMTUJfV0VFS0RBWV9TRUxFQ1RJT04gZm9yIEFMQVJNIEIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkoKSBvciBAcmVmIExMX1JUQ19BTE1BX0Rpc2FibGVXZWVrZGF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFMQVJNIEEgb3IgQHJlZiBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5KCkgb3IgQHJlZiBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheSgpIGZvciBBTEFSTSBCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgQWxhcm1EYXRlV2Vla0RheTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIERheS9XZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBBbGFybURhdGVXZWVrRGF5U2VsIHNldCB0byBkYXksIHRoaXMgcGFyYW1ldGVyICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0RGF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFMQVJNIEEgb3IgQHJlZiBMTF9SVENfQUxNQl9TZXREYXkoKSBmb3IgQUxBUk0gQi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBBbGFybURhdGVXZWVrRGF5U2VsIHNldCB0byBXZWVrZGF5LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19XRUVLREFZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0V2Vla0RheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBTEFSTSBBIG9yIEByZWYgTExfUlRDX0FMTUJfU2V0V2Vla0RheSgpIGZvciBBTEFSTSBCLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gTExfUlRDX0FsYXJtVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBSVEMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfRk9STUFUIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19GT1JNQVRfQklOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDBVIC8qITwgQmluYXJ5IGRhdGEgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19GT1JNQVRfQkNEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDFVIC8qITwgQkNEIGRhdGEgZm9ybWF0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1BX1dFRUtEQVlfU0VMRUNUSU9OIFJUQyBBbGFybSBBIERhdGUgV2Vla0RheQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBBbGFybSBBIERhdGUgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfV0VFS0RBWSBSVENfQUxSTUFSX1dEU0VMICAgICAgICAvKiE8IEFsYXJtIEEgV2Vla0RheSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQl9XRUVLREFZX1NFTEVDVElPTiBSVEMgQWxhcm0gQiBEYXRlIFdlZWtEYXkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQWxhcm0gQiBEYXRlIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX1dFRUtEQVkgUlRDX0FMUk1CUl9XRFNFTCAgICAgICAgLyohPCBBbGFybSBCIFdlZWtEYXkgaXMgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JUQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1NDUl9JVFNGICAgICAgICAgICAgICAgICAgICBSVENfU0NSX0NJVFNGCisjZGVmaW5lIExMX1JUQ19TQ1JfVFNPVkYgICAgICAgICAgICAgICAgICAgUlRDX1NDUl9DVFNPVkYKKyNkZWZpbmUgTExfUlRDX1NDUl9UU0YgICAgICAgICAgICAgICAgICAgICBSVENfU0NSX0NUU0YKKyNkZWZpbmUgTExfUlRDX1NDUl9XVVRGICAgICAgICAgICAgICAgICAgICBSVENfU0NSX0NXVVRGCisjZGVmaW5lIExMX1JUQ19TQ1JfQUxSQkYgICAgICAgICAgICAgICAgICAgUlRDX1NDUl9DQUxSQkYKKyNkZWZpbmUgTExfUlRDX1NDUl9BTFJBRiAgICAgICAgICAgICAgICAgICBSVENfU0NSX0NBTFJBRgorCisjZGVmaW5lIExMX1JUQ19JQ1NSX1JFQ0FMUEYgICAgICAgICAgICAgICAgUlRDX0lDU1JfUkVDQUxQRgorI2RlZmluZSBMTF9SVENfSUNTUl9JTklURiAgICAgICAgICAgICAgICAgIFJUQ19JQ1NSX0lOSVRGCisjZGVmaW5lIExMX1JUQ19JQ1NSX1JTRiAgICAgICAgICAgICAgICAgICAgUlRDX0lDU1JfUlNGCisjZGVmaW5lIExMX1JUQ19JQ1NSX0lOSVRTICAgICAgICAgICAgICAgICAgUlRDX0lDU1JfSU5JVFMKKyNkZWZpbmUgTExfUlRDX0lDU1JfU0hQRiAgICAgICAgICAgICAgICAgICBSVENfSUNTUl9TSFBGCisjZGVmaW5lIExMX1JUQ19JQ1NSX1dVVFdGICAgICAgICAgICAgICAgICAgUlRDX0lDU1JfV1VUV0YKKyNkZWZpbmUgTExfUlRDX0lDU1JfQUxSQldGICAgICAgICAgICAgICAgICBSVENfSUNTUl9BTFJCV0YKKyNkZWZpbmUgTExfUlRDX0lDU1JfQUxSQVdGICAgICAgICAgICAgICAgICBSVENfSUNTUl9BTFJBV0YKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JUQ19SZWFkUmVnIGFuZCAgTExfUlRDX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19DUl9UU0lFICAgICAgICAgICAgICAgICAgICAgUlRDX0NSX1RTSUUKKyNkZWZpbmUgTExfUlRDX0NSX1dVVElFICAgICAgICAgICAgICAgICAgICBSVENfQ1JfV1VUSUUKKyNkZWZpbmUgTExfUlRDX0NSX0FMUkJJRSAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQklFCisjZGVmaW5lIExMX1JUQ19DUl9BTFJBSUUgICAgICAgICAgICAgICAgICAgUlRDX0NSX0FMUkFJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfV0VFS0RBWSAgV0VFSyBEQVkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9NT05EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgLyohPCBNb25kYXkgICAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfVFVFU0RBWSAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpIC8qITwgVHVlc2RheSAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWSAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKSAvKiE8IFdlZG5lc2RheSAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9USFVSU0RBWSAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgLyohPCBUaHJ1c2RheSAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfRlJJREFZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpIC8qITwgRnJpZGF5ICAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1NBVFVSREFZICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKSAvKiE8IFNhdHVyZGF5ICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9TVU5EQVkgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkgLyohPCBTdW5kYXkgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX01PTlRIICBNT05USAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KQU5VQVJZICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBKYW51YXJ5ICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0ZFQlJVQVJZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpICAvKiE8IEZlYnJ1YXJ5ICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfTUFSQ0ggICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkgIC8qITwgTWFyY2ggICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9BUFJJTCAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKSAgLyohPCBBcHJpbCAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX01BWSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpICAvKiE8IE1heSAgICAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfSlVORSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgIC8qITwgSnVuZSAgICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9KVUxZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKSAgLyohPCBKdWx5ICAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0FVR1VTVCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOFUpICAvKiE8IEF1Z3VzdCAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfU0VQVEVNQkVSICAgICAgICAgICAgICgodWludDhfdCkweDA5VSkgIC8qITwgU2VwdGVtYmVyICovCisjZGVmaW5lIExMX1JUQ19NT05USF9PQ1RPQkVSICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTBVKSAgLyohPCBPY3RvYmVyICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX05PVkVNQkVSICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMVUpICAvKiE8IE5vdmVtYmVyICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfREVDRU1CRVIgICAgICAgICAgICAgICgodWludDhfdCkweDEyVSkgIC8qITwgRGVjZW1iZXIgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19IT1VSRk9STUFUICBIT1VSIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUiAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgMjQgaG91ci9kYXkgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19IT1VSRk9STUFUX0FNUE0gICAgICAgICAgICAgUlRDX0NSX0ZNVCAgICAgICAgICAgIC8qITwgQU0vUE0gaG91ciBmb3JtYXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNT1VUICBBTEFSTSBPVVRQVVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgT3V0cHV0IGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1BICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMCAgICAgICAgICAgLyohPCBBbGFybSBBIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9BTE1CICAgICAgICAgICAgICAgUlRDX0NSX09TRUxfMSAgICAgICAgICAgLyohPCBBbGFybSBCIG91dHB1dCBlbmFibGVkICovCisjZGVmaW5lIExMX1JUQ19BTEFSTU9VVF9XQUtFVVAgICAgICAgICAgICAgUlRDX0NSX09TRUwgICAgICAgICAgICAgLyohPCBXYWtldXAgb3V0cHV0IGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMQVJNX09VVFBVVFRZUEUgIEFMQVJNIE9VVFBVVCBUWVBFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfT1BFTkRSQUlOICBSVENfQ1JfVEFNUEFMUk1fVFlQRSAgLyohPCBSVENfQUxBUk0gaXMgb3Blbi1kcmFpbiBvdXRwdXQgKi8KKyNkZWZpbmUgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfUFVTSFBVTEwgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBSVENfQUxBUk0gaXMgcHVzaC1wdWxsIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfT1VUUFVUUE9MQVJJVFlfUElOICBPVVRQVVQgUE9MQVJJVFkgUElOCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX09VVFBVVFBPTEFSSVRZX1BJTl9ISUdIICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBQaW4gaXMgaGlnaCB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSovCisjZGVmaW5lIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XICAgICAgUlRDX0NSX1BPTCAgICAgICAgICAgIC8qITwgUGluIGlzIGxvdyB3aGVuIEFMUkFGL0FMUkJGL1dVVEYgaXMgYXNzZXJ0ZWQgKGRlcGVuZGluZyBvbiBPU0VMKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVElNRV9GT1JNQVQgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgICAgUlRDX1RSX1BNICAgICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1NISUZUX1NFQ09ORCAgU0hJRlQgU0VDT05ECisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1NISUZUX1NFQ09ORF9ERUxBWSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyogRGVsYXkgKHNlY29uZHMpID0gU1VCRlMgLyAoUFJFRElWX1MgKyAxKSAqLworI2RlZmluZSBMTF9SVENfU0hJRlRfU0VDT05EX0FEVkFOQ0UgICAgICAgIFJUQ19TSElGVFJfQUREMVMgICAgICAvKiBBZHZhbmNlIChzZWNvbmRzKSA9ICgxIC0gKFNVQkZTIC8gKFBSRURJVl9TICsgMSkpKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQV9NQVNLICBBTEFSTUEgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBObyBtYXNrcyBhcHBsaWVkIG9uIEFsYXJtIEEqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZICAgICAgIFJUQ19BTFJNQVJfTVNLNCAgICAgICAgIC8qITwgRGF0ZS9kYXkgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfSE9VUlMgICAgICAgICAgICAgUlRDX0FMUk1BUl9NU0szICAgICAgICAgLyohPCBIb3VycyBkbyBub3QgY2FyZSBpbiBBbGFybSBBIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTICAgICAgICAgICBSVENfQUxSTUFSX01TSzIgICAgICAgICAvKiE8IE1pbnV0ZXMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0sxICAgICAgICAgLyohPCBTZWNvbmRzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEEgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0FMTCAgICAgICAgICAgICAgIChSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEpIC8qITwgTWFza3MgYWxsICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1BX1RJTUVfRk9STUFUICBBTEFSTUEgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNICAgICAgICAgUlRDX0FMUk1BUl9QTSAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUJfTUFTSyAgQUxBUk1CIE1BU0sKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm8gbWFza3MgYXBwbGllZCBvbiBBbGFybSBCKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWSAgICAgICBSVENfQUxSTUJSX01TSzQgICAgICAgICAvKiE8IERhdGUvZGF5IGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX0hPVVJTICAgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMyAgICAgICAgIC8qITwgSG91cnMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQiBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUyAgICAgICAgICAgUlRDX0FMUk1CUl9NU0syICAgICAgICAgLyohPCBNaW51dGVzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMSAgICAgICAgIC8qITwgU2Vjb25kcyBkbyBub3QgY2FyZSBpbiBBbGFybSBCIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19BTEwgICAgICAgICAgICAgICAoUlRDX0FMUk1CUl9NU0s0IHwgUlRDX0FMUk1CUl9NU0szIHwgUlRDX0FMUk1CUl9NU0syIHwgUlRDX0FMUk1CUl9NU0sxKSAvKiE8IE1hc2tzIGFsbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQl9USU1FX0ZPUk1BVCAgQUxBUk1CIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTSAgICAgICAgIFJUQ19BTFJNQlJfUE0gICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19USU1FU1RBTVBfRURHRSAgVElNRVNUQU1QIEVER0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFJUQ19UUyBpbnB1dCByaXNpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW50ICovCisjZGVmaW5lIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HICAgICAgUlRDX0NSX1RTRURHRSAgICAgICAgIC8qITwgUlRDX1RTIGlucHV0IGZhbGxpbmcgZWRnZSBnZW5lcmF0ZXMgYSB0aW1lLXN0YW1wIGV2ZW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RTX1RJTUVfRk9STUFUICBUSU1FU1RBTVAgVElNRSBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVFNfVElNRV9GT1JNQVRfQU0gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IEFNIG9yIDI0LWhvdXIgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19UU19USU1FX0ZPUk1BVF9QTSAgICAgICAgICAgUlRDX1RTVFJfUE0gICAgICAgICAgIC8qITwgUE0gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUiAgVEFNUEVSCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl8xICAgICAgICAgICAgICAgICAgICBUQU1QX0NSMV9UQU1QMUUgLyohPCBUYW1wZXIgMSBpbnB1dCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl8yICAgICAgICAgICAgICAgICAgICBUQU1QX0NSMV9UQU1QMkUgLyohPCBUYW1wZXIgMiBpbnB1dCBkZXRlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9NQVNLICBUQU1QRVIgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIxICAgICAgICAgVEFNUF9DUjJfVEFNUDFNU0sgLyohPCBUYW1wZXIgMSBldmVudCBnZW5lcmF0ZXMgYSB0cmlnZ2VyIGV2ZW50LiBUQU1QMUYgaXMgbWFza2VkIGFuZCBpbnRlcm5hbGx5IGNsZWFyZWQgYnkgaGFyZHdhcmUuVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjIgICAgICAgICBUQU1QX0NSMl9UQU1QMk1TSyAvKiE8IFRhbXBlciAyIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAyRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS4gVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfTk9FUkFTRSAgVEFNUEVSIE5PIEVSQVNFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjEgICAgICBUQU1QX0NSMl9UQU1QMU5PRVJBU0UgLyohPCBUYW1wZXIgMSBldmVudCBkb2VzIG5vdCBlcmFzZSB0aGUgYmFja3VwIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjIgICAgICBUQU1QX0NSMl9UQU1QMk5PRVJBU0UgLyohPCBUYW1wZXIgMiBldmVudCBkb2VzIG5vdCBlcmFzZSB0aGUgYmFja3VwIHJlZ2lzdGVycy4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9EVVJBVElPTiAgVEFNUEVSIERVUkFUSU9OCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8xUlRDQ0xLICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyBkdXJpbmcgMSBSVENDTEsgY3ljbGUgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSyAgICAgVEFNUF9GTFRDUl9UQU1QUFJDSF8wICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUgc2FtcGxpbmcgZHVyaW5nIDIgUlRDQ0xLIGN5Y2xlcyAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzRSVENDTEsgICAgIFRBTVBfRkxUQ1JfVEFNUFBSQ0hfMSAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyA0IFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLICAgICBUQU1QX0ZMVENSX1RBTVBQUkNIICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyBkdXJpbmcgOCBSVENDTEsgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfRklMVEVSICBUQU1QRVIgRklMVEVSCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFRhbXBlciBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfMlNBTVBMRSAgICAgICBUQU1QX0ZMVENSX1RBTVBGTFRfMCAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgMiBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRSAgICAgICBUQU1QX0ZMVENSX1RBTVBGTFRfMSAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgNCBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9GSUxURVJfOFNBTVBMRSAgICAgICBUQU1QX0ZMVENSX1RBTVBGTFQgICAgICAvKiE8IFRhbXBlciBpcyBhY3RpdmF0ZWQgYWZ0ZXIgOCBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfU0FNUExGUkVRRElWICBUQU1QRVIgU0FNUExJTkcgRlJFUVVFTkNZIERJVklERVIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8zMjc2OCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDMyNzY4ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzE2Mzg0ICAgVEFNUF9GTFRDUl9UQU1QRlJFUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTYzODQgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MiAgICBUQU1QX0ZMVENSX1RBTVBGUkVRXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA4MTkyICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzQwOTYgICAgKFRBTVBfRkxUQ1JfVEFNUEZSRVFfMSB8IFRBTVBfRkxUQ1JfVEFNUEZSRVFfMCkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNDA5NiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4ICAgIFRBTVBfRkxUQ1JfVEFNUEZSRVFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDIwNDggKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTAyNCAgICAoVEFNUF9GTFRDUl9UQU1QRlJFUV8yIHwgVEFNUF9GTFRDUl9UQU1QRlJFUV8wKSAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAxMDI0ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMiAgICAgKFRBTVBfRkxUQ1JfVEFNUEZSRVFfMiB8IFRBTVBfRkxUQ1JfVEFNUEZSRVFfMSkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gNTEyICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzI1NiAgICAgVEFNUF9GTFRDUl9UQU1QRlJFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfQUNUSVZFTEVWRUwgIFRBTVBFUiBBQ1RJVkUgTEVWRUwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAxICAgIFRBTVBfQ1IyX1RBTVAxVFJHIC8qITwgVGFtcGVyIDEgaW5wdXQgZmFsbGluZyBlZGdlIChpZiBUQU1QRkxUID0gMDApIG9yIHN0YXlpbmcgaGlnaCAoaWYgVEFNUEZMVCAhPSAwMCkgdHJpZ2dlcnMgYSB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIgICAgVEFNUF9DUjJfVEFNUDJUUkcgLyohPCBUYW1wZXIgMiBpbnB1dCBmYWxsaW5nIGVkZ2UgKGlmIFRBTVBGTFQgPSAwMCkgb3Igc3RheWluZyBoaWdoIChpZiBUQU1QRkxUICE9IDAwKSB0cmlnZ2VycyBhIHRhbXBlciBkZXRlY3Rpb24gZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfSU5URVJOQUwgIElOVEVSTkFMIFRBTVBFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfSVRBTVAzICAgICAgICAgICBUQU1QX0NSMV9JVEFNUDNFIC8qITwgSW50ZXJuYWwgdGFtcGVyIDM6IExTRSBtb25pdG9yaW5nICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfSVRBTVA0ICAgICAgICAgICBUQU1QX0NSMV9JVEFNUDRFIC8qITwgSW50ZXJuYWwgdGFtcGVyIDQ6IEhTRSBtb25pdG9yaW5nICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfSVRBTVA1ICAgICAgICAgICBUQU1QX0NSMV9JVEFNUDVFIC8qITwgSW50ZXJuYWwgdGFtcGVyIDU6IFJUQyBjYWxlbmRhciBvdmVyZmxvdyAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0lUQU1QNiAgICAgICAgICAgVEFNUF9DUjFfSVRBTVA2RSAvKiE8IEludGVybmFsIHRhbXBlciA2OiBUZXN0IG1vZGUgZW50cnkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0JLUCAgQkFDS1VQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0JLUF9EUjAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMTF9SVENfQktQX0RSMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIyICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVQorI2RlZmluZSBMTF9SVENfQktQX0RSNCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19XQUtFVVBDTE9DS19ESVYgIFdBS0VVUCBDTE9DSyBESVYKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzE2ICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSVEMvMTYgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl84ICAgICAgICAgICBSVENfQ1JfV1VDS1NFTF8wICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDLzggY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl80ICAgICAgICAgICBSVENfQ1JfV1VDS1NFTF8xICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDLzQgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8yICAgICAgICAgICAoUlRDX0NSX1dVQ0tTRUxfMSB8IFJUQ19DUl9XVUNLU0VMXzApIC8qITwgUlRDLzIgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRSAgICAgICAgICBSVENfQ1JfV1VDS1NFTF8yICAgICAgICAgICAgICAgICAgICAgIC8qITwgY2tfc3ByZSAodXN1YWxseSAxIEh6KSBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVCAgICAgIChSVENfQ1JfV1VDS1NFTF8yIHwgUlRDX0NSX1dVQ0tTRUxfMSkgLyohPCBja19zcHJlICh1c3VhbGx5IDEgSHopIGNsb2NrIGlzIHNlbGVjdGVkIGFuZCAyZXhwMTYgaXMgYWRkZWQgdG8gdGhlIFdVVCBjb3VudGVyIHZhbHVlKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0NBTElCX09VVFBVVCAgQ2FsaWJyYXRpb24gb3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF9OT05FICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF8xSFogICAgICAgICAgICAoUlRDX0NSX0NPRSB8IFJUQ19DUl9DT1NFTCkgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgaXMgMSBIeiAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfT1VUUFVUXzUxMkhaICAgICAgICAgIFJUQ19DUl9DT0UgICAgICAgICAgICAgICAgIC8qITwgQ2FsaWJyYXRpb24gb3V0cHV0IGlzIDUxMiBIeiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQ0FMSUJfSU5TRVJUUFVMU0UgIENhbGlicmF0aW9uIHB1bHNlIGluc2VydGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9JTlNFUlRQVUxTRV9OT05FICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTm8gUlRDQ0xLIHB1bHNlcyBhcmUgYWRkZWQgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX0lOU0VSVFBVTFNFX1NFVCAgICAgICBSVENfQ0FMUl9DQUxQICAgICAgICAgLyohPCBPbmUgUlRDQ0xLIHB1bHNlIGlzIGVmZmVjdGl2ZWx5IGluc2VydGVkIGV2ZXJ5IDJleHAxMSBwdWxzZXMgKGZyZXF1ZW5jeSBpbmNyZWFzZWQgYnkgNDg4LjUgcHBtKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQ0FMSUJfUEVSSU9EICBDYWxpYnJhdGlvbiBwZXJpb2QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfUEVSSU9EXzMyU0VDICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFVzZSBhIDMyLXNlY29uZCBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX1BFUklPRF8xNlNFQyAgICAgICAgICBSVENfQ0FMUl9DQUxXMTYgICAgICAgLyohPCBVc2UgYSAxNi1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9QRVJJT0RfOFNFQyAgICAgICAgICAgUlRDX0NBTFJfQ0FMVzggICAgICAgIC8qITwgVXNlIGEgOC1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfRXhwb3J0ZWRfTWFjcm9zIFJUQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFJUQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUlRDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1JUQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fQ29udmVydCBDb252ZXJ0IGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IGEgdmFsdWUgZnJvbSAyIGRpZ2l0IGRlY2ltYWwgZm9ybWF0IHRvIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBCeXRlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIGJ5dGUKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKF9fVkFMVUVfXykgKHVpbnQ4X3QpKCgoKF9fVkFMVUVfXykgLyAxMFUpIDw8IDRVKSB8ICgoX19WQUxVRV9fKSAlIDEwVSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSB2YWx1ZSBmcm9tIEJDRCBmb3JtYXQgdG8gMiBkaWdpdCBkZWNpbWFsIGZvcm1hdAorICAqIEBwYXJhbSAgX19WQUxVRV9fIEJDRCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCBieXRlCisgICovCisjZGVmaW5lIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihfX1ZBTFVFX18pICh1aW50OF90KSgoKCh1aW50OF90KSgoX19WQUxVRV9fKSAmICh1aW50OF90KTB4RjBVKSA+PiAodWludDhfdCkweDRVKSAqIDEwVSApICsgKChfX1ZBTFVFX18pICYgKHVpbnQ4X3QpMHgwRlUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9EYXRlIERhdGUgaGVscGVyIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIHdlZWtkYXkuCisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gRGF0ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQgZnVuY3Rpb24uCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9XRUVLREFZKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PiBSVENfT0ZGU0VUX1dFRUtEQVkpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIFllYXIgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfREFURV9fIFZhbHVlIHJldHVybmVkIGJ5IEByZWYgIExMX1JUQ19EQVRFX0dldAorICAqIEByZXR2YWwgWWVhciBpbiBCQ0QgZm9ybWF0ICgweDAwIC4gLiAuIDB4OTkpCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9ZRUFSKF9fUlRDX0RBVEVfXykgKChfX1JUQ19EQVRFX18pICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIE1vbnRoIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX0RBVEVfXyBWYWx1ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX01PTlRIKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PlJUQ19PRkZTRVRfTU9OVEgpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIERheSBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gVmFsdWUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0CisgICogQHJldHZhbCBEYXkgaW4gQkNEIGZvcm1hdCAoMHgwMSAuIC4gLiAweDMxKQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfREFZKF9fUlRDX0RBVEVfXykgKCgoX19SVENfREFURV9fKSA+PlJUQ19PRkZTRVRfREFZKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FTV9UaW1lIFRpbWUgaGVscGVyIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIGhvdXIgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfVElNRV9fIFJUQyB0aW1lIHJldHVybmVkIGJ5IEByZWYgTExfUlRDX1RJTUVfR2V0IGZ1bmN0aW9uCisgICogQHJldHZhbCBIb3VycyBpbiBCQ0QgZm9ybWF0ICgweDAxLiAuIC4weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMykKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX0hPVVIoX19SVENfVElNRV9fKSAoKChfX1JUQ19USU1FX18pID4+IFJUQ19PRkZTRVRfSE9VUikgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gcmV0cmlldmUgbWludXRlIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgTWludXRlcyBpbiBCQ0QgZm9ybWF0ICgweDAwLiAuIC4weDU5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfTUlOVVRFKF9fUlRDX1RJTUVfXykgKCgoX19SVENfVElNRV9fKSA+PiBSVENfT0ZGU0VUX01JTlVURSkgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gcmV0cmlldmUgc2Vjb25kIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgU2Vjb25kcyBpbiAgZm9ybWF0ICgweDAwLiAuIC4weDU5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfU0VDT05EKF9fUlRDX1RJTUVfXykgKChfX1JUQ19USU1FX18pICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUlRDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEhvdXJzIGZvcm1hdCAoMjQgaG91ci9kYXkgb3IgQU0vUE0gaG91ciBmb3JtYXQpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgRk1UICAgICAgICAgICBMTF9SVENfU2V0SG91ckZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF9BTVBNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0SG91ckZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91ckZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0ZNVCwgSG91ckZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhvdXJzIGZvcm1hdCAoMjQgaG91ci9kYXkgb3IgQU0vUE0gaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEZNVCAgICAgICAgICAgTExfUlRDX0dldEhvdXJGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19IT1VSRk9STUFUX0FNUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0SG91ckZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9GTVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIGZsYWcgdG8gYmUgcm91dGVkIHRvIFJUQ19BTEFSTSBvdXRwdXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIE9TRUwgICAgICAgICAgTExfUlRDX1NldEFsYXJtT3V0RXZlbnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBBbGFybU91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0FMTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfQUxNQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9XQUtFVVAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRBbGFybU91dEV2ZW50KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBBbGFybU91dHB1dCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX09TRUwsIEFsYXJtT3V0cHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGZsYWcgdG8gYmUgcm91dGVkIHRvIFJUQ19BTEFSTSBvdXRwdXQKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgT1NFTCAgICAgICAgICBMTF9SVENfR2V0QWxhcm1PdXRFdmVudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfQUxNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX1dBS0VVUAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBbGFybU91dEV2ZW50KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX09TRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDX0FMQVJNIG91dHB1dCB0eXBlIChBTEFSTSBpbiBwdXNoLXB1bGwgb3Igb3Blbi1kcmFpbiBvdXRwdXQpCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFRBTVBBTFJNX1RZUEUgICAgICAgICAgTExfUlRDX1NldEFsYXJtT3V0cHV0VHlwZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX09QRU5EUkFJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX1BVU0hQVUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0QWxhcm1PdXRwdXRUeXBlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBPdXRwdXQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9UQU1QQUxSTV9UWVBFLCBPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfQUxBUk0gb3V0cHV0IHR5cGUgKEFMQVJNIGluIHB1c2gtcHVsbCBvciBvcGVuLWRyYWluIG91dHB1dCkKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgVEFNUEFMUk1fVFlQRSAgICAgICAgICBMTF9SVENfU2V0QWxhcm1PdXRwdXRUeXBlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9PUEVORFJBSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9QVVNIUFVMTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBbGFybU91dHB1dFR5cGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVEFNUEFMUk1fVFlQRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlCisgICogQG5vdGUgICBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHVzZWQgdG8gcHJvZ3JhbSB0aW1lIGFuZCBkYXRlIHJlZ2lzdGVyIChSVENfVFIgYW5kIFJUQ19EUikKKyAgKiAgICAgICAgIGFuZCBwcmVzY2FsZXIgcmVnaXN0ZXIgKFJUQ19QUkVSKS4KKyAgKiAgICAgICAgIENvdW50ZXJzIGFyZSBzdG9wcGVkIGFuZCBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBuZXcgdmFsdWUgd2hlbiBJTklUIGlzIHJlc2V0LgorICAqIEBybXRvbGwgUlRDX0lDU1IgICAgICAgICAgSU5JVCAgICAgICAgICBMTF9SVENfRW5hYmxlSW5pdE1vZGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBXUklURV9SRUcoUlRDeC0+SUNTUiwgUlRDX0xMX0lOSVRfTUFTSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlIChGcmVlIHJ1bm5pbmcgbW9kZSkKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIElOSVQgICAgICAgICAgTExfUlRDX0Rpc2FibGVJbml0TW9kZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBXUklURV9SRUcoUlRDeC0+SUNTUiwgKHVpbnQzMl90KX5SVENfSUNTUl9JTklUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgT3V0cHV0IHBvbGFyaXR5IChwaW4gaXMgbG93IHdoZW4gQUxSQUYvQUxSQkYvV1VURiBpcyBhc3NlcnRlZCkKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFBPTCAgICAgICAgICAgTExfUlRDX1NldE91dHB1dFBvbGFyaXR5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldE91dHB1dFBvbGFyaXR5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX1BPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBPdXRwdXQgcG9sYXJpdHkKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgUE9MICAgICAgICAgICBMTF9SVENfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldE91dHB1dFBvbGFyaXR5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBCeXBhc3MgdGhlIHNoYWRvdyByZWdpc3RlcnMKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEJZUFNIQUQgICAgICAgTExfUlRDX0VuYWJsZVNoYWRvd1JlZ0J5cGFzcworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVTaGFkb3dSZWdCeXBhc3MoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CWVBTSEFEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEJ5cGFzcyB0aGUgc2hhZG93IHJlZ2lzdGVycworICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBCWVBTSEFEICAgICAgIExMX1JUQ19EaXNhYmxlU2hhZG93UmVnQnlwYXNzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVTaGFkb3dSZWdCeXBhc3MoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0JZUFNIQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNoYWRvdyByZWdpc3RlcnMgYnlwYXNzIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBCWVBTSEFEICAgICAgIExMX1JUQ19Jc1NoYWRvd1JlZ0J5cGFzc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzU2hhZG93UmVnQnlwYXNzRW5hYmxlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CWVBTSEFEKSA9PSAoUlRDX0NSX0JZUFNIQUQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQ19SRUZJTiByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uICg1MCBvciA2MCBIeikKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBSRUZDS09OICAgICAgIExMX1JUQ19FbmFibGVSZWZDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVSZWZDbG9jayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1JFRkNLT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRDX1JFRklOIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24gKDUwIG9yIDYwIEh6KQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFJFRkNLT04gICAgICAgTExfUlRDX0Rpc2FibGVSZWZDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlUmVmQ2xvY2soUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1JFRkNLT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBc3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUlRDX1BSRVIgICAgICAgICBQUkVESVZfQSAgICAgIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBBc3luY2hQcmVzY2FsZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQXN5bmNoUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9BLCBBc3luY2hQcmVzY2FsZXIgPDwgUlRDX1BSRVJfUFJFRElWX0FfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUlRDX1BSRVIgICAgICAgICBQUkVESVZfUyAgICAgIExMX1JUQ19TZXRTeW5jaFByZXNjYWxlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN5bmNoUHJlc2NhbGVyIFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTeW5jaFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5QUkVSLCBSVENfUFJFUl9QUkVESVZfUywgU3luY2hQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBc3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUlRDX1BSRVIgICAgICAgICBQUkVESVZfQSAgICAgIExMX1JUQ19HZXRBc3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldEFzeW5jaFByZXNjYWxlcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+UFJFUiwgUlRDX1BSRVJfUFJFRElWX0EpID4+IFJUQ19QUkVSX1BSRURJVl9BX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9ub3VzIHByZXNjYWxlciBmYWN0b3IKKyAgKiBAcm10b2xsIFJUQ19QUkVSICAgICAgICAgUFJFRElWX1MgICAgICBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlBSRVIsIFJUQ19QUkVSX1BSRURJVl9TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBybXRvbGwgUlRDX1dQUiAgICAgICAgICBLRVkgICAgICAgICAgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+V1BSLCBSVENfV1JJVEVfUFJPVEVDVElPTl9ESVNBQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBybXRvbGwgUlRDX1dQUiAgICAgICAgICBLRVkgICAgICAgICAgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5XUFIsIFJUQ19XUklURV9QUk9URUNUSU9OX0VOQUJMRV8xKTsKKyAgV1JJVEVfUkVHKFJUQ3gtPldQUiwgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0YW1wZXIgb3V0cHV0LgorICAqIEBub3RlIFdoZW4gdGhlIHRhbXBlciBvdXRwdXQgaXMgZW5hYmxlZCwgYWxsIGV4dGVybmFsIGFuZCBpbnRlcm5hbCB0YW1wZXIgZmxhZ3MKKyAgKiAgICAgICBhcmUgT1JlZCBhbmQgcm91dGVkIHRvIHRoZSBUQU1QQUxSTSBvdXRwdXQuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFRBTVBPRSAgICAgICBMTF9SVENfRW5hYmxlVGFtcGVyT3V0cHV0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZVRhbXBlck91dHB1dChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RBTVBPRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0YW1wZXIgb3V0cHV0LgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBUQU1QT0UgICAgICAgTExfUlRDX0Rpc2FibGVUYW1wZXJPdXRwdXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVRhbXBlck91dHB1dChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVEFNUE9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0YW1wZXIgb3V0cHV0IGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBUQU1QT0UgICAgICAgTExfUlRDX0lzVGFtcGVyT3V0cHV0RW5hYmxlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNUYW1wZXJPdXRwdXRFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RBTVBPRSkgPT0gKFJUQ19DUl9UQU1QT0UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIHB1bGwtdXAgaW4gb3V0cHV0IG1vZGUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFRBTVBBTFJNX1BVICAgICAgIExMX1JUQ19FbmFibGVBbGFybVB1bGxVcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVBbGFybVB1bGxVcChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RBTVBBTFJNX1BVKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVybmFsIHB1bGwtdXAgaW4gb3V0cHV0IG1vZGUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFRBTVBBTFJNX1BVICAgICAgIExMX1JUQ19FbmFibGVBbGFybVB1bGxVcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlQWxhcm1QdWxsVXAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RBTVBBTFJNX1BVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBpbnRlcm5hbCBwdWxsLXVwIGluIG91dHB1dCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBUQU1QQUxSTV9QVSAgICAgICBMTF9SVENfSXNBbGFybVB1bGxVcEVuYWJsZWQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWxhcm1QdWxsVXBFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RBTVBBTFJNX1BVKSA9PSAoUlRDX0NSX1RBTVBBTFJNX1BVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfT1VUMiBvdXRwdXQKKyAgKiBAbm90ZSBSVENfT1VUMiBtYXBwaW5nIGRlcGVuZHMgb24gYm90aCBPU0VMIChAcmVmIExMX1JUQ19TZXRBbGFybU91dEV2ZW50KQorICAqICAgICAgIGFuZCBDT0UgKEByZWYgTExfUlRDX0NBTF9TZXRPdXRwdXRGcmVxKSBzZXR0aW5ncy4KKyAgKiBAbm90ZSBSVENfT1VUMiBpcyBub3QgYXZhaWxhYmxlIGlucyBWQkFUIG1vZGUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIE9VVDJFTiAgICAgICBMTF9SVENfRW5hYmxlT3V0cHV0MgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVPdXRwdXQyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfT1VUMkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUQ19PVVQyIG91dHB1dAorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBPVVQyRU4gICAgICAgTExfUlRDX0Rpc2FibGVPdXRwdXQyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVPdXRwdXQyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9PVVQyRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJUQ19PVVQyIG91dHB1dCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgT1VUMkVOICAgICAgIExMX1JUQ19Jc091dHB1dDJFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc091dHB1dDJFbmFibGVkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX09VVDJFTikgPT0gKFJUQ19DUl9PVVQyRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX1RpbWUgVGltZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBSVENfVFIgICAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0Rm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZUZvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0Rm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUaW1lRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCBSVENfVFJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lIGZvcm1hdCAoQU0gb3IgUE0gbm90YXRpb24pCisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQHJtdG9sbCBSVENfVFIgICAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0Rm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRSLCBSVENfVFJfUE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBob3VyIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIFJUQ19UUiAgICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRIb3VyXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0SG91cihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91cnMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfSFQgfCBSVENfVFJfSFUpLAorICAgICAgICAgICAgICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfVFJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX1RSX0hVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgaG91ciBmcm9tIEJDRCB0bworICAqICAgICAgIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFJUQ19UUiAgICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRIb3VyXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSkpID4+IFJUQ19UUl9IVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBSVENfVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVElNRV9TZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNaW51dGVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCAoUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUpLAorICAgICAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19UUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfVFJfTU5VX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBtaW51dGUgZnJvbSBCQ0QKKyAgKiAgICAgICB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVElNRV9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUpKSk+PiBSVENfVFJfTU5VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIFJUQ19UUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRTZWNvbmRcbgorICAqICAgICAgICAgUlRDX1RSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX1NldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9TZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNlY29uZHMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfU1QgfCBSVENfVFJfU1UpLAorICAgICAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19UUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19UUl9TVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRAorICAqICAgICAgIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFJUQ19UUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRTZWNvbmRcbgorICAqICAgICAgICAgUlRDX1RSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VFIsIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKSkgPj4gUlRDX1RSX1NVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAbm90ZSBUaW1lRm9ybWF0IGFuZCBIb3VycyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX1RSICAgICAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBSVENfVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgUlRDX1RSICAgICAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBSVENfVFIgICAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgUlRDX1RSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEZvcm1hdDEyXzI0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVfRk9STUFUX1BNCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0NvbmZpZyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRm9ybWF0MTJfMjQsIHVpbnQzMl90IEhvdXJzLCB1aW50MzJfdCBNaW51dGVzLCB1aW50MzJfdCBTZWNvbmRzKQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfVFJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX1RSX0hVX1BvcykpICAgICAgIHwgXAorICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX1RSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19UUl9NTlVfUG9zKSkgfCBcCisgICAgICAgICAoKChTZWNvbmRzICYgMHhGMFUpIDw8IChSVENfVFJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfVFJfU1VfUG9zKSk7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfUE0gfCBSVENfVFJfSFQgfCBSVENfVFJfSFUgfCBSVENfVFJfTU5UIHwgUlRDX1RSX01OVSB8IFJUQ19UUl9TVCB8IFJUQ19UUl9TVSksIHRlbXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiAgICAgICBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUlRDX1RSICAgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBSVENfVFIgICAgICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgUlRDX1RSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBSVENfVFIgICAgICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFJUQ19UUiAgICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVElNRV9HZXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcyAoRm9ybWF0OiAweDAwSEhNTVNTKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVIHwgUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUgfCBSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgoKCh0ZW1wICYgUlRDX1RSX0hUKSA+PiBSVENfVFJfSFRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfSFUpID4+IFJUQ19UUl9IVV9Qb3MpKSA8PCBSVENfT0ZGU0VUX0hPVVIpIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKCh0ZW1wICYgUlRDX1RSX01OVCkgPj4gUlRDX1RSX01OVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9NTlUpID4+IFJUQ19UUl9NTlVfUG9zKSkgPDwgUlRDX09GRlNFVF9NSU5VVEUpIHwgXAorICAgICAgICAgICAgICAgICAgICAoKCgodGVtcCAmIFJUQ19UUl9TVCkgPj4gUlRDX1RSX1NUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX1RSX1NVKSA+PiBSVENfVFJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1lbW9yaXplIHdoZXRoZXIgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNoYW5nZSBoYXMgYmVlbiBwZXJmb3JtZWQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRW5hYmxlRGF5TGlnaHRTdG9yZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0VuYWJsZURheUxpZ2h0U3RvcmUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgbWVtb3JpemF0aW9uIHdoZXRoZXIgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNoYW5nZSBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBCS1AgICAgICAgICAgIExMX1JUQ19USU1FX0Rpc2FibGVEYXlMaWdodFN0b3JlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfRGlzYWJsZURheUxpZ2h0U3RvcmUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0JLUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUlRDIERheSBMaWdodCBTYXZpbmcgc3RvcmVkIG9wZXJhdGlvbiBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBCS1AgICAgICAgICAgIExMX1JUQ19USU1FX0lzRGF5TGlnaHRTdG9yZUVuYWJsZWQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfSXNEYXlMaWdodFN0b3JlRW5hYmxlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApID09IChSVENfQ1JfQktQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN1YnRyYWN0IDEgaG91ciAod2ludGVyIHRpbWUgY2hhbmdlKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgU1VCMUggICAgICAgICBMTF9SVENfVElNRV9EZWNIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfRGVjSG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1NVQjFIKTsKK30KKworLyoqCisgICogQGJyaWVmICBBZGQgMSBob3VyIChzdW1tZXIgdGltZSBjaGFuZ2UpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBBREQxSCAgICAgICAgIExMX1JUQ19USU1FX0luY0hvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9JbmNIb3VyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUREMUgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTdWIgc2Vjb25kIHZhbHVlIGluIHRoZSBzeW5jaHJvbm91cyBwcmVzY2FsZXIgY291bnRlci4KKyAgKiBAbm90ZSAgWW91IGNhbiB1c2UgYm90aCBTdWJTZWNvbmRzIHZhbHVlIGFuZCBTZWNvbmRGcmFjdGlvbiAoUFJFRElWX1MgdGhyb3VnaAorICAqICAgICAgICBMTF9SVENfR2V0U3luY2hQcmVzY2FsZXIgZnVuY3Rpb24pIHRlcm1zIHJldHVybmVkIHRvIGNvbnZlcnQgQ2FsZW5kYXIKKyAgKiAgICAgICAgU3ViU2Vjb25kcyB2YWx1ZSBpbiBzZWNvbmQgZnJhY3Rpb24gcmF0aW8gd2l0aCB0aW1lIHVuaXQgZm9sbG93aW5nCisgICogICAgICAgIGdlbmVyaWMgZm9ybXVsYToKKyAgKiAgICAgICAgICA9PT4gU2Vjb25kcyBmcmFjdGlvbiByYXRpbyAqIHRpbWVfdW5pdD0gWyhTZWNvbmRGcmFjdGlvbi1TdWJTZWNvbmRzKS8oU2Vjb25kRnJhY3Rpb24rMSldICogdGltZV91bml0CisgICogICAgICAgIFRoaXMgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgaWYgbm8gc2hpZnQgb3BlcmF0aW9uIGlzIHBlbmRpbmcKKyAgKiAgICAgICAgKGllLiBTSEZQPTApIHdoZW4gUFJFRElWX1MgPj0gU1MuCisgICogQHJtdG9sbCBSVENfU1NSICAgICAgICAgIFNTICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3ViIHNlY29uZCB2YWx1ZSAobnVtYmVyIGJldHdlZW4gMCBhbmQgNjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RJTUVfR2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5TU1IsIFJUQ19TU1JfU1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTeW5jaHJvbml6ZSB0byBhIHJlbW90ZSBjbG9jayB3aXRoIGEgaGlnaCBkZWdyZWUgb2YgcHJlY2lzaW9uLgorICAqIEBub3RlICAgVGhpcyBvcGVyYXRpb24gZWZmZWN0aXZlbHkgc3VidHJhY3RzIGZyb20gKGRlbGF5cykgb3IgYWR2YW5jZSB0aGUgY2xvY2sgb2YgYSBmcmFjdGlvbiBvZiBhIHNlY29uZC4KKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBXaGVuIFJFRkNLT04gaXMgc2V0LCBmaXJtd2FyZSBtdXN0IG5vdCB3cml0ZSB0byBTaGlmdCBjb250cm9sIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgUlRDX1NISUZUUiAgICAgICBBREQxUyAgICAgICAgIExMX1JUQ19USU1FX1N5bmNocm9uaXplXG4KKyAgKiAgICAgICAgIFJUQ19TSElGVFIgICAgICAgU1VCRlMgICAgICAgICBMTF9SVENfVElNRV9TeW5jaHJvbml6ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNoaWZ0U2Vjb25kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1NISUZUX1NFQ09ORF9ERUxBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19TSElGVF9TRUNPTkRfQURWQU5DRQorICAqIEBwYXJhbSAgRnJhY3Rpb24gTnVtYmVyIG9mIFNlY29uZHMgRnJhY3Rpb25zIChhbnkgdmFsdWUgZnJvbSAwIHRvIDB4N0ZGRikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1N5bmNocm9uaXplKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTaGlmdFNlY29uZCwgdWludDMyX3QgRnJhY3Rpb24pCit7CisgIFdSSVRFX1JFRyhSVEN4LT5TSElGVFIsIFNoaWZ0U2Vjb25kIHwgRnJhY3Rpb24pOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9EYXRlIERhdGUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBZZWFyIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFllYXIgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBZVCAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldFllYXJcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldFllYXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBZZWFyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg5OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0WWVhcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgWWVhcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSksCisgICAgICAgICAgICAgKCgoWWVhciAmIDB4RjBVKSA8PCAoUlRDX0RSX1lUX1BvcyAtIDRVKSkgfCAoKFllYXIgJiAweDBGVSkgPDwgUlRDX0RSX1lVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgWWVhciBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFllYXIgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBZVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFllYXJcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFllYXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfREFURV9HZXRZZWFyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSkpKSA+PiBSVENfRFJfWVVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgV2VlayBkYXkKKyAgKiBAcm10b2xsIFJUQ19EUiAgICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfREFURV9TZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2Vla0RheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfREFURV9TZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXZWVrRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkRSLCBSVENfRFJfV0RVLCBXZWVrRGF5IDw8IFJUQ19EUl9XRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2VlayBkYXkKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0V2Vla0RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+RFIsIFJUQ19EUl9XRFUpID4+IFJUQ19EUl9XRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTW9udGggaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTW9udGggZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldE1vbnRoXG4KKyAgKiAgICAgICAgIFJUQ19EUiAgICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfREFURV9TZXRNb250aAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vbnRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX1NldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNb250aCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSksCisgICAgICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1vbnRoIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFJUQ19EUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9HZXRNb250aFxuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0TW9udGgKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KQU5VQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0ZFQlJVQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BUkNICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FQUklMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVVHVVNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX1NFUFRFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9PQ1RPQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX05PVkVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0RFQ0VNQkVSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0TW9udGgoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkRSLCAoUlRDX0RSX01UIHwgUlRDX0RSX01VKSkpPj4gUlRDX0RSX01VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldERheVxuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0RSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfRFJfRFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldERheVxuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9EVCB8IFJUQ19EUl9EVSkpKSA+PiBSVENfRFJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZGF0ZSAoV2Vla0RheSwgRGF5LCBNb250aCBhbmQgWWVhcikgaW4gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0RSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFJUQ19EUiAgICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFJUQ19EUiAgICAgICAgICAgWVQgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEBwYXJhbSAgTW9udGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqIEBwYXJhbSAgWWVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX0NvbmZpZyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSwgdWludDMyX3QgRGF5LCB1aW50MzJfdCBNb250aCwgdWludDMyX3QgWWVhcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gKFdlZWtEYXkgPDwgUlRDX0RSX1dEVV9Qb3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICgoKFllYXIgJiAweEYwVSkgPDwgKFJUQ19EUl9ZVF9Qb3MgLSA0VSkpIHwgKChZZWFyICYgMHgwRlUpIDw8IFJUQ19EUl9ZVV9Qb3MpKSAgIHwgXAorICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkgfCBcCisgICAgICAgICAoKChEYXkgJiAweEYwVSkgPDwgKFJUQ19EUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0RSX0RVX1BvcykpOworCisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfV0RVIHwgUlRDX0RSX01UIHwgUlRDX0RSX01VIHwgUlRDX0RSX0RUIHwgUlRDX0RSX0RVIHwgUlRDX0RSX1lUIHwgUlRDX0RSX1lVKSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX1dFRUtEQVksIF9fTExfUlRDX0dFVF9ZRUFSLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFJUQ19EUiAgICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIFJUQ19EUiAgICAgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgUlRDX0RSICAgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBSVENfRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIFJUQ19EUiAgICAgICAgICAgWVUgICAgICAgICAgICBMTF9SVENfREFURV9HZXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBXZWVrRGF5LCBEYXksIE1vbnRoIGFuZCBZZWFyIChGb3JtYXQ6IDB4V1dERE1NWVkpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfV0RVIHwgUlRDX0RSX01UIHwgUlRDX0RSX01VIHwgUlRDX0RSX0RUIHwgUlRDX0RSX0RVIHwgUlRDX0RSX1lUIHwgUlRDX0RSX1lVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfRFJfV0RVKSA+PiBSVENfRFJfV0RVX1BvcykgPDwgUlRDX09GRlNFVF9XRUVLREFZKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKCh0ZW1wICYgUlRDX0RSX0RUKSA+PiBSVENfRFJfRFRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfRFUpID4+IFJUQ19EUl9EVV9Qb3MpKSA8PCBSVENfT0ZGU0VUX0RBWSkgfCBcCisgICAgICAgICAgICAgICAgICAgICgoKCgodGVtcCAmIFJUQ19EUl9NVCkgPj4gUlRDX0RSX01UX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX01VKSA+PiBSVENfRFJfTVVfUG9zKSkgPDwgUlRDX09GRlNFVF9NT05USCkgfCBcCisgICAgICAgICAgICAgICAgICAgICgoKCh0ZW1wICYgUlRDX0RSX1lUKSA+PiBSVENfRFJfWVRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfWVUpID4+IFJUQ19EUl9ZVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0FMQVJNQSBBTEFSTUEKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybSBBCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBBTFJBRSAgICAgICAgIExMX1JUQ19BTE1BX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEEKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEFMUkFFICAgICAgICAgTExfUlRDX0FMTUFfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBBbGFybSBBIG1hc2tzLgorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBNU0s0ICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBNU0sxICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX01TSzQgfCBSVENfQUxSTUFSX01TSzMgfCBSVENfQUxSTUFSX01TSzIgfCBSVENfQUxSTUFSX01TSzEsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgQWxhcm0gQSBtYXNrcy4KKyAgKiBAcm10b2xsIFJUQ19BTFJNQVIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTVNLMiAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19BTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfTVNLNCB8IFJUQ19BTFJNQVJfTVNLMyB8IFJUQ19BTFJNQVJfTVNLMiB8IFJUQ19BTFJNQVJfTVNLMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybUEgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIHdlZWsgZGF5LiBEVFsxOjBdIGlzIGRvIG5vdCBjYXJlKQorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9FbmFibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybUEgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIGRhdGUgKQorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1BX0Rpc2FibGVXZWVrZGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfV0RTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBBIERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldERheVxuCisgICogICAgICAgICBSVENfQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9EVCB8IFJUQ19BTFJNQVJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUFSICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0RGF5XG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfRFQgfCBSVENfQUxSTUFSX0RVKSkpID4+IFJUQ19BTFJNQVJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBXZWVrZGF5CisgICogQHJtdG9sbCBSVENfQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0V2Vla0RheShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfRFUsIFdlZWtEYXkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIFdlZWtkYXkKKyAgKiBAcm10b2xsIFJUQ19BTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9EVSkgPj4gUlRDX0FMUk1BUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGltZUZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHRpbWUgZm9ybWF0IChBTSBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIFJUQ19BTFJNQVIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEEgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldEhvdXJcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VycykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSksCisgICAgICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9IVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldEhvdXJcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9IVCB8IFJUQ19BTFJNQVJfSFUpKSkgPj4gUlRDX0FMUk1BUl9IVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBBIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUFSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNaW51dGVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpLAorICAgICAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9NTlVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUFSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpKSkgPj4gUlRDX0FMUk1BUl9NTlVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFNlY29uZFxuCisgICogICAgICAgICBSVENfQUxSTUFSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBBIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfU1QgfCBSVENfQUxSTUFSX1NVKSkpID4+IFJUQ19BTFJNQVJfU1VfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1BUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1BUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGb3JtYXQxMl8yNCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfUE0KKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfQ29uZmlnVGltZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRm9ybWF0MTJfMjQsIHVpbnQzMl90IEhvdXJzLCB1aW50MzJfdCBNaW51dGVzLCB1aW50MzJfdCBTZWNvbmRzKQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCB8ICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfSFVfUG9zKSkgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQVJfU1VfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfUE0gfCBSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSB8IFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUgfCBSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEIgVGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9IT1VSLCBfX0xMX1JUQ19HRVRfTUlOVVRFIGFuZCBfX0xMX1JUQ19HRVRfU0VDT05ECisgICogYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFJUQ19BTFJNQVIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgaG91cnMsIG1pbnV0ZXMgYW5kIHNlY29uZHMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0VGltZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKExMX1JUQ19BTE1BX0dldEhvdXIoUlRDeCkgPDwgUlRDX09GRlNFVF9IT1VSKSB8IChMTF9SVENfQUxNQV9HZXRNaW51dGUoUlRDeCkgPDwgUlRDX09GRlNFVF9NSU5VVEUpIHwgTExfUlRDX0FMTUFfR2V0U2Vjb25kKFJUQ3gpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBNYXNrIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMgc3RhcnRpbmcgYXQgdGhpcyBiaXQKKyAgKiBAbm90ZSBUaGlzIHJlZ2lzdGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBBTFJBRSBpcyByZXNldCBpbiBSVENfQ1IgcmVnaXN0ZXIsCisgICogICAgICAgb3IgaW4gaW5pdGlhbGl6YXRpb24gbW9kZS4KKyAgKiBAcm10b2xsIFJUQ19BTFJNQVNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQV9TZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX01BU0tTUywgTWFzayA8PCBSVENfQUxSTUFTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgTWFzayB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXRzIHN0YXJ0aW5nIGF0IHRoaXMgYml0CisgICogQHJtdG9sbCBSVENfQUxSTUFTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9NQVNLU1MpID4+IFJUQ19BTFJNQVNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgUkNUX0FMUk1BU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN1YnNlY29uZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTdWJzZWNvbmQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFTU1IsIFJUQ19BTFJNQVNTUl9TUywgU3Vic2Vjb25kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgUkNUX0FMUk1BU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX1NTKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0FMQVJNQiBBTEFSTUIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybSBCCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBBTFJCRSAgICAgICAgIExMX1JUQ19BTE1CX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEIKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEFMUkJFICAgICAgICAgTExfUlRDX0FMTUJfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTcGVjaWZ5IHRoZSBBbGFybSBCIG1hc2tzLgorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBNU0s0ICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNU0syICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNU0sxICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX01TSzQgfCBSVENfQUxSTUJSX01TSzMgfCBSVENfQUxSTUJSX01TSzIgfCBSVENfQUxSTUJSX01TSzEsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgQWxhcm0gQiBtYXNrcy4KKyAgKiBAcm10b2xsIFJUQ19BTFJNQlIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgTVNLMyAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgTVNLMiAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19BTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfTVNLNCB8IFJUQ19BTFJNQlJfTVNLMyB8IFJUQ19BTFJNQlJfTVNLMiB8IFJUQ19BTFJNQlJfTVNLMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybUIgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIHdlZWsgZGF5LiBEVFsxOjBdIGlzIGRvIG5vdCBjYXJlKQorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1CX0VuYWJsZVdlZWtkYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9XRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybUIgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIGRhdGUgKQorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1CX0Rpc2FibGVXZWVrZGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfRGlzYWJsZVdlZWtkYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfV0RTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldERheVxuCisgICogICAgICAgICBSVENfQUxSTUJSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9EVCB8IFJUQ19BTFJNQlJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0FMUk1CUl9EVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUJSICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0RGF5XG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfRFQgfCBSVENfQUxSTUJSX0RVKSkpID4+IFJUQ19BTFJNQlJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBXZWVrZGF5CisgICogQHJtdG9sbCBSVENfQUxSTUJSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0V2Vla0RheShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfRFUsIFdlZWtEYXkgPDwgUlRDX0FMUk1CUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIFdlZWtkYXkKKyAgKiBAcm10b2xsIFJUQ19BTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9EVSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGltZUZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIHRpbWUgZm9ybWF0IChBTSBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIFJUQ19BTFJNQlIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lRm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFMQVJNIEIgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldEhvdXJcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VycykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX0hUIHwgUlRDX0FMUk1CUl9IVSksCisgICAgICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX0FMUk1CUl9IVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldEhvdXJcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9IVCB8IFJUQ19BTFJNQlJfSFUpKSkgPj4gUlRDX0FMUk1CUl9IVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNaW51dGVzIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNaW51dGVzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfTU5UIHwgUlRDX0FMUk1CUl9NTlUpLAorICAgICAgICAgICAgICgoKE1pbnV0ZXMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX0FMUk1CUl9NTlVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfTU5UIHwgUlRDX0FMUk1CUl9NTlUpKSkgPj4gUlRDX0FMUk1CUl9NTlVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQiBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFNlY29uZFxuCisgICogICAgICAgICBSVENfQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfQUxSTUJSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIFJUQ19BTFJNQlIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfU1QgfCBSVENfQUxSTUJSX1NVKSkpID4+IFJUQ19BTFJNQlJfU1VfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQiBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGb3JtYXQxMl8yNCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfUE0KKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfQ29uZmlnVGltZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRm9ybWF0MTJfMjQsIHVpbnQzMl90IEhvdXJzLCB1aW50MzJfdCBNaW51dGVzLCB1aW50MzJfdCBTZWNvbmRzKQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCB8ICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfSFVfUG9zKSkgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE18IFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVIHwgUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSB8IFJUQ19BTFJNQlJfU1QgfCBSVENfQUxSTUJSX1NVLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUlRDX0FMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX0FMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoTExfUlRDX0FMTUJfR2V0SG91cihSVEN4KSA8PCBSVENfT0ZGU0VUX0hPVVIpIHwgKExMX1JUQ19BTE1CX0dldE1pbnV0ZShSVEN4KSA8PCBSVENfT0ZGU0VUX01JTlVURSkgfCBMTF9SVENfQUxNQl9HZXRTZWNvbmQoUlRDeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBCIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBub3RlIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFMUkJFIGlzIHJlc2V0IGluIFJUQ19DUiByZWdpc3RlciwKKyAgKiAgICAgICBvciBpbiBpbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBybXRvbGwgUlRDX0FMUk1CU1NSICAgICBNQVNLU1MgICAgICAgIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRTdWJTZWNvbmRNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CU1NSLCBSVENfQUxSTUJTU1JfTUFTS1NTLCBNYXNrIDw8IFJUQ19BTFJNQlNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBNYXNrIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMgc3RhcnRpbmcgYXQgdGhpcyBiaXQKKyAgKiBAcm10b2xsIFJUQ19BTFJNQlNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlNTUiwgUlRDX0FMUk1CU1NSX01BU0tTUykgID4+IFJUQ19BTFJNQlNTUl9NQVNLU1NfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQiBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgUlRDX0FMUk1CU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN1YnNlY29uZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTdWJzZWNvbmQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9TUywgU3Vic2Vjb25kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgUlRDX0FMUk1CU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQlNTUiwgUlRDX0FMUk1CU1NSX1NTKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX1RpbWVzdGFtcCBUaW1lc3RhbXAKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcm5hbCBldmVudCB0aW1lc3RhbXAKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIElUU0UgICAgICAgICAgTExfUlRDX1RTX0VuYWJsZUludGVybmFsRXZlbnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRW5hYmxlSW50ZXJuYWxFdmVudChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0lUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJuYWwgZXZlbnQgdGltZXN0YW1wCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBJVFNFICAgICAgICAgIExMX1JUQ19UU19EaXNhYmxlSW50ZXJuYWxFdmVudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19EaXNhYmxlSW50ZXJuYWxFdmVudChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfSVRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgSVRTRSAgICAgICAgICAgTExfUlRDX1RTX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9UU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGltZXN0YW1wCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBJVFNFICAgICAgICAgICBMTF9SVENfVFNfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19EaXNhYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9UU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUaW1lLXN0YW1wIGV2ZW50IGFjdGl2ZSBlZGdlCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlIFRTRSBtdXN0IGJlIHJlc2V0IHdoZW4gVFNFREdFIGlzIGNoYW5nZWQgdG8gYXZvaWQgdW53YW50ZWQgVFNGIHNldHRpbmcKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgVFNFREdFICAgICAgICBMTF9SVENfVFNfU2V0QWN0aXZlRWRnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVkZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRVNUQU1QX0VER0VfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19TZXRBY3RpdmVFZGdlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBFZGdlKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNSLCBSVENfQ1JfVFNFREdFLCBFZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZS1zdGFtcCBldmVudCBhY3RpdmUgZWRnZQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgVFNFREdFICAgICAgICBMTF9SVENfVFNfR2V0QWN0aXZlRWRnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldEFjdGl2ZUVkZ2UoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFREdFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBBTS9QTSBub3RhdGlvbiAoQU0gb3IgMjQtaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBSVENfVFNUUiAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RTX0dldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UU19USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UU19USU1FX0ZPUk1BVF9QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLCBSVENfVFNUUl9QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX1RTVFIgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRIb3VyXG4KKyAgKiAgICAgICAgIFJUQ19UU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwgUlRDX1RTVFJfSFQgfCBSVENfVFNUUl9IVSkgPj4gUlRDX1RTVFJfSFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfVFNUUiAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RTX0dldE1pbnV0ZVxuCisgICogICAgICAgICBSVENfVFNUUiAgICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX1RTX0dldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX01OVCB8IFJUQ19UU1RSX01OVSkgPj4gUlRDX1RTVFJfTU5VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgUlRDX1RTVFIgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRTZWNvbmRcbgorICAqICAgICAgICAgUlRDX1RTVFIgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLCBSVENfVFNUUl9TVCB8IFJUQ19UU1RSX1NVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCB0aW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgUlRDX1RTVFIgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19UU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBSVENfVFNUUiAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RTX0dldFRpbWVcbgorICAqICAgICAgICAgUlRDX1RTVFIgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19UU19HZXRUaW1lXG4KKyAgKiAgICAgICAgIFJUQ19UU1RSICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBSVENfVFNUUiAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RTX0dldFRpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0VGltZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RTVFJfSFQgfCBSVENfVFNUUl9IVSB8IFJUQ19UU1RSX01OVCB8IFJUQ19UU1RSX01OVSB8IFJUQ19UU1RSX1NUIHwgUlRDX1RTVFJfU1UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIFdlZWsgZGF5CisgICogQHJtdG9sbCBSVENfVFNEUiAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX1RTX0dldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX1dEVSkgPj4gUlRDX1RTRFJfV0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNb250aCBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfVFNEUiAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX1RTX0dldE1vbnRoXG4KKyAgKiAgICAgICAgIFJUQ19UU0RSICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfVFNfR2V0TW9udGgKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KQU5VQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0ZFQlJVQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BUkNICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FQUklMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVVHVVNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX1NFUFRFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9PQ1RPQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX05PVkVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0RFQ0VNQkVSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU0RSLCBSVENfVFNEUl9NVCB8IFJUQ19UU0RSX01VKSA+PiBSVENfVFNEUl9NVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBSVENfVFNEUiAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX1RTX0dldERheVxuCisgICogICAgICAgICBSVENfVFNEUiAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX1RTX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX0RUIHwgUlRDX1RTRFJfRFUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIGRhdGUgKFdlZWtEYXksIERheSBhbmQgTW9udGgpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9XRUVLREFZLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFJUQ19UU0RSICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfVFNfR2V0RGF0ZVxuCisgICogICAgICAgICBSVENfVFNEUiAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGVcbgorICAqICAgICAgICAgUlRDX1RTRFIgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFJUQ19UU0RSICAgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfVFNfR2V0RGF0ZVxuCisgICogICAgICAgICBSVENfVFNEUiAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX1RTX0dldERhdGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBXZWVrZGF5LCBEYXkgYW5kIE1vbnRoCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldERhdGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX1dEVSB8IFJUQ19UU0RSX01UIHwgUlRDX1RTRFJfTVUgfCBSVENfVFNEUl9EVCB8IFJUQ19UU0RSX0RVKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRpbWUtc3RhbXAgc3ViIHNlY29uZCB2YWx1ZQorICAqIEBybXRvbGwgUlRDX1RTRFIgICAgICAgICBTUyAgICAgICAgICAgIExMX1JUQ19UU19HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTU1NSLCBSVENfVFNTU1JfU1MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSB0aW1lc3RhbXAgb24gdGFtcGVyIGRldGVjdGlvbiBldmVudAorICAqIEBybXRvbGwgUlRDX0NSICAgICAgIFRBTVBUUyAgICAgICAgTExfUlRDX1RTX0VuYWJsZU9uVGFtcGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0VuYWJsZU9uVGFtcGVyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVEFNUFRTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRpbWVzdGFtcCBvbiB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50CisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgVEFNUFRTICAgICAgICBMTF9SVENfVFNfRGlzYWJsZU9uVGFtcGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0Rpc2FibGVPblRhbXBlcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVEFNUFRTKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9UYW1wZXIgVGFtcGVyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVEFNUHggaW5wdXQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBUQU1QX0NSMSAgICAgICBUQU1QMUUgICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlXG4KKyAgKiAgICAgICAgIFRBTVBfQ1IxICAgICAgIFRBTVAyRSAgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGUKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGUoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgVGFtcGVyKQoreworICBTRVRfQklUKFRBTVB4LT5DUjEsIFRhbXBlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVEFNUHggaW5wdXQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBUQU1QX0NSMSAgICAgICBUQU1QMUUgICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QX0NSMSAgICAgICBUQU1QMkUgICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMgorICAqCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGUoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgVGFtcGVyKQoreworICBDTEVBUl9CSVQoVEFNUHgtPkNSMSwgVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVGFtcGVyIG1hc2sgZmxhZworICAqIEBub3RlIEFzc29jaWF0ZWQgVGFtcGVyIElUIG11c3Qgbm90IGVuYWJsZWQgd2hlbiB0YW1wZXIgbWFzayBpcyBzZXQuCisgICogQHJtdG9sbCBUQU1QX0NSMiAgICAgICBUQU1QMU1GICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFza1xuCisgICogICAgICAgICBUQU1QX0NSMiAgICAgICBUQU1QMk1GICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFzaworICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIyCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFzayhUQU1QX1R5cGVEZWYgKlRBTVB4LCB1aW50MzJfdCBNYXNrKQoreworICBTRVRfQklUKFRBTVB4LT5DUjIsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGFtcGVyIG1hc2sgZmxhZworICAqIEBybXRvbGwgVEFNUF9DUjIgICAgICAgVEFNUDFNRiAgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVNYXNrXG4KKyAgKiAgICAgICAgIFRBTVBfQ1IyICAgICAgIFRBTVAyTUYgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlTWFzaworICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIyCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZU1hc2soVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgTWFzaykKK3sKKyAgQ0xFQVJfQklUKFRBTVB4LT5DUjIsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBiYWNrdXAgcmVnaXN0ZXIgZXJhc2UgYWZ0ZXIgVGFtcGVyIGV2ZW50IGRldGVjdGlvbgorICAqIEBybXRvbGwgVEFNUF9DUjIgICAgICAgVEFNUDFOT0VSQVNFICBMTF9SVENfVEFNUEVSX0VuYWJsZUVyYXNlQktQXG4KKyAgKiAgICAgICAgIFRBTVBfQ1IyICAgICAgIFRBTVAyTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9FbmFibGVFcmFzZUJLUAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGVFcmFzZUJLUChUQU1QX1R5cGVEZWYgKlRBTVB4LCB1aW50MzJfdCBUYW1wZXIpCit7CisgIENMRUFSX0JJVChUQU1QeC0+Q1IyLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYmFja3VwIHJlZ2lzdGVyIGVyYXNlIGFmdGVyIFRhbXBlciBldmVudCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIFRBTVBfQ1IyICAgICAgIFRBTVAxTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1BcbgorICAqICAgICAgICAgVEFNUF9DUjIgICAgICAgVEFNUDJOT0VSQVNFICBMTF9SVENfVEFNUEVSX0Rpc2FibGVFcmFzZUJLUAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1AoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgVGFtcGVyKQoreworICBTRVRfQklUKFRBTVB4LT5DUjIsIFRhbXBlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVENfVEFNUHggcHVsbC11cCBkaXNhYmxlIChEaXNhYmxlIHByZWNoYXJnZSBvZiBSVENfVEFNUHggcGlucykKKyAgKiBAcm10b2xsIFRBTVBfRkxUQ1IgICAgICAgVEFNUFBVRElTICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVQdWxsVXAKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZVB1bGxVcChUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBTRVRfQklUKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QUFVESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfVEFNUHggcHVsbC11cCBkaXNhYmxlICggUHJlY2hhcmdlIFJUQ19UQU1QeCBwaW5zIGJlZm9yZSBzYW1wbGluZykKKyAgKiBAcm10b2xsIFRBTVBfRkxUQ1IgICAgICAgVEFNUFBVRElTICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZVB1bGxVcAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGVQdWxsVXAoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgQ0xFQVJfQklUKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QUFVESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVENfVEFNUHggcHJlY2hhcmdlIGR1cmF0aW9uCisgICogQHJtdG9sbCBUQU1QX0ZMVENSICAgICAgIFRBTVBQUkNIICAgICAgTExfUlRDX1RBTVBFUl9TZXRQcmVjaGFyZ2UKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIER1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8xUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl8yUlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl80UlRDQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9EVVJBVElPTl84UlRDQ0xLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX1NldFByZWNoYXJnZShUQU1QX1R5cGVEZWYgKlRBTVB4LCB1aW50MzJfdCBEdXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhUQU1QeC0+RkxUQ1IsIFRBTVBfRkxUQ1JfVEFNUFBSQ0gsIER1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVB4IHByZWNoYXJnZSBkdXJhdGlvbgorICAqIEBybXRvbGwgVEFNUF9GTFRDUiAgICAgICBUQU1QUFJDSCAgICAgIExMX1JUQ19UQU1QRVJfR2V0UHJlY2hhcmdlCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMVJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fNFJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fOFJUQ0NMSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UQU1QRVJfR2V0UHJlY2hhcmdlKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QUFJDSCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVENfVEFNUHggZmlsdGVyIGNvdW50CisgICogQHJtdG9sbCBUQU1QX0ZMVENSICAgICAgIFRBTVBGTFQgICAgICAgTExfUlRDX1RBTVBFUl9TZXRGaWx0ZXJDb3VudAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRmlsdGVyQ291bnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfMlNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzRTQU1QTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl84U0FNUExFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX1NldEZpbHRlckNvdW50KFRBTVBfVHlwZURlZiAqVEFNUHgsIHVpbnQzMl90IEZpbHRlckNvdW50KQoreworICBNT0RJRllfUkVHKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QRkxULCBGaWx0ZXJDb3VudCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQ19UQU1QeCBmaWx0ZXIgY291bnQKKyAgKiBAcm10b2xsIFRBTVBfRkxUQ1IgICAgICAgVEFNUEZMVCAgICAgICBMTF9SVENfVEFNUEVSX0dldEZpbHRlckNvdW50CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl8yU0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVEFNUEVSX0dldEZpbHRlckNvdW50KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QRkxUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFRhbXBlciBzYW1wbGluZyBmcmVxdWVuY3kKKyAgKiBAcm10b2xsIFRBTVBfRkxUQ1IgICAgICAgVEFNUEZSRVEgICAgICBMTF9SVENfVEFNUEVSX1NldFNhbXBsaW5nRnJlcQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2FtcGxpbmdGcmVxIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMzI3NjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xNjM4NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzgxOTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl80MDk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjA0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzEwMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl81MTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfU2V0U2FtcGxpbmdGcmVxKFRBTVBfVHlwZURlZiAqVEFNUHgsIHVpbnQzMl90IFNhbXBsaW5nRnJlcSkKK3sKKyAgTU9ESUZZX1JFRyhUQU1QeC0+RkxUQ1IsIFRBTVBfRkxUQ1JfVEFNUEZSRVEsIFNhbXBsaW5nRnJlcSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRhbXBlciBzYW1wbGluZyBmcmVxdWVuY3kKKyAgKiBAcm10b2xsIFRBTVBfRkxUQ1IgICAgICAgVEFNUEZSRVEgICAgICBMTF9SVENfVEFNUEVSX0dldFNhbXBsaW5nRnJlcQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8zMjc2OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzE2Mzg0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzQwOTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTAyNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzI1NgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UQU1QRVJfR2V0U2FtcGxpbmdGcmVxKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRBTVB4LT5GTFRDUiwgVEFNUF9GTFRDUl9UQU1QRlJFUSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBY3RpdmUgbGV2ZWwgZm9yIFRhbXBlciBpbnB1dAorICAqIEBybXRvbGwgVEFNUF9DUjIgICAgICAgVEFNUDFUUkcgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBTVBfQ1IyICAgICAgIFRBTVAyVFJHICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVBY3RpdmVMZXZlbAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlQWN0aXZlTGV2ZWwoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgVGFtcGVyKQoreworICBTRVRfQklUKFRBTVB4LT5DUjIsIFRhbXBlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBY3RpdmUgbGV2ZWwgZm9yIFRhbXBlciBpbnB1dAorICAqIEBybXRvbGwgVEFNUF9DUjIgICAgICAgVEFNUDFUUkcgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbFxuCisgICogICAgICAgICBUQU1QX0NSMiAgICAgICBUQU1QMlRSRyAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZUFjdGl2ZUxldmVsCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlQWN0aXZlTGV2ZWwoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgVGFtcGVyKQoreworICBDTEVBUl9CSVQoVEFNUHgtPkNSMiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfSW50ZXJuYWxfVGFtcGVyIEludGVybmFsIFRhbXBlcgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIHRhbXBlciBkZXRlY3Rpb24uCisgICogQHJtdG9sbCBUQU1QX0NSMSAgICAgICBJVEFNUDNFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRW5hYmxlXG4KKyAgKiAgICAgICAgIFRBTVBfQ1IxICAgICAgIElUQU1QNEUgICAgICAgTExfUlRDX1RBTVBFUl9JVEFNUF9FbmFibGVcbgorICAqICAgICAgICAgVEFNUF9DUjEgICAgICAgSVRBTVA1RSAgICAgICBMTF9SVENfVEFNUEVSX0lUQU1QX0VuYWJsZVxuCisgICogICAgICAgICBUQU1QX0NSMSAgICAgICBJVEFNUDZFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRW5hYmxlXG4KKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEludGVybmFsVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfSVRBTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9JVEFNUDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0lUQU1QNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfSVRBTVA2CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfSVRBTVBfRW5hYmxlKFRBTVBfVHlwZURlZiAqVEFNUHgsIHVpbnQzMl90IEludGVybmFsVGFtcGVyKQoreworICBTRVRfQklUKFRBTVB4LT5DUjEsIEludGVybmFsVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVybmFsIHRhbXBlciBkZXRlY3Rpb24uCisgICogQHJtdG9sbCBUQU1QX0NSMSAgICAgICBJVEFNUDNFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QX0NSMSAgICAgICBJVEFNUDRFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QX0NSMSAgICAgICBJVEFNUDVFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QX0NSMSAgICAgICBJVEFNUDZFICAgICAgIExMX1JUQ19UQU1QRVJfSVRBTVBfRGlzYWJsZVxuCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHBhcmFtICBJbnRlcm5hbFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0lUQU1QMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfSVRBTVA0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9JVEFNUDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0lUQU1QNgorICAqCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0lUQU1QX0Rpc2FibGUoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgSW50ZXJuYWxUYW1wZXIpCit7CisgIENMRUFSX0JJVChUQU1QeC0+Q1IxLCBJbnRlcm5hbFRhbXBlcik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfV2FrZXVwIFdha2V1cAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2V1cCB0aW1lcgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgV1VURSAgICAgICAgICBMTF9SVENfV0FLRVVQX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19XQUtFVVBfRW5hYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VURSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtldXAgdGltZXIKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFdVVEUgICAgICAgICAgTExfUlRDX1dBS0VVUF9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9EaXNhYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgdGltZXIgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgV1VURSAgICAgICAgICBMTF9SVENfV0FLRVVQX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfV0FLRVVQX0lzRW5hYmxlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKSA9PSAoUlRDX0NSX1dVVEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IFdha2V1cCBjbG9jaworICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEJpdCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gV1VURSBiaXQgPSAwIGFuZCBXVVRXRiBiaXQgPSAxCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFdVQ0tTRUwgICAgICAgTExfUlRDX1dBS0VVUF9TZXRDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdha2V1cENsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9TZXRDbG9jayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2FrZXVwQ2xvY2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9XVUNLU0VMLCBXYWtldXBDbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCBjbG9jaworICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBXVUNLU0VMICAgICAgIExMX1JUQ19XQUtFVVBfR2V0Q2xvY2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRV9XVVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfV0FLRVVQX0dldENsb2NrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVQ0tTRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgV2FrZXVwIGF1dG8tcmVsb2FkIHZhbHVlCisgICogQG5vdGUgICBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFdVVFdGIGlzIHNldCB0byAxCisgICogQHJtdG9sbCBSVENfV1VUUiAgICAgICAgIFdVVCAgICAgICAgICAgTExfUlRDX1dBS0VVUF9TZXRBdXRvUmVsb2FkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19XQUtFVVBfU2V0QXV0b1JlbG9hZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVmFsdWUpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+V1VUUiwgUlRDX1dVVFJfV1VULCBWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCBhdXRvLXJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgUlRDX1dVVFIgICAgICAgICBXVVQgICAgICAgICAgIExMX1JUQ19XQUtFVVBfR2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1dBS0VVUF9HZXRBdXRvUmVsb2FkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5XVVRSLCBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQmFja3VwX1JlZ2lzdGVycyBCYWNrdXBfUmVnaXN0ZXJzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgYSBkYXRhIGluIGEgc3BlY2lmaWVkIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgVEFNUF9CS1B4UiAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfQktQX1NldFJlZ2lzdGVyCisgICogQHBhcmFtICBUQU1QeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhY2t1cFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNAorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19CS1BfU2V0UmVnaXN0ZXIoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnRtcDsKKworICB0bXAgPSAmKFRBTVB4LT5CS1AwUikgKyBCYWNrdXBSZWdpc3RlcjsKKworICAvKiBXcml0ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCisgICp0bXAgPSBEYXRhOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWRzIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFJUQyBCYWNrdXAgZGF0YSBSZWdpc3Rlci4KKyAgKiBAcm10b2xsIFRBTVBfQktQeFIgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX0JLUF9HZXRSZWdpc3RlcgorICAqIEBwYXJhbSAgVEFNUHggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjQKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19CS1BfR2V0UmVnaXN0ZXIoVEFNUF9UeXBlRGVmICpUQU1QeCwgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpCit7CisgIGNvbnN0IHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnRtcDsKKworICB0bXAgPSAmKFRBTVB4LT5CS1AwUikgKyBCYWNrdXBSZWdpc3RlcjsKKworICAvKiBSZWFkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgcmV0dXJuICp0bXA7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0NhbGlicmF0aW9uIENhbGlicmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQ2FsaWJyYXRpb24gb3V0cHV0IGZyZXF1ZW5jeSAoMSBIeiBvciA1MTIgSHopCisgICogQG5vdGUgQml0cyBhcmUgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBDT0UgICAgICAgICAgIExMX1JUQ19DQUxfU2V0T3V0cHV0RnJlcVxuCisgICogICAgICAgICBSVENfQ1IgICAgICAgICAgIENPU0VMICAgICAgICAgTExfUlRDX0NBTF9TZXRPdXRwdXRGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRnJlcXVlbmN5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF8xSFoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzUxMkhaCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZyZXF1ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0NPRSB8IFJUQ19DUl9DT1NFTCwgRnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2FsaWJyYXRpb24gb3V0cHV0IGZyZXF1ZW5jeSAoMSBIeiBvciA1MTIgSHopCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIENPRSAgICAgICAgICAgTExfUlRDX0NBTF9HZXRPdXRwdXRGcmVxXG4KKyAgKiAgICAgICAgIFJUQ19DUiAgICAgICAgICAgQ09TRUwgICAgICAgICBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfMUhaCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF81MTJIWgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19DQUxfR2V0T3V0cHV0RnJlcShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9DT0UgfCBSVENfQ1JfQ09TRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbnNlcnQgb3Igbm90IE9uZSBSVENDTEsgcHVsc2UgZXZlcnkgMmV4cDExIHB1bHNlcyAoZnJlcXVlbmN5IGluY3JlYXNlZCBieSA0ODguNSBwcG0pCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgQml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBSRUNBTFBGIGlzIHNldCB0byAwCisgICogQHJtdG9sbCBSVENfQ0FMUiAgICAgICAgIENBTFAgICAgICAgICAgTExfUlRDX0NBTF9TZXRQdWxzZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFB1bHNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX0lOU0VSVFBVTFNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfU0VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldFB1bHNlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxQLCBQdWxzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgb25lIFJUQ0NMSyBoYXMgYmVlbiBpbnNlcnRlZCBvciBub3QgZXZlcnkgMmV4cDExIHB1bHNlcyAoZnJlcXVlbmN5IGluY3JlYXNlZCBieSA0ODguNSBwcG0pCisgICogQHJtdG9sbCBSVENfQ0FMUiAgICAgICAgIENBTFAgICAgICAgICAgTExfUlRDX0NBTF9Jc1B1bHNlSW5zZXJ0ZWQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0NBTF9Jc1B1bHNlSW5zZXJ0ZWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTFApID09IChSVENfQ0FMUl9DQUxQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgQml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBSRUNBTFBGIGlzIHNldCB0byAwCisgICogQHJtdG9sbCBSVENfQ0FMUiAgICAgICAgIENBTFc4ICAgICAgICAgTExfUlRDX0NBTF9TZXRQZXJpb2RcbgorICAqICAgICAgICAgUlRDX0NBTFIgICAgICAgICBDQUxXMTYgICAgICAgIExMX1JUQ19DQUxfU2V0UGVyaW9kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaW9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF8zMlNFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMTZTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzhTRUMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DQUxfU2V0UGVyaW9kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQZXJpb2QpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMVzggfCBSVENfQ0FMUl9DQUxXMTYsIFBlcmlvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QKKyAgKiBAcm10b2xsIFJUQ19DQUxSICAgICAgICAgQ0FMVzggICAgICAgICBMTF9SVENfQ0FMX0dldFBlcmlvZFxuCisgICogICAgICAgICBSVENfQ0FMUiAgICAgICAgIENBTFcxNiAgICAgICAgTExfUlRDX0NBTF9HZXRQZXJpb2QKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMzJTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzE2U0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF84U0VDCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0NBTF9HZXRQZXJpb2QoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTFc4IHwgUlRDX0NBTFJfQ0FMVzE2KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENhbGlicmF0aW9uIG1pbnVzCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgQml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBSRUNBTFBGIGlzIHNldCB0byAwCisgICogQHJtdG9sbCBSVENfQ0FMUiAgICAgICAgIENBTE0gICAgICAgICAgTExfUlRDX0NBTF9TZXRNaW51cworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENhbGliTWludXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NBTF9TZXRNaW51cyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQ2FsaWJNaW51cykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxNLCBDYWxpYk1pbnVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2FsaWJyYXRpb24gbWludXMKKyAgKiBAcm10b2xsIFJUQ19DQUxSICAgICAgICAgQ0FMTSAgICAgICAgICBMTF9SVENfQ0FMX0dldE1pbnVzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0gMHgxRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0dldE1pbnVzKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxNKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbnRlcm5hbCBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19TUiAgICAgICAgICBJVFNGICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5TUiwgUlRDX1NSX0lUU0YpID09IChSVENfU1JfSVRTRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVjYWxpYnJhdGlvbiBwZW5kaW5nIEZsYWcKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIFJFQ0FMUEYgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19SRUNBTFAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19SRUNBTFAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklDU1IsIFJUQ19JQ1NSX1JFQ0FMUEYpID09IChSVENfSUNTUl9SRUNBTFBGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lLXN0YW1wIG92ZXJmbG93IGZsYWcKKyAgKiBAcm10b2xsIFJUQ19TUiAgICAgICAgICBUU09WRiAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFNPVgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RTT1YoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPlNSLCBSVENfU1JfVFNPVkYpID09IChSVENfU1JfVFNPVkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgZmxhZworICAqIEBybXRvbGwgUlRDX1NSICAgICAgICAgIFRTRiAgICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5TUiwgUlRDX1NSX1RTRikgPT0gKFJUQ19TUl9UU0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCB0aW1lciBmbGFnCisgICogQHJtdG9sbCBSVENfU1IgICAgICAgICAgV1VURiAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+U1IsIFJUQ19TUl9XVVRGKSA9PSAoUlRDX1NSX1dVVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEIgZmxhZworICAqIEBybXRvbGwgUlRDX1NSICAgICAgICAgIEFMUkJGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+U1IsIFJUQ19TUl9BTFJCRikgPT0gKFJUQ19TUl9BTFJCRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQSBmbGFnCisgICogQHJtdG9sbCBSVENfU1IgICAgICAgICAgQUxSQUYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5TUiwgUlRDX1NSX0FMUkFGKSA9PSAoUlRDX1NSX0FMUkFGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEludGVybmFsIFRpbWUtc3RhbXAgZmxhZworICAqIEBybXRvbGwgUlRDX1NDUiAgICAgICAgICBDSVRTRiAgICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX0lUUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlNDUiwgUlRDX1NDUl9DSVRTRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVGltZS1zdGFtcCBvdmVyZmxvdyBmbGFnCisgICogQHJtdG9sbCBSVENfU0NSICAgICAgICAgIENUU09WRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFNPVgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5TQ1IsIFJUQ19TQ1JfQ1RTT1ZGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19TQ1IgICAgICAgICAgQ1RTRiAgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+U0NSLCBSVENfU0NSX0NUU0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2V1cCB0aW1lciBmbGFnCisgICogQHJtdG9sbCBSVENfU0NSICAgICAgICAgIENXVVRGICAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+U0NSLCBSVENfU0NSX0NXVVRGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBBbGFybSBCIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19TQ1IgICAgICAgICAgQ0FMUkJGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlNDUiwgUlRDX1NDUl9DQUxSQkYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEEgZmxhZworICAqIEBybXRvbGwgUlRDX1NDUiAgICAgICAgICBDQUxSQUYgICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX0FMUkEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+U0NSLCBSVENfU0NSX0NBTFJBRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEluaXRpYWxpemF0aW9uIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIElOSVRGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSU5JVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SUNTUiwgUlRDX0lDU1JfSU5JVEYpID09IChSVENfSUNTUl9JTklURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVnaXN0ZXJzIHN5bmNocm9uaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBSVENfSUNTUiAgICAgICAgICBSU0YgICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SUNTUiwgUlRDX0lDU1JfUlNGKSA9PSAoUlRDX0lDU1JfUlNGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gZmxhZworICAqIEBybXRvbGwgUlRDX0lDU1IgICAgICAgICAgUlNGICAgICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX1JTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19SUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklDU1IsICh+KChSVENfSUNTUl9SU0YgfCBSVENfSUNTUl9JTklUKSAmIDB4MDAwMDAwRkZVKSB8IChSVEN4LT5JQ1NSICYgUlRDX0lDU1JfSU5JVCkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSW5pdGlhbGl6YXRpb24gc3RhdHVzIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIElOSVRTICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JQ1NSLCBSVENfSUNTUl9JTklUUykgPT0gKFJUQ19JQ1NSX0lOSVRTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTaGlmdCBvcGVyYXRpb24gcGVuZGluZyBmbGFnCisgICogQHJtdG9sbCBSVENfSUNTUiAgICAgICAgICBTSFBGICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfU0hQCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfU0hQKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JQ1NSLCBSVENfSUNTUl9TSFBGKSA9PSAoUlRDX0lDU1JfU0hQRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2FrZXVwIHRpbWVyIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIFdVVFdGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVRXCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfV1VUVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SUNTUiwgUlRDX0lDU1JfV1VUV0YpID09IChSVENfSUNTUl9XVVRXRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiB3cml0ZSBmbGFnCisgICogQHJtdG9sbCBSVENfSUNTUiAgICAgICAgICBBTFJCV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQlcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SUNTUiwgUlRDX0lDU1JfQUxSQldGKSA9PSAoUlRDX0lDU1JfQUxSQldGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIFJUQ19JQ1NSICAgICAgICAgIEFMUkFXRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBVworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkFXKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JQ1NSLCBSVENfSUNTUl9BTFJBV0YpID09IChSVENfSUNTUl9BTFJBV0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBSVENfTUlTUiAgICAgICAgICBBTFJBTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQU0KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBTShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+TUlTUiwgUlRDX01JU1JfQUxSQU1GKSA9PSAoUlRDX01JU1JfQUxSQU1GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIG1hc2tlZCBmbGFnLgorICAqIEBybXRvbGwgUlRDX01JU1IgICAgICAgICAgQUxSQk1GICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkJNCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQk0oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPk1JU1IsIFJUQ19NSVNSX0FMUkJNRikgPT0gKFJUQ19NSVNSX0FMUkJNRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2FrZXVwIHRpbWVyIG1hc2tlZCBmbGFnLgorICAqIEBybXRvbGwgUlRDX01JU1IgICAgICAgICAgV1VUTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfV1VUTQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1dVVE0oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPk1JU1IsIFJUQ19NSVNSX1dVVE1GKSA9PSAoUlRDX01JU1JfV1VUTUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBSVENfTUlTUiAgICAgICAgICBUU01GICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RTTQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RTTShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+TUlTUiwgUlRDX01JU1JfVFNNRikgPT0gKFJUQ19NSVNSX1RTTUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgb3ZlcmZsb3cgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBSVENfTUlTUiAgICAgICAgICBUU09WTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFNPVk0KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UU09WTShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+TUlTUiwgUlRDX01JU1JfVFNPVk1GKSA9PSAoUlRDX01JU1JfVFNPVk1GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbnRlcm5hbCBUaW1lLXN0YW1wIG1hc2tlZCBmbGFnLgorICAqIEBybXRvbGwgUlRDX01JU1IgICAgICAgICAgSVRTTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRTTQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0lUU00oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPk1JU1IsIFJUQ19NSVNSX0lUU01GKSA9PSAoUlRDX01JU1JfSVRTTUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRhbXBlciAxIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TUiAgICAgICAgICBUQU1QMUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDEKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAxKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5TUiwgVEFNUF9TUl9UQU1QMUYpID09IChUQU1QX1NSX1RBTVAxRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGFtcGVyIDIgZGV0ZWN0aW9uIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX1NSICAgICAgICAgIFRBTVAyRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMgorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDIoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVEFNUHgtPlNSLCBUQU1QX1NSX1RBTVAyRikgPT0gKFRBTVBfU1JfVEFNUDJGKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IGludGVybmFsIHRhbXBlciAzIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TUiAgICAgICAgICBJVEFNUDNGICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lUQU1QMworICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVAzKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5TUiwgVEFNUF9TUl9JVEFNUDNGKSA9PSAoVEFNUF9TUl9JVEFNUDNGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcm5hbCB0YW1wZXIgNCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAcm10b2xsIFRBTVBfU1IgICAgICAgICAgSVRBTVAzRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19JVEFNUDQKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0lUQU1QNChUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+U1IsIFRBTVBfU1JfSVRBTVA0RikgPT0gKFRBTVBfU1JfSVRBTVA0RikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgaW50ZXJuYWwgdGFtcGVyIDUgZGV0ZWN0aW9uIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX1NSICAgICAgICAgIElUQU1QNUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA1CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19JVEFNUDUoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVEFNUHgtPlNSLCBUQU1QX1NSX0lUQU1QNUYpID09IChUQU1QX1NSX0lUQU1QNUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGludGVybmFsIHRhbXBlciA2IGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TUiAgICAgICAgICBJVEFNUDZGICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lUQU1QNgorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA2KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5TUiwgVEFNUF9TUl9JVEFNUDZGKSA9PSAoVEFNUF9TUl9JVEFNUDZGKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRhbXBlciAxIGludGVycnVwdCBtYXNrZWQgZmxhZy4KKyAgKiBAcm10b2xsIFRBTVBfTUlTUiAgICAgICAgICBUQU1QMU1GICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAxTQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDFNKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5NSVNSLCBUQU1QX01JU1JfVEFNUDFNRikgPT0gKFRBTVBfTUlTUl9UQU1QMU1GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0YW1wZXIgMiBpbnRlcnJ1cHQgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX01JU1IgICAgICAgICAgVEFNUDJNRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMk0KKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAyTShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+TUlTUiwgVEFNUF9NSVNSX1RBTVAyTUYpID09IChUQU1QX01JU1JfVEFNUDJNRikpID8gMVVMIDogMFVMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcm5hbCB0YW1wZXIgMyBpbnRlcnJ1cHQgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX01JU1IgICAgICAgICAgSVRBTVAzTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVAzTQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVAzTShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+TUlTUiwgVEFNUF9NSVNSX0lUQU1QM01GKSA9PSAoVEFNUF9NSVNSX0lUQU1QM01GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcm5hbCB0YW1wZXIgNCBpbnRlcnJ1cHQgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX01JU1IgICAgICAgICAgSVRBTVAzTUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA0TQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA0TShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+TUlTUiwgVEFNUF9NSVNSX0lUQU1QNE1GKSA9PSAoVEFNUF9NSVNSX0lUQU1QNE1GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcm5hbCB0YW1wZXIgNSBpbnRlcnJ1cHQgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX01JU1IgICAgICAgICAgSVRBTVA1TUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA1TQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA1TShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+TUlTUiwgVEFNUF9NSVNSX0lUQU1QNU1GKSA9PSAoVEFNUF9NSVNSX0lUQU1QNU1GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcm5hbCB0YW1wZXIgNiBpbnRlcnJ1cHQgbWFza2VkIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX01JU1IgICAgICAgICAgSVRBTVA2TUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA2TQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRBTVA2TShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+TUlTUiwgVEFNUF9NSVNSX0lUQU1QNk1GKSA9PSAoVEFNUF9NSVNSX0lUQU1QNk1GKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGFtcGVyIDEgZGV0ZWN0aW9uIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX1NDUiAgICAgICAgICBDVEFNUDFGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19UQU1QMQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19UQU1QMShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBTRVRfQklUKFRBTVB4LT5TQ1IsIFRBTVBfU0NSX0NUQU1QMUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRhbXBlciAyIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TQ1IgICAgICAgICAgQ1RBTVAyRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVEFNUDIKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVEFNUDIoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgU0VUX0JJVChUQU1QeC0+U0NSLCBUQU1QX1NDUl9DVEFNUDJGKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGludGVybmFsIHRhbXBlciAzIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TQ1IgICAgICAgICAgQ1RBTVAzRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfSVRBTVAzCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX0lUQU1QMyhUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBTRVRfQklUKFRBTVB4LT5TQ1IsIFRBTVBfU0NSX0NJVEFNUDNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBpbnRlcm5hbCB0YW1wZXIgNCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAcm10b2xsIFRBTVBfU0NSICAgICAgICAgIENUQU1QNEYgICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX0lUQU1QNAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19JVEFNUDQoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgU0VUX0JJVChUQU1QeC0+U0NSLCBUQU1QX1NDUl9DSVRBTVA0Rik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgaW50ZXJuYWwgdGFtcGVyIDUgZGV0ZWN0aW9uIGZsYWcuCisgICogQHJtdG9sbCBUQU1QX1NDUiAgICAgICAgICBDVEFNUDVGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19JVEFNUDUKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfSVRBTVA1KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIFNFVF9CSVQoVEFNUHgtPlNDUiwgVEFNUF9TQ1JfQ0lUQU1QNUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGludGVybmFsIHRhbXBlciA2IGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgVEFNUF9TQ1IgICAgICAgICAgQ1RBTVA2RiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfSVRBTVA2CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX0lUQU1QNihUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBTRVRfQklUKFRBTVB4LT5TQ1IsIFRBTVBfU0NSX0NJVEFNUDZGKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUaW1lLXN0YW1wIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICBUU0lFICAgICAgICAgTExfUlRDX0VuYWJsZUlUX1RTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUaW1lLXN0YW1wIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICBUU0lFICAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtldXAgdGltZXIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgIFdVVElFICAgICAgICAgTExfUlRDX0VuYWJsZUlUX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtldXAgdGltZXIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgIFdVVElFICAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybSBCIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgQUxSQklFICAgICAgICBMTF9SVENfRW5hYmxlSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBBTFJCSUUgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfQUxSQShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBBIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgQUxSQUlFICAgICAgICBMTF9SVENfRGlzYWJsZUlUX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX0FMUkEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVGltZS1zdGFtcCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIFJUQ19DUiAgICAgICAgICAgVFNJRSAgICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTSUUpID09IChSVENfQ1JfVFNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBXYWtldXAgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIFdVVElFICAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfV1VUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVElFKSA9PSAoUlRDX0NSX1dVVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFsYXJtIEIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBSVENfQ1IgICAgICAgICAgIEFMUkJJRSAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX0FMUkIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQklFKSA9PSAoUlRDX0NSX0FMUkJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBbGFybSBBIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgUlRDX0NSICAgICAgICAgICBBTFJBSUUgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFJRSkgPT0gKFJUQ19DUl9BTFJBSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRhbXBlciAxIGludGVycnVwdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBUQU1QMUlFICAgICAgICAgIExMX1JUQ19FbmFibGVJVF9UQU1QMQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1RBTVAxKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIFNFVF9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfVEFNUDFJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0YW1wZXIgMSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBUQU1QX0lFUiAgICAgICAgICAgVEFNUDFJRSAgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAxCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAxKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIENMRUFSX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9UQU1QMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGFtcGVyIDIgaW50ZXJydXB0LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIFRBTVAySUUgICAgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAyCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUDIoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgU0VUX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9UQU1QMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRhbXBlciAyIGludGVycnVwdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBUQU1QMklFICAgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfVEFNUDIKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfVEFNUDIoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgQ0xFQVJfQklUKFRBTVB4LT5JRVIsIFRBTVBfSUVSX1RBTVAySUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIHRhbXBlciAzIGludGVycnVwdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBJVEFNUDNJRSAgICAgICAgICBMTF9SVENfRW5hYmxlSVRfSVRBTVAzCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfSVRBTVAzKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIFNFVF9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfSVRBTVAzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJuYWwgdGFtcGVyIDMgaW50ZXJydXB0LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIElUQU1QM0lFICAgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfSVRBTVAzCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX0lUQU1QMyhUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBDTEVBUl9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfSVRBTVAzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcm5hbCB0YW1wZXIgNCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBUQU1QX0lFUiAgICAgICAgICAgSVRBTVA0SUUgICAgICAgICAgTExfUlRDX0VuYWJsZUlUX0lUQU1QNAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX0lUQU1QNChUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBTRVRfQklUKFRBTVB4LT5JRVIsIFRBTVBfSUVSX0lUQU1QNElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVybmFsIHRhbXBlciA0IGludGVycnVwdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBJVEFNUDRJRSAgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX0lUQU1QNAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9JVEFNUDQoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgQ0xFQVJfQklUKFRBTVB4LT5JRVIsIFRBTVBfSUVSX0lUQU1QNElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJuYWwgdGFtcGVyIDUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIElUQU1QNUlFICAgICAgICAgIExMX1JUQ19FbmFibGVJVF9JVEFNUDUKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9JVEFNUDUoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgU0VUX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9JVEFNUDVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcm5hbCB0YW1wZXIgNSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBUQU1QX0lFUiAgICAgICAgICAgSVRBTVA1SUUgICAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9JVEFNUDUKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfSVRBTVA1KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIENMRUFSX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9JVEFNUDVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIHRhbXBlciA2IGludGVycnVwdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBJVEFNUDZJRSAgICAgICAgICBMTF9SVENfRW5hYmxlSVRfSVRBTVA2CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfSVRBTVA2KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIFNFVF9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfSVRBTVA2SUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJuYWwgdGFtcGVyIDYgaW50ZXJydXB0LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIElUQU1QNklFICAgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfSVRBTVA2CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX0lUQU1QNihUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICBDTEVBUl9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfSVRBTVA2SUUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGFtcGVyIDEgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIFRBTVAxSUUgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMQorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMShUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9UQU1QMUlFKSA9PSAoVEFNUF9JRVJfVEFNUDFJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0YW1wZXIgMiBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHJtdG9sbCBUQU1QX0lFUiAgICAgICAgICAgVEFNUDJJRSAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAyCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAyKFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5JRVIsIFRBTVBfSUVSX1RBTVAySUUpID09IChUQU1QX0lFUl9UQU1QMklFKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgaW50ZXJuYWwgdGFtcGVyIDMgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIElUQU1QM0lFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfSVRBTVAzCisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX0lUQU1QMyhUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9JVEFNUDNJRSkgPT0gKFRBTVBfSUVSX0lUQU1QM0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGludGVybmFsIHRhbXBlciA0IGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFRBTVBfSUVSICAgICAgICAgICBJVEFNUDRJRSAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX0lUQU1QNAorICAqIEBwYXJhbSAgVEFNUHggVEFNUCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9JVEFNUDQoVEFNUF9UeXBlRGVmICpUQU1QeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVEFNUHgtPklFUiwgVEFNUF9JRVJfSVRBTVA0SUUpID09IChUQU1QX0lFUl9JVEFNUDRJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBpbnRlcm5hbCB0YW1wZXIgNSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHJtdG9sbCBUQU1QX0lFUiAgICAgICAgICAgSVRBTVA1SUUgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9JVEFNUDUKKyAgKiBAcGFyYW0gIFRBTVB4IFRBTVAgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfSVRBTVA1KFRBTVBfVHlwZURlZiAqVEFNUHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRBTVB4LT5JRVIsIFRBTVBfSUVSX0lUQU1QNUlFKSA9PSAoVEFNUF9JRVJfSVRBTVA1SUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgaW50ZXJuYWwgdGFtcGVyIDYgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBybXRvbGwgVEFNUF9JRVIgICAgICAgICAgIElUQU1QNklFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfSVRBTVA2CisgICogQHBhcmFtICBUQU1QeCBUQU1QIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX0lUQU1QNihUQU1QX1R5cGVEZWYgKlRBTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChUQU1QeC0+SUVSLCBUQU1QX0lFUl9JVEFNUDZJRSkgPT0gKFRBTVBfSUVSX0lUQU1QNklFKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1JUQ19EZUluaXQoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIExMX1JUQ19Jbml0VHlwZURlZiAqUlRDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfVElNRV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfVGltZVR5cGVEZWYgKlJUQ19UaW1lU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfREFURV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19EQVRFX1N0cnVjdEluaXQoTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfQUxNQV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUJfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1BX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1CX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FeGl0SW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ19UeXBlRGVmICpSVEN4KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUlRDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX1JUQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX3NwaS5oIGIvSW5jL3N0bTMyZzB4eF9sbF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYyN2JhCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9zcGkuaApAQCAtMCwwICsxLDIyODYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfc3BpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX1NQSV9ICisjZGVmaW5lIFNUTTMyRzB4eF9MTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMIFNQSQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VTX0lOSVQgU1BJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTUEkgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwgZGF0YSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19UUkFOU0ZFUl9NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBtb2RlIChNYXN0ZXIvU2xhdmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldE1vZGUoKS4qLworCisgIHVpbnQzMl90IERhdGFXaWR0aDsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgQ2xvY2tQaGFzZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19QSEFTRS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRDbG9ja1BoYXNlKCkuKi8KKworICB1aW50MzJfdCBOU1M7ICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTIHNpZ25hbCBpcyBtYW5hZ2VkIGJ5IGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfTlNTX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0TlNTTW9kZSgpLiovCisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CQVVEUkFURVBSRVNDQUxFUi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQml0T3JkZXI7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfQklUX09SREVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyQml0T3JkZXIoKS4qLworCisgIHVpbnQzMl90IENSQ0NhbGN1bGF0aW9uOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19DUkNfQ0FMQ1VMQVRJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfU1BJX0VuYWJsZUNSQygpIGFuZCBAcmVmIExMX1NQSV9EaXNhYmxlQ1JDKCkuKi8KKworICB1aW50MzJfdCBDUkNQb2x5OyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbCgpLiovCisKK30gTExfU1BJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFNQSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9SWE5FICAgICAgICAgICAgICAgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfVFhFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUgICAgICAgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQlNZICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kgICAgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQ1JDRVJSICAgICAgICAgICAgICAgICAgIFNQSV9TUl9DUkNFUlIgICAgICAgICAgICAgLyohPCBDUkMgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfTU9ERiAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9NT0RGICAgICAgICAgICAgICAgLyohPCBNb2RlIGZhdWx0IGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIgICAgICAgICAgICAgICAgLyohPCBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfRlJFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9GUkUgICAgICAgICAgICAgICAgLyohPCBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgYW5kICBMTF9TUElfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0NSMl9SWE5FSUUgICAgICAgICAgICAgICAgICBTUElfQ1IyX1JYTkVJRSAgICAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1NQSV9DUjJfVFhFSUUgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRSAgICAgICAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9TUElfQ1IyX0VSUklFICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfRVJSSUUgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTU9ERV9NQVNURVIgICAgICAgICAgICAgICAgIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkgICAgLyohPCBNYXN0ZXIgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfU1BJX01PREVfU0xBVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgY29uZmlndXJhdGlvbiAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QUk9UT0NPTCBTZXJpYWwgUHJvdG9jb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBNb3Rvcm9sYSBtb2RlLiBVc2VkIGFzIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgTExfU1BJX1BST1RPQ09MX1RJICAgICAgICAgICAgICAgICAoU1BJX0NSMl9GUkYpICAgICAgICAgICAgIC8qITwgVEkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IEZpcnN0IGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlICAqLworI2RlZmluZSBMTF9TUElfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgIChTUElfQ1IxX0NQSEEpICAgICAgICAgICAgLyohPCBTZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMCB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoU1BJX0NSMV9DUE9MKSAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMSB3aGVuIGlkbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0JBVURSQVRFUFJFU0NBTEVSIEJhdWQgUmF0ZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzIgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNCAgICAgIChTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzQgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWOCAgICAgIChTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzggICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYgICAgIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzE2ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMzIgICAgIChTUElfQ1IxX0JSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzMyICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzY0ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzEyOCAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjU2ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQklUX09SREVSIFRyYW5zbWlzc2lvbiBCaXQgT3JkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTFNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIChTUElfQ1IxX0xTQkZJUlNUKSAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIExTQiBmaXJzdCAqLworI2RlZmluZSBMTF9TUElfTVNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfVFJBTlNGRVJfTU9ERSBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0ZVTExfRFVQTEVYICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGdWxsLUR1cGxleCBtb2RlLiBSeCBhbmQgVHggdHJhbnNmZXIgb24gMiBsaW5lcyAqLworI2RlZmluZSBMTF9TUElfU0lNUExFWF9SWCAgICAgICAgICAgICAgICAgIChTUElfQ1IxX1JYT05MWSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFNpbXBsZXggUnggbW9kZS4gIFJ4IHRyYW5zZmVyIG9ubHkgb24gMSBsaW5lICAgICovCisjZGVmaW5lIExMX1NQSV9IQUxGX0RVUExFWF9SWCAgICAgICAgICAgICAgKFNQSV9DUjFfQklESU1PREUpICAgICAgICAgICAgICAgICAgIC8qITwgSGFsZi1EdXBsZXggUnggbW9kZS4gUnggdHJhbnNmZXIgb24gMSBsaW5lICAgICAgKi8KKyNkZWZpbmUgTExfU1BJX0hBTEZfRFVQTEVYX1RYICAgICAgICAgICAgICAoU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSAgLyohPCBIYWxmLUR1cGxleCBUeCBtb2RlLiBUeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfTlNTX01PREUgU2xhdmUgU2VsZWN0IFBpbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX05TU19TT0ZUICAgICAgICAgICAgICAgICAgICAoU1BJX0NSMV9TU00pICAgICAgICAgICAgICAgICAgICAgLyohPCBOU1MgbWFuYWdlZCBpbnRlcm5hbGx5LiBOU1MgcGluIG5vdCB1c2VkIGFuZCBmcmVlICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfTlNTX0hBUkRfSU5QVVQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5TUyBwaW4gdXNlZCBpbiBJbnB1dC4gT25seSB1c2VkIGluIE1hc3RlciBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgKCgodWludDMyX3QpU1BJX0NSMl9TU09FIDw8IDE2VSkpIC8qITwgTlNTIHBpbiB1c2VkIGluIE91dHB1dC4gT25seSB1c2VkIGluIFNsYXZlIG1vZGUgYXMgY2hpcCBzZWxlY3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzRCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzAgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDQgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzVCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDUgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzZCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDYgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzdCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDcgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzhCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDggYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzlCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDkgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEwQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTAgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzExQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTEgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEyQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTIgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEzQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTMgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE0QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTQgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE1QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTUgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE2QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTYgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQ1JDX0NBTENVTEFUSU9OIENSQyBDYWxjdWxhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IENSQyBjYWxjdWxhdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFICAgICAgIChTUElfQ1IxX0NSQ0VOKSAgICAgICAgICAgLyohPCBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0NSQ19MRU5HVEggQ1JDIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9DUkNfOEJJVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8ICA4LWJpdCBDUkMgbGVuZ3RoICovCisjZGVmaW5lIExMX1NQSV9DUkNfMTZCSVQgICAgICAgICAgICAgICAgICAgKFNQSV9DUjFfQ1JDTCkgICAgICAgICAgICAvKiE8IDE2LWJpdCBDUkMgbGVuZ3RoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19SWF9GSUZPX1RIIFJYIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRiAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgRklGTyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1ZWwgdG8gMS8yICgxNi1iaXQpICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVIgICAgICAgICAgKFNQSV9DUjJfRlJYVEgpICAgICAgICAgICAvKiE8IFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIEZJRk8gbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWVsIHRvIDEvNCAoOC1iaXQpICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfUlhfRklGTyBSWCBGSUZPIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fRU1QVFkgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHJlY2VwdGlvbiBlbXB0eSAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19RVUFSVEVSX0ZVTEwgICAgICAgIChTUElfU1JfRlJMVkxfMCkgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gcmVjZXB0aW9uIDEvNCAgICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTCAgICAgICAgICAgKFNQSV9TUl9GUkxWTF8xKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyByZWNlcHRpb24gMS8yICAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAoU1BJX1NSX0ZSTFZMXzEgfCBTUElfU1JfRlJMVkxfMCkgLyohPCBGSUZPIHJlY2VwdGlvbiBmdWxsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfVFhfRklGTyBUWCBGSUZPIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRU1QVFkgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBlbXB0eSAqLworI2RlZmluZSBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwgICAgICAgIChTUElfU1JfRlRMVkxfMCkgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gdHJhbnNtaXNzaW9uIDEvNCAgICovCisjZGVmaW5lIExMX1NQSV9UWF9GSUZPX0hBTEZfRlVMTCAgICAgICAgICAgKFNQSV9TUl9GVExWTF8xKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyB0cmFuc21pc3Npb24gMS8yICAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAoU1BJX1NSX0ZUTFZMXzEgfCBTUElfU1JfRlRMVkxfMCkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBmdWxsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfRE1BX1BBUklUWSBETUEgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0RNQV9QQVJJVFlfRVZFTiAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgU2VsZWN0IERNQSBwYXJpdHkgRXZlbiAqLworI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9PREQgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgLyohPCBTZWxlY3QgRE1BIHBhcml0eSBPZGQgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gU1BJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9TUElfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0VuYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBub3RlICAgV2hlbiBkaXNhYmxpbmcgdGhlIFNQSSwgZm9sbG93IHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluIHRoZSBSZWZlcmVuY2UgTWFudWFsLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNQSSBwZXJpcGhlcmFsIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSkgPT0gKFNQSV9DUjFfU1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTUEkgb3BlcmF0aW9uIG1vZGUgdG8gTWFzdGVyIG9yIFNsYXZlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU1NJICAgICAgICAgICBMTF9TUElfU2V0TW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9TTEFWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNQSSBvcGVyYXRpb24gbW9kZSAoTWFzdGVyIG9yIFNsYXZlKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1TVFIgICAgICAgICAgTExfU1BJX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNTSSAgICAgICAgICAgTExfU1BJX0dldE1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX1NMQVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYsIFN0YW5kYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9HZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRlJGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNsb2NrIHBoYXNlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUEhBICAgICAgICAgIExMX1NQSV9TZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENsb2NrUGhhc2UoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENsb2NrUGhhc2UpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQSEEsIENsb2NrUGhhc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBwaGFzZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQSEEgICAgICAgICAgTExfU1BJX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDbG9ja1BoYXNlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjbG9jayBwb2xhcml0eQorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUE9MICAgICAgICAgIExMX1NQSV9HZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYmF1ZCByYXRlIHByZXNjYWxlcgorICAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSSBCYXVkUmF0ZSA9IGZQQ0xLL1ByZXNjYWxlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQmF1ZFJhdGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSLCBCYXVkUmF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9HZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0QmF1ZFJhdGVQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9CUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0cmFuc2ZlciBiaXQgb3JkZXIKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckJpdE9yZGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdHJhbnNmZXIgYml0IG9yZGVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0xTQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgICogQG5vdGUgICBGb3IgSGFsZi1EdXBsZXggbW9kZSwgUnggRGlyZWN0aW9uIGlzIHNldCBieSBkZWZhdWx0LgorICAqICAgICAgICAgSW4gbWFzdGVyIG1vZGUsIHRoZSBNT1NJIHBpbiBpcyB1c2VkIGFuZCBpbiBzbGF2ZSBtb2RlLCB0aGUgTUlTTyBwaW4gaXMgdXNlZCBmb3IgSGFsZi1EdXBsZXguCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhPTkxZICAgICAgICBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1NJTVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1JYT05MWSB8IFNQSV9DUjFfQklESU1PREUgfCBTUElfQ1IxX0JJRElPRSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0cmFuc2ZlciBkaXJlY3Rpb24gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYT05MWSAgICAgICAgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJTU9ERSAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQklESU9FICAgICAgICBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9GVUxMX0RVUExFWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9TSU1QTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1RYCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfUlhPTkxZIHwgU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZyYW1lIGRhdGEgd2lkdGgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEUyAgICAgICAgICAgIExMX1NQSV9TZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhV2lkdGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmcmFtZSBkYXRhIHdpZHRoCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRFMgICAgICAgICAgICBMTF9TUElfR2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERhdGFXaWR0aChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfU2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfRlJYVEgsIFRocmVzaG9sZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfR2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9IQUxGCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9GUlhUSCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9DUkNfTWFuYWdlbWVudCBDUkMgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0VuYWJsZUNSQworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0Rpc2FibGVDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUNSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ1JDIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZENSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKSA9PSAoU1BJX0NSMV9DUkNFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIExlbmd0aAorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0wgICAgICAgICAgTExfU1BJX1NldENSQ1dpZHRoCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ1JDTGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ18xNkJJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1dpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDUkNMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wsIENSQ0xlbmd0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENSQyBMZW5ndGgKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNMICAgICAgICAgIExMX1NQSV9HZXRDUkNXaWR0aAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ18xNkJJVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDUkNXaWR0aChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDTmV4dCB0byB0cmFuc2ZlciBDUkMgb24gdGhlIGxpbmUKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGhhcyB0byBiZSB3cml0dGVuIGFzIHNvb24gYXMgdGhlIGxhc3QgZGF0YSBpcyB3cml0dGVuIGluIHRoZSBTUEl4X0RSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ05FWFQgICAgICAgTExfU1BJX1NldENSQ05leHQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q1JDTmV4dChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbgorICAqIEBybXRvbGwgQ1JDUFIgICAgICAgIENSQ1BPTFkgICAgICAgTExfU1BJX1NldENSQ1BvbHlub21pYWwKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBDUkNQb2x5IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ1JDUG9seSkKK3sKKyAgV1JJVEVfUkVHKFNQSXgtPkNSQ1BSLCAodWludDE2X3QpQ1JDUG9seSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbgorICAqIEBybXRvbGwgQ1JDUFIgICAgICAgIENSQ1BPTFkgICAgICAgTExfU1BJX0dldENSQ1BvbHlub21pYWwKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDUG9seW5vbWlhbChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+Q1JDUFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUnggQ1JDCisgICogQHJtdG9sbCBSWENSQ1IgICAgICAgUlhDUkMgICAgICAgICBMTF9TUElfR2V0UnhDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlJYQ1JDUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUeCBDUkMKKyAgKiBAcm10b2xsIFRYQ1JDUiAgICAgICBUWENSQyAgICAgICAgIExMX1NQSV9HZXRUeENSQworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGlzIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUeENSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+VFhDUkNSKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX05TU19NYW5hZ2VtZW50IFNsYXZlIFNlbGVjdCBQaW4gTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IE5TUyBtb2RlCisgICogQG5vdGUgICBMTF9TUElfTlNTX1NPRlQgTW9kZSBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9TZXROU1NNb2RlXG4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTU09FICAgICAgICAgIExMX1NQSV9TZXROU1NNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgTlNTIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19TT0ZUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX09VVFBVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE5TU01vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE5TUykKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfU1NNLCAgTlNTKTsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfU1NPRSwgKCh1aW50MzJfdCkoTlNTID4+IDE2VSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTlNTIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9HZXROU1NNb2RlXG4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTU09FICAgICAgICAgIExMX1NQSV9HZXROU1NNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX1NPRlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX0hBUkRfSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX0hBUkRfT1VUUFVUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE5TU01vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IFNzbSAgPSAoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NTTSkpOworICByZWdpc3RlciB1aW50MzJfdCBTc29lID0gKFJFQURfQklUKFNQSXgtPkNSMiwgIFNQSV9DUjJfU1NPRSkgPDwgMTZVKTsKKyAgcmV0dXJuIChTc20gfCBTc29lKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX05TU1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRGlzYWJsZU5TU1B1bHNlTWd0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVOU1NQdWxzZU1ndChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBOU1MgcHVsc2UgaXMgZW5hYmxlZAorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLiBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOU1NQICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWROU1NQdWxzZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkTlNTUHVsc2UoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKSA9PSAoU1BJX0NSMl9OU1NQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBidWZmZXIgaXMgbm90IGVtcHR5CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUlhORSAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1JYTkUpID09IChTUElfU1JfUlhORSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUWEUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1RYRSkgPT0gKFNQSV9TUl9UWEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENSQyBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ1JDRVJSICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0NSQ0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0NSQ0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9DUkNFUlIpID09IChTUElfU1JfQ1JDRVJSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBtb2RlIGZhdWx0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX01PREYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfTU9ERikgPT0gKFNQSV9TUl9NT0RGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBvdmVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX09WUikgPT0gKFNQSV9TUl9PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZworICAqIEBub3RlICAgVGhlIEJTWSBmbGFnIGlzIGNsZWFyZWQgdW5kZXIgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgICogLVdoZW4gdGhlIFNQSSBpcyBjb3JyZWN0bHkgZGlzYWJsZWQKKyAgKiAtV2hlbiBhIGZhdWx0IGlzIGRldGVjdGVkIGluIE1hc3RlciBtb2RlIChNT0RGIGJpdCBzZXQgdG8gMSkKKyAgKiAtSW4gTWFzdGVyIG1vZGUsIHdoZW4gaXQgZmluaXNoZXMgYSBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgbm8gbmV3IGRhdGEgaXMgcmVhZHkgdG8gYmUKKyAgKiBzZW50CisgICogLUluIFNsYXZlIG1vZGUsIHdoZW4gdGhlIEJTWSBmbGFnIGlzIHNldCB0byAnMCcgZm9yIGF0IGxlYXN0IG9uZSBTUEkgY2xvY2sgY3ljbGUgYmV0d2VlbgorICAqIGVhY2ggZGF0YSB0cmFuc2Zlci4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCU1kgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0JTWSkgPT0gKFNQSV9TUl9CU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9GUkUpID09IChTUElfU1JfRlJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBGSUZPIHJlY2VwdGlvbiBMZXZlbAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSTFZMICAgICAgICAgTExfU1BJX0dldFJ4RklGT0xldmVsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19FTVBUWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0ZVTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhGSUZPTGV2ZWwoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfRlJMVkwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRklGTyBUcmFuc21pc3Npb24gTGV2ZWwKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGVExWTCAgICAgICAgIExMX1NQSV9HZXRUeEZJRk9MZXZlbAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fRU1QVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19IQUxGX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19GVUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFR4RklGT0xldmVsKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZUTFZMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ1JDIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9DbGVhckZsYWdfQ1JDRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgbW9kZSBmYXVsdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWdfc3I7CisgIHRtcHJlZ19zciA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnX3NyOworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X0RSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+RFI7CisgICh2b2lkKSB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpIHRtcHJlZzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGVycm9yIGludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9FbmFibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRW5hYmxlSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgaW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzIChDUkNFUlIsIE9WUiwgTU9ERiBpbiBTUEkgbW9kZSwgRlJFIGF0IFRJIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBlcnJvciBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRVJSSUUpID09IChTUElfQ1IyX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKSA9PSAoU1BJX0NSMl9SWE5FSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpID09IChTUElfQ1IyX1RYRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSA9PSAoU1BJX0NSMl9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBUeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgcGFyaXR5IG9mICBMYXN0IERNQSByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9TZXRETUFQYXJpdHlfUlgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0xETUFSWCwgKFBhcml0eSA8PCBTUElfQ1IyX0xETUFSWF9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGFyaXR5IGNvbmZpZ3VyYXRpb24gZm9yICBMYXN0IERNQSByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9HZXRETUFQYXJpdHlfUlgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYKSA+PiBTUElfQ1IyX0xETUFSWF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJpdHkgb2YgIExhc3QgRE1BIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFUWCAgICAgICAgTExfU1BJX1NldERNQVBhcml0eV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRETUFQYXJpdHlfVFgoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFBhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVRYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVRYX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJpdHkgY29uZmlndXJhdGlvbiBmb3IgTGFzdCBETUEgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTERNQVRYICAgICAgICBMTF9TUElfR2V0RE1BUGFyaXR5X1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERNQVBhcml0eV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0xETUFUWCkgPj4gU1BJX0NSMl9MRE1BVFhfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9ETUFfR2V0UmVnQWRkcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkgJiAoU1BJeC0+RFIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9EQVRBX01hbmFnZW1lbnQgREFUQSBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIDgtQml0cyBpbiB0aGUgZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1NQSV9SZWNlaXZlRGF0YTgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9SRUcoU1BJeC0+RFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9SZWNlaXZlRGF0YTE2CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfU1BJX1JlY2VpdmVEYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfUkVHKFNQSXgtPkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9UcmFuc21pdERhdGE4KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFR4RGF0YSkKK3sKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgX19JTyB1aW50OF90ICpzcGlkciA9ICgoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSA9IFR4RGF0YTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1RyYW5zbWl0RGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MTZfdCBUeERhdGEpCit7CisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisgIF9fSU8gdWludDE2X3QgKnNwaWRyID0gKChfX0lPIHVpbnQxNl90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgU1BJeC0+RFIgPSBUeERhdGE7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1NQSV9EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpOworRXJyb3JTdGF0dXMgTExfU1BJX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIEkyU19MTCBJMlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEkyU19MTF9FU19JTklUIEkyUyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSTJTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBJMlMgb3BlcmF0aW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX01PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoKS4qLworCisgIHVpbnQzMl90IFN0YW5kYXJkOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RhbmRhcmQgdXNlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19TVEFOREFSRAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJTX1NldFN0YW5kYXJkKCkuKi8KKworCisgIHVpbnQzMl90IERhdGFGb3JtYXQ7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGF0YSBmb3JtYXQgZm9yIHRoZSBJMlMgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMlNfTExfRUNfREFUQV9GT1JNQVQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyU19TZXREYXRhRm9ybWF0KCkuKi8KKworCisgIHVpbnQzMl90IE1DTEtPdXRwdXQ7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMlMgTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX01DTEtfT1VUUFVUCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfSTJTX0VuYWJsZU1hc3RlckNsb2NrKCkgb3IgQHJlZiBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrLiovCisKKworICB1aW50MzJfdCBBdWRpb0ZyZXE7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBzZWxlY3RlZCBmb3IgdGhlIEkyUyBjb21tdW5pY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEkyU19MTF9FQ19BVURJT19GUkVRCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gRnJlcXVlbmN5IGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIFJlZmVyZW5jZSBtYW51YWwgZm9ybXVsYXMgdG8gY2FsY3VsYXRlIFByZXNjYWxlciBMaW5lYXIsIFBhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKCkgYW5kIEByZWYgTExfSTJTX1NldFByZXNjYWxlclBhcml0eSgpIHRvIHNldCBpdC4qLworCisKKyAgdWludDMyX3QgQ2xvY2tQb2xhcml0eTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpZGxlIHN0YXRlIG9mIHRoZSBJMlMgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJTX0xMX0VDX1BPTEFSSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eSgpLiovCisKK30gTExfSTJTX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBJMlMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyU19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1JYTkUgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfUlhORSAgICAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1RYRSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfVFhFICAgICAgICAgICAgIC8qITwgVHggYnVmZmVyIGVtcHR5IGZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX0JTWSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfQlNZICAgICAgICAgICAgIC8qITwgQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX1VEUiAgICAgICAgICAgICAgICAgICAgICBTUElfU1JfVURSICAgICAgICAgICAgICAgIC8qITwgVW5kZXJydW4gZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX09WUiAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfT1ZSICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX1NSX0ZSRSAgICAgICAgICAgICAgICAgICAgICBMTF9TUElfU1JfRlJFICAgICAgICAgICAgIC8qITwgVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1NQSV9SZWFkUmVnIGFuZCAgTExfU1BJX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19DUjJfUlhORUlFICAgICAgICAgICAgICAgICAgTExfU1BJX0NSMl9SWE5FSUUgICAgICAgICAvKiE8IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9JMlNfQ1IyX1RYRUlFICAgICAgICAgICAgICAgICAgIExMX1NQSV9DUjJfVFhFSUUgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0NSMl9FUlJJRSAgICAgICAgICAgICAgICAgICBMTF9TUElfQ1IyX0VSUklFICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19EQVRBX0ZPUk1BVCBEYXRhIGZvcm1hdAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzE2QiAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5naHQgMTZiaXQgKi8KKyNkZWZpbmUgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVEICAgICAoU1BJX0kyU0NGR1JfQ0hMRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIGxlbmd0aCAxNiBiaXRzLCBDaGFubmVsIGxlbmdodCAzMmJpdCAqLworI2RlZmluZSBMTF9JMlNfREFUQUZPUk1BVF8yNEIgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTl8wKSAgICAvKiE8IERhdGEgbGVuZ3RoIDI0IGJpdHMsIENoYW5uZWwgbGVuZ2h0IDMyYml0ICovCisjZGVmaW5lIExMX0kyU19EQVRBRk9STUFUXzMyQiAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0NITEVOIHwgU1BJX0kyU0NGR1JfREFUTEVOXzEpICAgIC8qITwgRGF0YSBsZW5ndGggMTYgYml0cywgQ2hhbm5lbCBsZW5naHQgMzJiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgc3RlYWR5IHN0YXRlIGlzIGxvdyBsZXZlbCAgKi8KKyNkZWZpbmUgTExfSTJTX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0tQT0wpICAgICAgIC8qITwgQ2xvY2sgc3RlYWR5IHN0YXRlIGlzIGhpZ2ggbGV2ZWwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX1NUQU5EQVJEIEkycyBTdGFuZGFyZAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QSElMSVBTICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEkyUyBzdGFuZGFyZCBwaGlsaXBzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9NU0IgICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1TQiBqdXN0aWZpZWQgc3RhbmRhcmQgKGxlZnQganVzdGlmaWVkKSAgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9MU0IgICAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTQiBqdXN0aWZpZWQgc3RhbmRhcmQgKHJpZ2h0IGp1c3RpZmllZCkgICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgU1BJX0kyU0NGR1JfSTJTU1REXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBDTSBzdGFuZGFyZCwgc2hvcnQgZnJhbWUgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIExMX0kyU19TVEFOREFSRF9QQ01fTE9ORyAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU1NURF8wIHwgU1BJX0kyU0NGR1JfSTJTU1REXzEgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSAvKiE8IFBDTSBzdGFuZGFyZCwgbG9uZyBmcmFtZSBzeW5jaHJvbml6YXRpb24gICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyU19MTF9FQ19NT0RFIE9wZXJhdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX01PREVfU0xBVkVfVFggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSBUeCBjb25maWd1cmF0aW9uICAqLworI2RlZmluZSBMTF9JMlNfTU9ERV9TTEFWRV9SWCAgICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNDRkdfMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIFJ4IGNvbmZpZ3VyYXRpb24gICovCisjZGVmaW5lIExMX0kyU19NT0RFX01BU1RFUl9UWCAgICAgICAgICAgICAgKFNQSV9JMlNDRkdSX0kyU0NGR18xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIFR4IGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTExfSTJTX01PREVfTUFTVEVSX1JYICAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfSTJTQ0ZHXzAgfCBTUElfSTJTQ0ZHUl9JMlNDRkdfMSkgLyohPCBNYXN0ZXIgUnggY29uZmlndXJhdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfUFJFU0NBTEVSX0ZBQ1RPUiBQcmVzY2FsZXIgRmFjdG9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfRVZFTiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgT2RkIGZhY3RvcjogUmVhbCBkaXZpZGVyIHZhbHVlIGlzID0gIEkyU0RJViAqIDIgICAgKi8KKyNkZWZpbmUgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0REICAgICAgICAoU1BJX0kyU1BSX09ERCA+PiA4VSkgICAgIC8qITwgT2RkIGZhY3RvcjogUmVhbCBkaXZpZGVyIHZhbHVlIGlzID0gKEkyU0RJViAqIDIpKzEgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBJMlNfTExfRUNfTUNMS19PVVRQVVQgTUNMSyBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMlNfTUNMS19PVVRQVVRfRElTQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgY2xvY2sgb3V0cHV0IGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0kyU19NQ0xLX09VVFBVVF9FTkFCTEUgICAgICAgICAgKFNQSV9JMlNQUl9NQ0tPRSkgICAgICAgICAvKiE8IE1hc3RlciBjbG9jayBvdXRwdXQgaXMgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VDX0FVRElPX0ZSRVEgQXVkaW8gRnJlcXVlbmN5CisgICogQHsKKyAgKi8KKworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzE5MksgICAgICAgICAgICAgIDE5MjAwMFUgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAxOTIwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV85NksgICAgICAgICAgICAgICA5NjAwMFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDk2MDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfNDhLICAgICAgICAgICAgICAgNDgwMDBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICA0ODAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzQ0SyAgICAgICAgICAgICAgIDQ0MTAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgNDQxMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8zMksgICAgICAgICAgICAgICAzMjAwMFUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDMyMDAwIEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfMjJLICAgICAgICAgICAgICAgMjIwNTBVICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAyMjA1MCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRXzE2SyAgICAgICAgICAgICAgIDE2MDAwVSAgICAgICAgLyohPCBBdWRpbyBGcmVxdWVuY3kgY29uZmlndXJhdGlvbiAgMTYwMDAgSHogICAgICAgKi8KKyNkZWZpbmUgTExfSTJTX0FVRElPRlJFUV8xMUsgICAgICAgICAgICAgICAxMTAyNVUgICAgICAgIC8qITwgQXVkaW8gRnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gIDExMDI1IEh6ICAgICAgICovCisjZGVmaW5lIExMX0kyU19BVURJT0ZSRVFfOEsgICAgICAgICAgICAgICAgODAwMFUgICAgICAgICAvKiE8IEF1ZGlvIEZyZXF1ZW5jeSBjb25maWd1cmF0aW9uICAgODAwMCBIeiAgICAgICAqLworI2RlZmluZSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQgICAgICAgICAgIDJVICAgICAgICAgICAgLyohPCBBdWRpbyBGcmVxIG5vdCBzcGVjaWZpZWQuIFJlZ2lzdGVyIEkyU0RJViA9IDIgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyU19MTF9FeHBvcnRlZF9NYWNyb3MgSTJTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gSTJTIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJTIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9JMlNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBJMlMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJMlMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfSTJTX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgSTJTIG1vZGUgYW5kIEVuYWJsZSBJMlMgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU01PRCAgICAgICAgTExfSTJTX0VuYWJsZVxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfRW5hYmxlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNNT0QgfCBTUElfSTJTQ0ZHUl9JMlNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTRSAgICAgICAgICBMTF9JMlNfRGlzYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EIHwgU1BJX0kyU0NGR1JfSTJTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSTJTIHBlcmlwaGVyYWwgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU0UgICAgICAgICAgTExfSTJTX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSA9PSAoU1BJX0kyU0NGR1JfSTJTRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfU2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8yNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfREFUQUZPUk1BVF8zMkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXREYXRhRm9ybWF0KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhRm9ybWF0KQoreworICBNT0RJRllfUkVHKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOLCBEYXRhRm9ybWF0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGRhdGEgZnJhbWUgbGVuZ3RoCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgREFUTEVOICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgQ0hMRU4gICAgICAgICBMTF9JMlNfR2V0RGF0YUZvcm1hdAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMTZCX0VYVEVOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMjRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX0RBVEFGT1JNQVRfMzJCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldERhdGFGb3JtYXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBjbG9jayBwb2xhcml0eQorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIENLUE9MICAgICAgICAgTExfSTJTX1NldENsb2NrUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNDRkdSLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGNsb2NrIHBvbGFyaXR5CisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgQ0tQT0wgICAgICAgICBMTF9JMlNfR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QT0xBUklUWV9ISUdICisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldENsb2NrUG9sYXJpdHkoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyBzdGFuZGFyZCBwcm90b2NvbAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEkyU1NURCAgICAgICAgTExfSTJTX1NldFN0YW5kYXJkXG4KKyAgKiAgICAgICAgIEkyU0NGR1IgICAgICBQQ01TWU5DICAgICAgIExMX0kyU19TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BISUxJUFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfTVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX0xTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QQ01fU0hPUlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX0xPTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRTdGFuZGFyZChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgU3RhbmRhcmQpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQywgU3RhbmRhcmQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJMlMgc3RhbmRhcmQgcHJvdG9jb2wKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNTVEQgICAgICAgIExMX0kyU19HZXRTdGFuZGFyZFxuCisgICogICAgICAgICBJMlNDRkdSICAgICAgUENNU1lOQyAgICAgICBMTF9JMlNfR2V0U3RhbmRhcmQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9QSElMSVBTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX01TQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19TVEFOREFSRF9MU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNTVEQgfCBTUElfSTJTQ0ZHUl9QQ01TWU5DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEkyUyB0cmFuc2ZlciBtb2RlCisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgSTJTQ0ZHICAgICAgICBMTF9JMlNfU2V0VHJhbnNmZXJNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19TZXRUcmFuc2Zlck1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTQ0ZHLCBNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIHRyYW5zZmVyIG1vZGUKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBJMlNDRkcgICAgICAgIExMX0kyU19HZXRUcmFuc2Zlck1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19NT0RFX1NMQVZFX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX01PREVfU0xBVkVfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfTU9ERV9NQVNURVJfUlgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfR2V0VHJhbnNmZXJNb2RlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNDRkcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyTGluZWFyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFByZXNjYWxlckxpbmVhcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX0kyU0RJViwgUHJlc2NhbGVyTGluZWFyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJTIGxpbmVhciBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBJMlNESVYgICAgICAgIExMX0kyU19HZXRQcmVzY2FsZXJMaW5lYXIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBQcmVzY2FsZXJMaW5lYXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAyIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlckxpbmVhcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9JMlNESVYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSTJTIHBhcml0eSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBPREQgICAgICAgICAgIExMX0kyU19TZXRQcmVzY2FsZXJQYXJpdHkKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfU2V0UHJlc2NhbGVyUGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQsIFByZXNjYWxlclBhcml0eSA8PCA4VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEkyUyBwYXJpdHkgcHJlc2NhbGVyCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgT0REICAgICAgICAgICBMTF9JMlNfR2V0UHJlc2NhbGVyUGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJTX1BSRVNDQUxFUl9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0dldFByZXNjYWxlclBhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+STJTUFIsIFNQSV9JMlNQUl9PREQpID4+IDhVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIG1hc3RlciBjbG9jayBvdXB1dCAoUGluIE1DSykKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX01DS09FKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spCisgICogQHJtdG9sbCBJMlNQUiAgICAgICAgTUNLT0UgICAgICAgICBMTF9JMlNfRGlzYWJsZU1hc3RlckNsb2NrCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVNYXN0ZXJDbG9jayhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBtYXN0ZXIgY2xvY2sgb3VwdXQgKFBpbiBNQ0spIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIEkyU1BSICAgICAgICBNQ0tPRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRNYXN0ZXJDbG9jaworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkTWFzdGVyQ2xvY2soU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU1BSLCBTUElfSTJTUFJfTUNLT0UpID09IChTUElfSTJTUFJfTUNLT0UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFNQSV9JMlNDRkdSX0FTVFJURU4pCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhc3luY2hyb25vdXMgc3RhcnQKKyAgKiBAcm10b2xsIEkyU0NGR1IgICAgICBBU1RSVEVOICAgICAgIExMX0kyU19FbmFibGVBc3luY1N0YXJ0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfQVNUUlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgYXN5bmNocm9ub3VzIHN0YXJ0CisgICogQHJtdG9sbCBJMlNDRkdSICAgICAgQVNUUlRFTiAgICAgICBMTF9JMlNfRGlzYWJsZUFzeW5jU3RhcnQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRGlzYWJsZUFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9BU1RSVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhc3luY2hyb25vdXMgc3RhcnQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgSTJTQ0ZHUiAgICAgIEFTVFJURU4gICAgICAgTExfSTJTX0lzRW5hYmxlZEFzeW5jU3RhcnQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZEFzeW5jU3RhcnQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0FTVFJURU4pID09IChTUElfSTJTQ0ZHUl9BU1RSVEVOKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNQSV9JMlNDRkdSX0FTVFJURU4gKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfRkxBRyBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBpcyBub3QgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBSWE5FICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1JYTkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGlzIGVtcHR5CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVFhFICAgICAgICAgICBMTF9JMlNfSXNBY3RpdmVGbGFnX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNBY3RpdmVGbGFnX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBidXN5IGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCU1kgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfQlNZCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfQlNZKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19CU1koU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG92ZXJydW4gZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIE9WUiAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19PVlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNBY3RpdmVGbGFnX09WUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdW5kZXJydW4gZXJyb3IgZmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIFVEUiAgICAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19VRFIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19VRFIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfVURSKSA9PSAoU1BJX1NSX1VEUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZnJhbWUgZm9ybWF0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0FjdGl2ZUZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzQWN0aXZlRmxhZ19GUkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNoYW5uZWwgc2lkZSBmbGFnLgorICAqIEBub3RlICAgMDogQ2hhbm5lbCBMZWZ0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICAxOiBDaGFubmVsIFJpZ2h0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvciBoYXMgYmVlbiByZWNlaXZlZFxuCisgICogICAgICAgICBJdCBoYXMgbm8gc2lnbmlmaWNhbmNlIGluIFBDTSBtb2RlLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENIU0lERSAgICAgICAgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzQWN0aXZlRmxhZ19DSFNJREUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfQ0hTSURFKSA9PSAoU1BJX1NSX0NIU0lERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBvdmVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX0kyU19DbGVhckZsYWdfT1ZSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0NsZWFyRmxhZ19PVlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHVuZGVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBVRFIgICAgICAgICAgIExMX0kyU19DbGVhckZsYWdfVURSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0NsZWFyRmxhZ19VRFIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9JMlNfQ2xlYXJGbGFnX0ZSRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19DbGVhckZsYWdfRlJFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfQ2xlYXJGbGFnX0ZSRShTUEl4KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfSVQgSW50ZXJydXB0IE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBlcnJvciBJVAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoT1ZSLCBVRFIgYW5kIEZSRSBpbiBJMlMgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRW5hYmxlSVRfRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0VuYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0VuYWJsZUlUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUnggYnVmZmVyIG5vdCBlbXB0eSBJVAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfSTJTX0VuYWJsZUlUX1JYTkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0VuYWJsZUlUX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFR4IGJ1ZmZlciBlbXB0eSBJVAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfSTJTX0VuYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVJVF9UWEUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVJVF9UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBlcnJvciBJVAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoT1ZSLCBVRFIgYW5kIEZSRSBpbiBJMlMgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZUlUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgSVQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19EaXNhYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfUlhORShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHggYnVmZmVyIGVtcHR5IElUCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9JMlNfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZUlUX1RYRShTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFUlIgSVQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJTX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX0VSUihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSWE5FIElUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZElUX1JYTkUoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVFhFIElUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWEVJRSAgICAgICAgIExMX0kyU19Jc0VuYWJsZWRJVF9UWEUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJTX0lzRW5hYmxlZElUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuIExMX1NQSV9Jc0VuYWJsZWRJVF9UWEUoU1BJeCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0RNQSBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJTX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJeCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgUngKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyU19EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJTX0Rpc2FibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyU19Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyU19FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFR4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMlNfRGlzYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyU19EaXNhYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBMTF9TUElfRGlzYWJsZURNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfSTJTX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMlNfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWChTUEl4KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfTExfRUZfREFUQSBEQVRBIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgMTYtQml0cyBpbiBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9JMlNfUmVjZWl2ZURhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfSTJTX1JlY2VpdmVEYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfUmVjZWl2ZURhdGExNihTUEl4KTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSAxNi1CaXRzIGluIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0kyU19UcmFuc21pdERhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMlNfVHJhbnNtaXREYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQxNl90IFR4RGF0YSkKK3sKKyAgTExfU1BJX1RyYW5zbWl0RGF0YTE2KFNQSXgsIFR4RGF0YSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0kyU19EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpOworRXJyb3JTdGF0dXMgTExfSTJTX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfSTJTX1N0cnVjdEluaXQoTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9JMlNfQ29uZmlnUHJlc2NhbGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQcmVzY2FsZXJMaW5lYXIsIHVpbnQzMl90IFByZXNjYWxlclBhcml0eSk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChTUEkxKSB8fCBkZWZpbmVkIChTUEkyKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX1NQSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX3N5c3RlbS5oIGIvSW5jL3N0bTMyZzB4eF9sbF9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkyMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF9zeXN0ZW0uaApAQCAtMCwwICsxLDE4NDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfc3lzdGVtLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNZU1RFTSBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBTWVNURU0gZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBTb21lIG9mIHRoZSBGTEFTSCBmZWF0dXJlcyBuZWVkIHRvIGJlIGhhbmRsZWQgaW4gdGhlIFNZU1RFTSBmaWxlLgorICAgICAgKCspIEFjY2VzcyB0byBEQkcgcmVnaXN0ZXJzCisgICAgICAoKykgQWNjZXNzIHRvIFNZU0NGRyByZWdpc3RlcnMKKyAgICAgICgrKSBBY2Nlc3MgdG8gVlJFRkJVRiByZWdpc3RlcnMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9TWVNURU1fSAorI2RlZmluZSBTVE0zMkcweHhfTExfU1lTVEVNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChGTEFTSCkgfHwgZGVmaW5lZCAoU1lTQ0ZHKSB8fCBkZWZpbmVkIChEQkcpCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMIFNZU1RFTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTWVNURU1fTExfUHJpdmF0ZV9Db25zdGFudHMgU1lTVEVNIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9Db25zdGFudHMgU1lTVEVNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1JFTUFQIFNZU0NGRyBSRU1BUAorKiBAeworKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNIICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLworI2RlZmluZSBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0ggICAgICAgICBTWVNDRkdfQ0ZHUjFfTUVNX01PREVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1NSQU0gICAgICAgICAgICAgICAgKFNZU0NGR19DRkdSMV9NRU1fTU9ERV8xIHwgU1lTQ0ZHX0NGR1IxX01FTV9NT0RFXzApICAgLyohPCBFbWJlZGRlZCBTUkFNIG1hcHBlZCBhdCAweDAwMDAwMDAwICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19QSU5fUk1QIFNZU0NGRyBQSU4gUk1QCisqIEB7CisqLworI2RlZmluZSBMTF9TWVNDRkdfUElOX1JNUF9QQTExICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfUEExMV9STVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBBMTEgcGFkIGJlaGF2ZXMgYXMgUEE5IHBpbiAqLworI2RlZmluZSBMTF9TWVNDRkdfUElOX1JNUF9QQTEyICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjFfUEExMl9STVAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBBMTIgcGFkIGJlaGF2ZXMgYXMgUEExMCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisKKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0lSX01PRCkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0lSX01PRCBTWVNDRkcgSVIgTW9kdWxhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19JUl9NT0RfVElNMTYgICAgICAgKFNZU0NGR19DRkdSMV9JUl9NT0RfMCAmIFNZU0NGR19DRkdSMV9JUl9NT0RfMSkgICAgLyohPCAwMDogVGltZXIxNiBpcyBzZWxlY3RlZCBhcyBJUkRBIE1vZHVsYXRpb24gZW52ZWxvcHBlIHNvdXJjZSAqLworI2RlZmluZSBMTF9TWVNDRkdfSVJfTU9EX1VTQVJUMSAgICAgIChTWVNDRkdfQ0ZHUjFfSVJfTU9EXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMDE6IFVTQVJUMSBpcyBzZWxlY3RlZCBhcyBJUkRBIE1vZHVsYXRpb24gZW52ZWxvcHBlIHNvdXJjZSAqLworI2lmIGRlZmluZWQoVVNBUlQ0KQorI2RlZmluZSBMTF9TWVNDRkdfSVJfTU9EX1VTQVJUNCAgICAgIChTWVNDRkdfQ0ZHUjFfSVJfTU9EXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMTA6IFVTQVJUNCBpcyBzZWxlY3RlZCBhcyBJUkRBIE1vZHVsYXRpb24gZW52ZWxvcHBlIHNvdXJjZSAqLworI2Vsc2UgIAorI2RlZmluZSBMTF9TWVNDRkdfSVJfTU9EX1VTQVJUMiAgICAgIChTWVNDRkdfQ0ZHUjFfSVJfTU9EXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgMTA6IFVTQVJUMiBpcyBzZWxlY3RlZCBhcyBJUkRBIE1vZHVsYXRpb24gZW52ZWxvcHBlIHNvdXJjZSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfSVJfUE9MIFNZU0NGRyBJUiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19JUl9QT0xfTk9UX0lOVkVSVEVEICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDA6IE91dHB1dCBvZiBJUkRBIChJUk91dCkgbm90IGludmVydGVkICovCisjZGVmaW5lIExMX1NZU0NGR19JUl9QT0xfSU5WRVJURUQgICAgIChTWVNDRkdfQ0ZHUjFfSVJfUE9MKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDE6IE91dHB1dCBvZiBJUkRBIChJUk91dCkgaW52ZXJ0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0JPT1NURU4pCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19CT09TVEVOIFNZU0NGRyBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgZW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NGR1IxX0JPT1NURU4gICAgICAgU1lTQ0ZHX0NGR1IxX0JPT1NURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyIGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzB4eCkKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1VDUERfREJBVFRESVMgU1lTQ0ZHIFVDUEQgRGVhZCBCYXR0ZXJ5IGZlYXR1cmUgRGlzYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19VQ1BEMV9TVFJPQkUgICAgICAgU1lTQ0ZHX0NGR1IxX1VDUEQxX1NUUk9CRSAgICAgICAvKiE8IFVDUEQxIFNUUk9CRSBzdyBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExMX1NZU0NGR19VQ1BEMl9TVFJPQkUgICAgICAgU1lTQ0ZHX0NGR1IxX1VDUEQxX1NUUk9CRSAgICAgICAvKiE8IFVDUEQyIFNUUk9CRSBzdyBjb25maWd1cmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0kyQ19GQVNUTU9ERVBMVVMgU1lTQ0ZHIEkyQyBGQVNUTU9ERVBMVVMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI2X0ZNUCAgLyohPCBJMkMgUEI2IEZhc3QgbW9kZSBwbHVzICovCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BCNyAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjdfRk1QICAvKiE8IEkyQyBQQjcgRmFzdCBtb2RlIHBsdXMgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEI4ICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOF9GTVAgIC8qITwgSTJDIFBCOCBGYXN0IG1vZGUgcGx1cyAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI5X0ZNUCAgLyohPCBJMkMgUEI5IEZhc3QgbW9kZSBwbHVzICovCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSTJDMV9GTVApCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzEgICAgU1lTQ0ZHX0NGR1IxX0kyQzFfRk1QIC8qITwgRW5hYmxlIEkyQzEgRmFzdCBtb2RlIFBsdXMgICovCisjZW5kaWYgLypTWVNDRkdfQ0ZHUjFfSTJDMV9GTVAqLworI2lmIGRlZmluZWQoU1lTQ0ZHX0NGR1IxX0kyQzJfRk1QKQorI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMyICAgIFNZU0NGR19DRkdSMV9JMkMyX0ZNUCAvKiE8IEVuYWJsZSBJMkMyIEZhc3QgbW9kZSBwbHVzICAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IxX0kyQzJfRk1QKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9JMkNfUEE5X0ZNUCkKKyNkZWZpbmUgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEE5ICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BBOV9GTVAgLyohPCBFbmFibGUgRmFzdCBNb2RlIFBsdXMgb24gUEE5ICAqLworI2VuZGlmIC8qU1lTQ0ZHX0NGR1IxX0kyQ19QQTlfRk1QKi8KKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMV9JMkNfUEExMF9GTVApCisjZGVmaW5lIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BBMTAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQTEwX0ZNUCAvKiE8IEVuYWJsZSBGYXN0IE1vZGUgUGx1cyBvbiBQQTEwICovCisjZW5kaWYgLypTWVNDRkdfQ0ZHUjFfSTJDX1BBMTBfRk1QKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX1RJTUJSRUFLIFNZU0NGRyBUSU1FUiBCUkVBSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19FQ0MgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0VDQ0wgICAgICAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBFQ0MgZXJyb3Igc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvMTUvMTYvMTcgKi8KKyNpZiBkZWZpbmVkIChQV1JfUFZEX1NVUFBPUlQpCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19QVkQgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BWREwgICAgICAgICAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFBWRCBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggVElNMS8xNS8xNi8xNyBCcmVhayBJbnB1dCBhbmQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUFZERSBhbmQgUExTIGJpdHMgb2YgdGhlIFBvd2VyIENvbnRyb2wgSW50ZXJmYWNlICovCisjZW5kaWYKKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZICAgICBTWVNDRkdfQ0ZHUjJfU1BMICAgICAgICAgICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTV9QQVJJVFkgZXJyb3Igc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS8xNS8xNi8xNyAqLworI2RlZmluZSBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQICAgICAgICAgIFNZU0NGR19DRkdSMl9DTEwgICAgICAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgKEhhcmRmYXVsdCkgb3V0cHV0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3J0ZXhNMCB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvMTUvMTYvMTcgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfQ0xBTVBJTkdfRElPREUgU1lTQ0ZHIENMQU1QSU5HIERJT0RFCisgICogQHsKKyAgKi8gIAorI2RlZmluZSBMTF9TWVNDRkdfQ0ZHUjJfUEExX0NERU4gICAgICAgICBTWVNDRkdfQ0ZHUjJfUEExX0NERU4gICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBkaW9kZSBvZiBQQTEgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NGR1IyX1BBM19DREVOICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BBM19DREVOICAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgZGlvZGUgb2YgUEEzICovCisjZGVmaW5lIExMX1NZU0NGR19DRkdSMl9QQTVfQ0RFTiAgICAgICAgIFNZU0NGR19DRkdSMl9QQTVfQ0RFTiAgICAgLyohPCBFbmFibGVzIENsYW1waW5nIGRpb2RlIG9mIFBBNSAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0ZHUjJfUEE2X0NERU4gICAgICAgICBTWVNDRkdfQ0ZHUjJfUEE2X0NERU4gICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBkaW9kZSBvZiBQQTYgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NGR1IyX1BBMTNfQ0RFTiAgICAgICAgU1lTQ0ZHX0NGR1IyX1BBMTNfQ0RFTiAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgZGlvZGUgb2YgUEExMyAqLworI2RlZmluZSBMTF9TWVNDRkdfQ0ZHUjJfUEIwX0NERU4gICAgICAgICBTWVNDRkdfQ0ZHUjJfUEIwX0NERU4gICAgIC8qITwgRW5hYmxlcyBDbGFtcGluZyBkaW9kZSBvZiBQQjAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0NGR1IyX1BCMV9DREVOICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BCMV9DREVOICAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgZGlvZGUgb2YgUEIxICovICAKKyNkZWZpbmUgTExfU1lTQ0ZHX0NGR1IyX1BCMl9DREVOICAgICAgICAgU1lTQ0ZHX0NGR1IyX1BCMl9DREVOICAgICAvKiE8IEVuYWJsZXMgQ2xhbXBpbmcgZGlvZGUgb2YgUEIyICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0FQQjFfR1JQMV9TVE9QX0lQICBEQkdNQ1UgQVBCMSBHUlAxIFNUT1AgSVAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTJfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1AgICAgICBEQkdfQVBCX0ZaMV9EQkdfVElNMl9TVE9QICAgICAgICAvKiE8IFRJTTIgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR19BUEJfRloxX0RCR19USU0yX1NUT1AqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUCAgICAgIERCR19BUEJfRloxX0RCR19USU0zX1NUT1AgICAgICAgIC8qITwgVElNMyBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTZfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1AgICAgICBEQkdfQVBCX0ZaMV9EQkdfVElNNl9TVE9QICAgICAgICAvKiE8IFRJTTYgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKkRCR19BUEJfRloxX0RCR19USU02X1NUT1AqLworI2lmIGRlZmluZWQoREJHX0FQQl9GWjFfREJHX1RJTTdfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9USU03X1NUT1AgICAgICBEQkdfQVBCX0ZaMV9EQkdfVElNN19TVE9QICAgICAgICAvKiE8IFRJTTcgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgICovCisjZW5kaWYgLypEQkdfQVBCX0ZaMV9EQkdfVElNN19TVE9QKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9SVENfU1RPUCAgICAgICBEQkdfQVBCX0ZaMV9EQkdfUlRDX1NUT1AgICAgICAgICAvKiE8IFJUQyBDYWxlbmRhciBmcm96ZW4gd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUCAgICAgIERCR19BUEJfRloxX0RCR19XV0RHX1NUT1AgICAgICAgIC8qITwgRGVidWcgV2luZG93IFdhdGNoZG9nIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUCAgICAgIERCR19BUEJfRloxX0RCR19JV0RHX1NUT1AgICAgICAgIC8qITwgRGVidWcgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QICAgICAgREJHX0FQQl9GWjFfREJHX0kyQzFfU01CVVNfVElNRU9VVF9TVE9QIC8qITwgSTJDMSBTTUJVUyB0aW1lb3V0IG1vZGUgc3RvcHBlZCB3aGVuIENvcmUgaXMgaGFsdGVkICovCisjaWYgZGVmaW5lZChEQkdfQVBCX0ZaMV9EQkdfTFBUSU0yX1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0yX1NUT1AgICAgREJHX0FQQl9GWjFfREJHX0xQVElNMl9TVE9QICAgICAgLyohPCBMUFRJTTIgY291bnRlciBzdG9wcGVkIHdoZW4gQ29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKiBEQkdfQVBCX0ZaMV9EQkdfTFBUSU0yX1NUT1AgKi8KKyNpZiBkZWZpbmVkKERCR19BUEJfRloxX0RCR19MUFRJTTFfU1RPUCkKKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUCAgICBEQkdfQVBCX0ZaMV9EQkdfTFBUSU0xX1NUT1AgICAgICAvKiE8IExQVElNMSBjb3VudGVyIHN0b3BwZWQgd2hlbiBDb3JlIGlzIGhhbHRlZCAqLworI2VuZGlmIC8qIERCR19BUEJfRloxX0RCR19MUFRJTTFfU1RPUCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfQVBCMl9HUlAxX1NUT1BfSVAgREJHTUNVIEFQQjIgR1JQMSBTVE9QIElQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xX1NUT1AgICAgICBEQkdfQVBCX0ZaMl9EQkdfVElNMV9TVE9QICAgICAgICAvKiE8IFRJTTEgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNpZiBkZWZpbmVkKERCR19BUEJfRloyX0RCR19USU0xNF9TVE9QKQorI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE0X1NUT1AgICAgIERCR19BUEJfRloyX0RCR19USU0xNF9TVE9QICAgICAgIC8qITwgVElNMTQgY291bnRlciBzdG9wcGVkIHdoZW4gY29yZSBpcyBoYWx0ZWQgKi8KKyNlbmRpZiAvKiBEQkdfQVBCX0ZaMl9EQkdfVElNMTRfU1RPUCAqLworI2lmIGRlZmluZWQoREJHX0FQQl9GWjJfREJHX1RJTTE1X1NUT1ApCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUCAgICAgREJHX0FQQl9GWjJfREJHX1RJTTE1X1NUT1AgICAgICAgLyohPCBUSU0xNSBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAgKi8KKyNlbmRpZiAvKkRCR19BUEJfRloyX0RCR19USU0xNV9TVE9QKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QICAgICBEQkdfQVBCX0ZaMl9EQkdfVElNMTZfU1RPUCAgICAgICAvKiE8IFRJTTE2IGNvdW50ZXIgc3RvcHBlZCB3aGVuIGNvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCAgICAgREJHX0FQQl9GWjJfREJHX1RJTTE3X1NUT1AgICAgICAgLyohPCBUSU0xNyBjb3VudGVyIHN0b3BwZWQgd2hlbiBjb3JlIGlzIGhhbHRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVk9MVEFHRSBWUkVGQlVGIFZPTFRBR0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAwIChWUkVGX09VVDEpICovCisjZGVmaW5lIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgICAgICAgICAgVlJFRkJVRl9DU1JfVlJTICAgICAgICAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDEgKFZSRUZfT1VUMikgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19MQVRFTkNZIEZMQVNIIExBVEVOQ1kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRkxBU0ggWmVybyBMYXRlbmN5IGN5Y2xlICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMSAgICAgICAgICAgICAgICAgRkxBU0hfQUNSX0xBVEVOQ1lfMCAgICAgLyohPCBGTEFTSCBPbmUgTGF0ZW5jeSBjeWNsZSAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzIgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzEgICAgIC8qITwgRkxBU0ggVHdvIHdhaXQgc3RhdGVzICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMyAgICAgICAgICAgICAgICAgKEZMQVNIX0FDUl9MQVRFTkNZXzEgfCBGTEFTSF9BQ1JfTEFURU5DWV8wKSAgICAgLyohPCBGTEFTSCBUaHJlZSB3YWl0IHN0YXRlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBTWVNURU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfU1lTQ0ZHIFNZU0NGRworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IG1lbW9yeSBtYXBwaW5nIGF0IGFkZHJlc3MgMHgwMDAwMDAwMAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIE1FTV9NT0RFICAgICAgTExfU1lTQ0ZHX1NldFJlbWFwTWVtb3J5CisgICogQHBhcmFtICBNZW1vcnkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1JBTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldFJlbWFwTWVtb3J5KHVpbnQzMl90IE1lbW9yeSkKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfTUVNX01PREUsIE1lbW9yeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG1lbW9yeSBtYXBwaW5nIGF0IGFkZHJlc3MgMHgwMDAwMDAwMAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIE1FTV9NT0RFICAgICAgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9NRU1fTU9ERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByZW1hcCBvZiBhIHBpbiBvbiBkaWZmZXJlbnQgcGFkCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgUEExMV9STVAgIExMX1NZU0NGR19FbmFibGVQaW5SZW1hcFxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgUEExMl9STVAgICBMTF9TWVNDRkdfRW5hYmxlUGluUmVtYXBcbgorICAqIEBwYXJhbSAgUGluUmVtYXAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1BJTl9STVBfUEExMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19QSU5fUk1QX1BBMTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVQaW5SZW1hcCh1aW50MzJfdCBQaW5SZW1hcCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBQaW5SZW1hcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJlbWFwIG9mIGEgcGluIG9uIGRpZmZlcmVudCBwYWQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBQQTExX1JNUCAgTExfU1lTQ0ZHX0Rpc2FibGVQaW5SZW1hcFxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgUEExMl9STVAgICBMTF9TWVNDRkdfRGlzYWJsZVBpblJlbWFwXG4KKyAgKiBAcGFyYW0gIFBpblJlbWFwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19QSU5fUk1QX1BBMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUElOX1JNUF9QQTEyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZVBpblJlbWFwKHVpbnQzMl90IFBpblJlbWFwKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgUGluUmVtYXApOworfQorCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfSVJfTU9EKQorLyoqCisgICogQGJyaWVmICBTZXQgSVIgTW9kdWxhdGlvbiBFbnZlbG9wZSBzaWduYWwgc291cmNlLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIElSX01PRCAgTExfU1lTQ0ZHX1NldElSTW9kRW52ZWxvcGVTaWduYWwKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JUl9NT0RfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSVJfTU9EX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JUl9NT0RfVVNBUlQ0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0SVJNb2RFbnZlbG9wZVNpZ25hbCh1aW50MzJfdCBTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0lSX01PRCwgU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSVIgTW9kdWxhdGlvbiBFbnZlbG9wZSBzaWduYWwgc291cmNlLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIElSX01PRCAgTExfU1lTQ0ZHX0dldElSTW9kRW52ZWxvcGVTaWduYWwKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0lSX01PRF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JUl9NT0RfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0lSX01PRF9VU0FSVDQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0SVJNb2RFbnZlbG9wZVNpZ25hbCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfSVJfTU9EKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IElSIE91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBJUl9QT0wgIExMX1NZU0NGR19TZXRJUlBvbGFyaXR5CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JUl9QT0xfSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSVJfUE9MX05PVF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldElSUG9sYXJpdHkodWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0lSX1BPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJUiBPdXRwdXQgcG9sYXJpdHkuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgSVJfUE9MICBMTF9TWVNDRkdfR2V0SVJQb2xhcml0eQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSVJfUE9MX0lOVkVSVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0lSX1BPTF9OT1RfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR2V0SVJQb2xhcml0eSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfSVJfUE9MKSk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0NGR1IxX0lSX01PRCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjFfQk9PU1RFTikKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlci4KKyAgKiBAbm90ZSAgIFdoZW4gdm9sdGFnZSBib29zdGVyIGlzIGVuYWJsZWQsIEkvTyBhbmFsb2cgc3dpdGNoZXMgYXJlIHN1cHBsaWVkCisgICogICAgICAgICBieSBhIGRlZGljYXRlZCB2b2x0YWdlIGJvb3N0ZXIsIGZyb20gVkREIHBvd2VyIGRvbWFpbi4gVGhpcyBpcworICAqICAgICAgICAgdGhlIHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCBsb3cgVkREQSB2b2x0YWdlIG9wZXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgaXMgcmVsZXZhbnQgZm9yIHBlcmlwaGVyYWxzCisgICogICAgICAgICB1c2luZyBJL08gaW4gYW5hbG9nIGlucHV0OiBBREMsIENPTVAuCisgICogICAgICAgICBIb3dldmVyLCBDT01QIGFuZCBPUEFNUCBpbnB1dHMgaGF2ZSBhIGhpZ2ggaW1wZWRhbmNlIGFuZAorICAqICAgICAgICAgdm9sdGFnZSBib29zdGVyIGRvIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHZvbHRhZ2UgYm9vc3RlciBpcyBtYWlubHkgaW50ZW5kZWQgZm9yCisgICogICAgICAgICB1c2FnZSB3aXRoIEFEQy4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBCT09TVEVOICAgICAgIExMX1NZU0NGR19FbmFibGVBbmFsb2dCb29zdGVyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlQW5hbG9nQm9vc3Rlcih2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlci4KKyAgKiBAbm90ZSAgIFdoZW4gdm9sdGFnZSBib29zdGVyIGlzIGVuYWJsZWQsIEkvTyBhbmFsb2cgc3dpdGNoZXMgYXJlIHN1cHBsaWVkCisgICogICAgICAgICBieSBhIGRlZGljYXRlZCB2b2x0YWdlIGJvb3N0ZXIsIGZyb20gVkREIHBvd2VyIGRvbWFpbi4gVGhpcyBpcworICAqICAgICAgICAgdGhlIHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCBsb3cgVkREQSB2b2x0YWdlIG9wZXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgaXMgcmVsZXZhbnQgZm9yIHBlcmlwaGVyYWxzCisgICogICAgICAgICB1c2luZyBJL08gaW4gYW5hbG9nIGlucHV0OiBBREMsIENPTVAuCisgICogICAgICAgICBIb3dldmVyLCBDT01QIGFuZCBPUEFNUCBpbnB1dHMgaGF2ZSBhIGhpZ2ggaW1wZWRhbmNlIGFuZAorICAqICAgICAgICAgdm9sdGFnZSBib29zdGVyIGRvIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHZvbHRhZ2UgYm9vc3RlciBpcyBtYWlubHkgaW50ZW5kZWQgZm9yCisgICogICAgICAgICB1c2FnZSB3aXRoIEFEQy4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBCT09TVEVOICAgICAgIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nQm9vc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVBbmFsb2dCb29zdGVyKHZvaWQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfQk9PU1RFTik7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgSTJDX0ZNUF9QQjYgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkNfRk1QX1BCNyAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEI4ICAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX0ZNUF9QQjkgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkNfRk1QX0kyQzEgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfSTJDMiAgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgSTJDX0ZNUF9QQTkgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkNfRk1QX1BBMTAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXMKKyAgKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEE5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BBMTAgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5LgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEI2ICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEI3ICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEI4ICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEI5ICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfSTJDMSAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfSTJDMiAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEE5ICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ19GTVBfUEExMCAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXMKKyAgKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX0kyQzIgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfUEE5ICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19JMkNfRkFTVE1PREVQTFVTX1BBMTAgKCopCisgICoKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcweHgpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZGVhZCBiYXR0ZXJ5IGJlaGF2aW9yCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVUNQRDFfU1RST0JFICAgTExfU1lTQ0ZHX0Rpc2FibGVEQkFUVFxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgVUNQRDJfU1RST0JFICAgTExfU1lTQ0ZHX0Rpc2FibGVEQkFUVAorICAqIEBwYXJhbSAgQ29uZmlnRGVhZEJhdHRlcnkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1VDUEQxX1NUUk9CRVxuCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1VDUEQyX1NUUk9CRQorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZURCQVRUKHVpbnQzMl90IENvbmZpZ0RlYWRCYXR0ZXJ5KQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIENvbmZpZ0RlYWRCYXR0ZXJ5KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZGVhZCBiYXR0ZXJ5IGJlaGF2aW9yCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgVUNQRDFfU1RST0JFICAgTExfU1lTQ0ZHX0VuYWJsZURCQVRUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBVQ1BEMl9TVFJPQkUgICBMTF9TWVNDRkdfRW5hYmxlREJBVFQKKyAgKiBAcGFyYW0gIENvbmZpZ0RlYWRCYXR0ZXJ5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19VQ1BEMV9TVFJPQkVcbgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19VQ1BEMl9TVFJPQkUKKyAgKiAgICAgICAgICgqKSB2YWx1ZSBub3QgZGVmaW5lZCBpbiBhbGwgZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZURCQVRUKHVpbnQzMl90IENvbmZpZ0RlYWRCYXR0ZXJ5KQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRGVhZEJhdHRlcnkpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUwX1NSX0VXREcpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFdpbmRvdyB3YXRjaGRvZyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTAgU1JfRVdERyAgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1dXREcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1dXREcodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzBdLCBTWVNDRkdfSVRMSU5FMF9TUl9FV0RHKSA9PSAoU1lTQ0ZHX0lUTElORTBfU1JfRVdERykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMF9TUl9FV0RHICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxX1NSX1BWRE9VVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUFZEIHN1cHBseSBtb25pdG9yaW5nIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QgKEVYVEkgbGluZSAxNikuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMSBTUl9QVkRPVVQgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfUFZET1VUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19QVkRPVVQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzFdLCBTWVNDRkdfSVRMSU5FMV9TUl9QVkRPVVQpID09IChTWVNDRkdfSVRMSU5FMV9TUl9QVkRPVVQpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTFfU1JfUFZET1VUICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUyX1NSX1JUQ19XQUtFVVApCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJUQyBXYWtlIFVwIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QgKEVYVEkgbGluZSAxOSkuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMiBTUl9SVENfV0FLRVVQICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1JUQ19XQUtFVVAKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1JUQ19XQUtFVVAodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzJdLCBTWVNDRkdfSVRMSU5FMl9TUl9SVENfV0FLRVVQKSA9PSAoU1lTQ0ZHX0lUTElORTJfU1JfUlRDX1dBS0VVUCkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMl9TUl9SVENfV0FLRVVQICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUyX1NSX1RBTVBFUikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUlRDIFRhbXBlciBhbmQgVGltZVN0YW1wIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QgKEVYVEkgbGluZSAyMSkuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMiBTUl9UQU1QRVIgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVEFNUEVSCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19UQU1QRVIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzJdLCBTWVNDRkdfSVRMSU5FMl9TUl9UQU1QRVIpID09IChTWVNDRkdfSVRMSU5FMl9TUl9UQU1QRVIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTJfU1JfVEFNUEVSICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUzX1NSX0ZMQVNIX0lURikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxhc2ggaW50ZXJmYWNlIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMyBTUl9GTEFTSF9JVEYgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRkxBU0hfSVRGCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19GTEFTSF9JVEYodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzNdLCBTWVNDRkdfSVRMSU5FM19TUl9GTEFTSF9JVEYpID09IChTWVNDRkdfSVRMSU5FM19TUl9GTEFTSF9JVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTNfU1JfRkxBU0hfSVRGICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUzX1NSX0ZMQVNIX0VDQykKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxhc2ggaW50ZXJmYWNlIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMyBTUl9GTEFTSF9FQ0MgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRkxBU0hfRUNDCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19GTEFTSF9FQ0Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzNdLCBTWVNDRkdfSVRMSU5FM19TUl9GTEFTSF9FQ0MpID09IChTWVNDRkdfSVRMSU5FM19TUl9GTEFTSF9FQ0MpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTNfU1JfRkxBU0hfRUNDICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkU0X1NSX0NMS19DVFJMKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSZXNldCBhbmQgY2xvY2sgY29udHJvbCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTQgU1JfQ0xLX0NUUkwgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0NMS19DVFJMCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19DTEtfQ1RSTCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbNF0sIFNZU0NGR19JVExJTkU0X1NSX0NMS19DVFJMKSA9PSAoU1lTQ0ZHX0lUTElORTRfU1JfQ0xLX0NUUkwpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTRfU1JfQ0xLX0NUUkwgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTVfU1JfRVhUSTApCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAwIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FNSBTUl9FWFRJMCAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTAKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkwKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls1XSwgU1lTQ0ZHX0lUTElORTVfU1JfRVhUSTApID09IChTWVNDRkdfSVRMSU5FNV9TUl9FWFRJMCkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FNV9TUl9FWFRJMCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FNV9TUl9FWFRJMSkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRVhUSSBsaW5lIDEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU1IFNSX0VYVEkxICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzVdLCBTWVNDRkdfSVRMSU5FNV9TUl9FWFRJMSkgPT0gKFNZU0NGR19JVExJTkU1X1NSX0VYVEkxKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU1X1NSX0VYVEkxICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkU2X1NSX0VYVEkyKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFWFRJIGxpbmUgMiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTYgU1JfRVhUSTIgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkyCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJMih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbNl0sIFNZU0NGR19JVExJTkU2X1NSX0VYVEkyKSA9PSAoU1lTQ0ZHX0lUTElORTZfU1JfRVhUSTIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTZfU1JfRVhUSTIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTZfU1JfRVhUSTMpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAzIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FNiBTUl9FWFRJMyAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkzKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls2XSwgU1lTQ0ZHX0lUTElORTZfU1JfRVhUSTMpID09IChTWVNDRkdfSVRMSU5FNl9TUl9FWFRJMykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FNl9TUl9FWFRJMyAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJNCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRVhUSSBsaW5lIDQgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU3IFNSX0VYVEk0ICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJNAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzddLCBTWVNDRkdfSVRMSU5FN19TUl9FWFRJNCkgPT0gKFNZU0NGR19JVExJTkU3X1NSX0VYVEk0KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEk0ICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkU3X1NSX0VYVEk1KQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFWFRJIGxpbmUgNSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTUgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEk1CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJNSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbN10sIFNZU0NGR19JVExJTkU3X1NSX0VYVEk1KSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTUgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTYpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSA2IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FNyBTUl9FWFRJNiAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEk2KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTYpID09IChTWVNDRkdfSVRMSU5FN19TUl9FWFRJNikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FN19TUl9FWFRJNiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJNykKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRVhUSSBsaW5lIDcgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU3IFNSX0VYVEk3ICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTcodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzddLCBTWVNDRkdfSVRMSU5FN19TUl9FWFRJNykgPT0gKFNZU0NGR19JVExJTkU3X1NSX0VYVEk3KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEk3ICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkU3X1NSX0VYVEk4KQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFWFRJIGxpbmUgOCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTggICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEk4CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19FWFRJOCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbN10sIFNZU0NGR19JVExJTkU3X1NSX0VYVEk4KSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTgpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTggKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTkpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSA5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FNyBTUl9FWFRJOSAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEk5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTkpID09IChTWVNDRkdfSVRMSU5FN19TUl9FWFRJOSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FN19TUl9FWFRJOSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTApCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxMCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTEwICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxMAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTEwKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEwKSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEwKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTEpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxMSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTExICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTExKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTExKSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTExKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxMiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTEyICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTEyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEyKSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEyKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTMpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxMyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTEzICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTEzKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEzKSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTEzKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxMyAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxNCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTE0ICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxNAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTE0KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTE0KSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTE0KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxNCAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FN19TUl9FWFRJMTUpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVYVEkgbGluZSAxNSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTcgU1JfRVhUSTE1ICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0VYVEkxNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRVhUSTE1KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls3XSwgU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTE1KSA9PSAoU1lTQ0ZHX0lUTElORTdfU1JfRVhUSTE1KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU3X1NSX0VYVEkxNSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMSkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVUNQRDEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU4IFNSX1VDUEQxICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVUNQRDEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1VDUEQxKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls4XSwgU1lTQ0ZHX0lUTElORThfU1JfVUNQRDEpID09IChTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVUNQRDIgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU4IFNSX1VDUEQyICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVUNQRDIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1VDUEQyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUls4XSwgU1lTQ0ZHX0lUTElORThfU1JfVUNQRDIpID09IChTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FOF9TUl9VQ1BEMiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FOV9TUl9ETUExX0NIMSkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BMSBjaGFubmVsIDEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkU5IFNSX0RNQTFfQ0gxICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUExX0NIMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRE1BMV9DSDEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzldLCBTWVNDRkdfSVRMSU5FOV9TUl9ETUExX0NIMSkgPT0gKFNZU0NGR19JVExJTkU5X1NSX0RNQTFfQ0gxKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkU5X1NSX0RNQTFfQ0gxICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxMF9TUl9ETUExX0NIMikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BMSBjaGFubmVsIDIgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMCBTUl9ETUExX0NIMiAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRE1BMV9DSDIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RNQTFfQ0gyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxMF0sIFNZU0NGR19JVExJTkUxMF9TUl9ETUExX0NIMikgPT0gKFNZU0NGR19JVExJTkUxMF9TUl9ETUExX0NIMikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTBfU1JfRE1BMV9DSDIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEwX1NSX0RNQTFfQ0gzKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUExIGNoYW5uZWwgMyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTEwIFNSX0RNQTFfQ0gzICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUExX0NIMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRE1BMV9DSDModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzEwXSwgU1lTQ0ZHX0lUTElORTEwX1NSX0RNQTFfQ0gzKSA9PSAoU1lTQ0ZHX0lUTElORTEwX1NSX0RNQTFfQ0gzKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxMF9TUl9ETUExX0NIMyAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQTEgY2hhbm5lbCA0IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTEgU1JfRE1BMV9DSDQgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RNQTFfQ0g0CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUExX0NINCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTFdLCBTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDQpID09IChTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDQpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g0ICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINSkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BMSBjaGFubmVsIDUgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMSBTUl9ETUExX0NINSAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRE1BMV9DSDUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RNQTFfQ0g1KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxMV0sIFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINSkgPT0gKFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDUgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g2KQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUExIGNoYW5uZWwgNiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTExIFNSX0RNQTFfQ0g2ICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUExX0NINgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfRE1BMV9DSDYodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzExXSwgU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g2KSA9PSAoU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g2KSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxMV9TUl9ETUExX0NINiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDcpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQTEgY2hhbm5lbCA3IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTEgU1JfRE1BMV9DSDcgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RNQTFfQ0g3CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUExX0NINyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTFdLCBTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDcpID09IChTWVNDRkdfSVRMSU5FMTFfU1JfRE1BMV9DSDcpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTExX1NSX0RNQTFfQ0g3ICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxMV9TUl9ETUFNVVgxKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUFNVVggaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMSBTUl9ETUFNVVgxICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19ETUFNVVgKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RNQU1VWCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTFdLCBTWVNDRkdfSVRMSU5FMTFfU1JfRE1BTVVYMSkgPT0gKFNZU0NGR19JVExJTkUxMV9TUl9ETUFNVVgxKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxMV9TUl9ETUFNVVggKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEyX1NSX0FEQykKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQURDIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTIgU1JfQURDICAgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0FEQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfQURDKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxMl0sIFNZU0NGR19JVExJTkUxMl9TUl9BREMpID09IChTWVNDRkdfSVRMSU5FMTJfU1JfQURDKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxMl9TUl9BREMgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEyX1NSX0NPTVAxKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDb21wYXJhdG9yIDEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdCAoRVhUSSBsaW5lIDIxKS4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMiBTUl9DT01QMSAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfQ09NUDEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0NPTVAxKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxMl0sIFNZU0NGR19JVExJTkUxMl9TUl9DT01QMSkgPT0gKFNZU0NGR19JVExJTkUxMl9TUl9DT01QMSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTJfU1JfQ09NUDEgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEyX1NSX0NPTVAyKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDb21wYXJhdG9yIDIgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdCAoRVhUSSBsaW5lIDIyKS4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMiBTUl9DT01QMiAgICAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfQ09NUDIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0NPTVAyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxMl0sIFNZU0NGR19JVExJTkUxMl9TUl9DT01QMikgPT0gKFNZU0NGR19JVExJTkUxMl9TUl9DT01QMikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTJfU1JfQ09NUDIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQlJLKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxIGJyZWFrIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTMgU1JfVElNMV9CUksgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTFfQlJLCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xX0JSSyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTNdLCBTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9CUkspID09IChTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9CUkspKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQlJLICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxM19TUl9USU0xX1VQRCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVGltZXIgMSB1cGRhdGUgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMyBTUl9USU0xX1VQRCAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMV9VUEQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTFfVVBEKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxM10sIFNZU0NGR19JVExJTkUxM19TUl9USU0xX1VQRCkgPT0gKFNZU0NGR19JVExJTkUxM19TUl9USU0xX1VQRCkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9VUEQgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfVFJHKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxIHRyaWdnZXIgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxMyBTUl9USU0xX1RSRyAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMV9UUkcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTFfVFJHKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxM10sIFNZU0NGR19JVExJTkUxM19TUl9USU0xX1RSRykgPT0gKFNZU0NGR19JVExJTkUxM19TUl9USU0xX1RSRykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9UUkcgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQ0NVKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxIGNvbW11dGF0aW9uIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTMgU1JfVElNMV9DQ1UgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTFfQ0NVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xX0NDVSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTNdLCBTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9DQ1UpID09IChTWVNDRkdfSVRMSU5FMTNfU1JfVElNMV9DQ1UpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTEzX1NSX1RJTTFfQ0NVICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxNF9TUl9USU0xX0NDKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxIGNhcHR1cmUgY29tcGFyZSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTE0IFNSX1RJTTFfQ0MgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xX0NDCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xX0NDKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxNF0sIFNZU0NGR19JVExJTkUxNF9TUl9USU0xX0NDKSA9PSAoU1lTQ0ZHX0lUTElORTE0X1NSX1RJTTFfQ0MpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTE0X1NSX1RJTTFfQ0MgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTE1X1NSX1RJTTJfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAyIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTUgU1JfVElNMl9HTEIgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzE1XSwgU1lTQ0ZHX0lUTElORTE1X1NSX1RJTTJfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTE1X1NSX1RJTTJfR0xCKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxNV9TUl9USU0yX0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMTZfU1JfVElNM19HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRpbWVyIDMgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUxNiBTUl9USU0zX0dMQiAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTZdLCBTWVNDRkdfSVRMSU5FMTZfU1JfVElNM19HTEIpID09IChTWVNDRkdfSVRMSU5FMTZfU1JfVElNM19HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTE2X1NSX1RJTTNfR0xCICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxN19TUl9EQUMpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERBQyB1bmRlcnJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTE3IFNSX0RBQyAgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19EQUMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0RBQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMTddLCBTWVNDRkdfSVRMSU5FMTdfU1JfREFDKSA9PSAoU1lTQ0ZHX0lUTElORTE3X1NSX0RBQykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTdfU1JfREFDICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUxN19TUl9USU02X0dMQikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVGltZXIgNiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTE3IFNSX1RJTTZfR0xCICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU02CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU02KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxN10sIFNZU0NGR19JVExJTkUxN19TUl9USU02X0dMQikgPT0gKFNZU0NGR19JVExJTkUxN19TUl9USU02X0dMQikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMTdfU1JfVElNNl9HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTE3X1NSX0xQVElNMV9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExQVElNMSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTE3IFNSX0xQVElNMV9HTEIgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0xQVElNMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfTFBUSU0xKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsxN10sIFNZU0NGR19JVExJTkUxN19TUl9MUFRJTTFfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTE3X1NSX0xQVElNMV9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTE3X1NSX0xQVElNMV9HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTE4X1NSX1RJTTdfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciA3IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTggU1JfVElNN19HTEIgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1RJTTcodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzE4XSwgU1lTQ0ZHX0lUTElORTE4X1NSX1RJTTdfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTE4X1NSX1RJTTdfR0xCKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUxOF9TUl9USU03X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMThfU1JfTFBUSU0yX0dMQikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFBUSU0yIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMTggU1JfTFBUSU0yX0dMQiAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfTFBUSU0yCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19MUFRJTTIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzE4XSwgU1lTQ0ZHX0lUTElORTE4X1NSX0xQVElNMl9HTEIpID09IChTWVNDRkdfSVRMSU5FMThfU1JfTFBUSU0yX0dMQikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMThfU1JfTFBUSU0yX0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMTlfU1JfVElNMTRfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxNCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTE5IFNSX1RJTTE0X0dMQiAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xNAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMTQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzE5XSwgU1lTQ0ZHX0lUTElORTE5X1NSX1RJTTE0X0dMQikgPT0gKFNZU0NGR19JVExJTkUxOV9TUl9USU0xNF9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTE5X1NSX1RJTTE0X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjBfU1JfVElNMTVfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxNSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTIwIFNSX1RJTTE1X0dMQiAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMTUodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzIwXSwgU1lTQ0ZHX0lUTElORTIwX1NSX1RJTTE1X0dMQikgPT0gKFNZU0NGR19JVExJTkUyMF9TUl9USU0xNV9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTIwX1NSX1RJTTE1X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjFfU1JfVElNMTZfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxNiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTIxIFNSX1RJTTE2X0dMQiAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xNgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMTYodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzIxXSwgU1lTQ0ZHX0lUTElORTIxX1NSX1RJTTE2X0dMQikgPT0gKFNZU0NGR19JVExJTkUyMV9TUl9USU0xNl9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTIxX1NSX1RJTTE2X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjJfU1JfVElNMTdfR0xCKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUaW1lciAxNyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTIyIFNSX1RJTTE3X0dMQiAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19USU0xNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVElNMTcodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzIyXSwgU1lTQ0ZHX0lUTElORTIyX1NSX1RJTTE3X0dMQikgPT0gKFNZU0NGR19JVExJTkUyMl9TUl9USU0xN19HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTIyX1NSX1RJTTE3X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjNfU1JfSTJDMV9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEkyQzEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdCwgY29tYmluZWQgd2l0aCBFWFRJIGxpbmUgMjMuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMjMgU1JfSTJDMV9HTEIgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0kyQzEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0kyQzEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzIzXSwgU1lTQ0ZHX0lUTElORTIzX1NSX0kyQzFfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTIzX1NSX0kyQzFfR0xCKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUyM19TUl9JMkMxX0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjRfU1JfSTJDMl9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEkyQzIgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUyNCBTUl9JMkMyX0dMQiAgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfSTJDMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfSTJDMih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMjRdLCBTWVNDRkdfSVRMSU5FMjRfU1JfSTJDMl9HTEIpID09IChTWVNDRkdfSVRMSU5FMjRfU1JfSTJDMl9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTI0X1NSX0kyQzJfR0xCICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUyNV9TUl9TUEkxKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTUEkxIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QuCisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMjUgU1JfU1BJMSAgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1NQSTEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1NQSTEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzI1XSwgU1lTQ0ZHX0lUTElORTI1X1NSX1NQSTEpID09IChTWVNDRkdfSVRMSU5FMjVfU1JfU1BJMSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMjVfU1JfU1BJMSAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjZfU1JfU1BJMikKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1BJMiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTI2IFNSX1NQSTIgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUEkyCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUEkyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsyNl0sIFNZU0NGR19JVExJTkUyNl9TUl9TUEkyKSA9PSAoU1lTQ0ZHX0lUTElORTI2X1NSX1NQSTIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTI2X1NSX1NQSTIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTI3X1NSX1VTQVJUMV9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVTQVJUMSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LCBjb21iaW5lZCB3aXRoIEVYVEkgbGluZSAyNS4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUyNyBTUl9VU0FSVDFfR0xCICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1VTQVJUMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVVNBUlQxKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsyN10sIFNZU0NGR19JVExJTkUyN19TUl9VU0FSVDFfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTI3X1NSX1VTQVJUMV9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTI3X1NSX1VTQVJUMV9HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTI4X1NSX1VTQVJUMl9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVTQVJUMiBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LCBjb21iaW5lZCB3aXRoIEVYVEkgbGluZSAyNi4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUyOCBTUl9VU0FSVDJfR0xCICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1VTQVJUMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVVNBUlQyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsyOF0sIFNZU0NGR19JVExJTkUyOF9TUl9VU0FSVDJfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTI4X1NSX1VTQVJUMl9HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTI4X1NSX1VTQVJUMl9HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTI5X1NSX1VTQVJUM19HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVTQVJUMyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LCBjb21iaW5lZCB3aXRoIEVYVEkgbGluZSAyOC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUyOSBTUl9VU0FSVDNfR0xCICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1VTQVJUMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVVNBUlQzKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsyOV0sIFNZU0NGR19JVExJTkUyOV9TUl9VU0FSVDNfR0xCKSA9PSAoU1lTQ0ZHX0lUTElORTI5X1NSX1VTQVJUM19HTEIpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogU1lTQ0ZHX0lUTElORTI5X1NSX1VTQVJUM19HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTI5X1NSX1VTQVJUNF9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVTQVJUNCBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTI5IFNSX1VTQVJUNF9HTEIgIExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfVVNBUlQ0CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19VU0FSVDQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JVF9MSU5FX1NSWzI5XSwgU1lTQ0ZHX0lUTElORTI5X1NSX1VTQVJUNF9HTEIpID09IChTWVNDRkdfSVRMSU5FMjlfU1JfVVNBUlQ0X0dMQikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMjlfU1JfVVNBUlQ0X0dMQiAqLworCisjaWYgZGVmaW5lZChTWVNDRkdfSVRMSU5FMjlfU1JfTFBVQVJUMV9HTEIpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExQVUFSVDEgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcm10b2xsIFNZU0NGR19JVExJTkUyOSBTUl9MUFVBUlQxX0dMQiAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19MUFVBUlQxCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19MUFVBUlQxKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlsyOV0sIFNZU0NGR19JVExJTkUyOV9TUl9MUFVBUlQxX0dMQikgPT0gKFNZU0NGR19JVExJTkUyOV9TUl9MUFVBUlQxX0dMQikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMjlfU1JfTFBVQVJUMV9HTEIgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTMwX1NSX0NFQykKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ0VDIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QsIGNvbWJpbmVkIHdpdGggRVhUSSBsaW5lIDI3LgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTMwIFNSX0NFQyAgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19DRUMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0NFQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMzBdLCBTWVNDRkdfSVRMSU5FMzBfU1JfQ0VDKSA9PSAoU1lTQ0ZHX0lUTElORTMwX1NSX0NFQykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMzBfU1JfQ0VDICovCisKKyNpZiBkZWZpbmVkKFNZU0NGR19JVExJTkUzMV9TUl9BRVMpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFFUyBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBTWVNDRkdfSVRMSU5FMzEgU1JfQUVTICAgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX0FFUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfQUVTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SVRfTElORV9TUlszMV0sIFNZU0NGR19JVExJTkUzMV9TUl9BRVMpID09IChTWVNDRkdfSVRMSU5FMzFfU1JfQUVTKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFNZU0NGR19JVExJTkUzMV9TUl9BRVMgKi8KKworI2lmIGRlZmluZWQoU1lTQ0ZHX0lUTElORTMxX1NSX1JORykKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUk5HIGludGVycnVwdCBvY2N1cnJlZCBvciBub3QsIGNvbWJpbmVkIHdpdGggRVhUSSBsaW5lIDMxLgorICAqIEBybXRvbGwgU1lTQ0ZHX0lUTElORTMxIFNSX1JORyAgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19STkcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1JORyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPklUX0xJTkVfU1JbMzFdLCBTWVNDRkdfSVRMSU5FMzFfU1JfUk5HKSA9PSAoU1lTQ0ZHX0lUTElORTMxX1NSX1JORykpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBTWVNDRkdfSVRMSU5FMzFfU1JfUk5HICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbm5lY3Rpb25zIHRvIFRJTTEvMTUvMTYvMTcgQnJlYWsgaW5wdXRzCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBTUEwgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBWREwgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyAoKilcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIEVDQ0wgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0cworICAqIEBwYXJhbSAgQnJlYWsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogQGlmbm90IFNUTTMyRzA3MHh4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1BWRCAoKikKKyAgKiBAZW5kaWYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfU1JBTV9QQVJJVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX0VDQworICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyh1aW50MzJfdCBCcmVhaykKK3sKKyNpZiBkZWZpbmVkKFNZU0NGR19DRkdSMl9QVkRMKQorICBNT0RJRllfUkVHKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9DTEwgfCBTWVNDRkdfQ0ZHUjJfU1BMIHwgU1lTQ0ZHX0NGR1IyX1BWREwgfCBTWVNDRkdfQ0ZHUjJfRUNDTCwgQnJlYWspOworI2Vsc2UKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfQ0xMIHwgU1lTQ0ZHX0NGR1IyX1NQTCB8IFNZU0NGR19DRkdSMl9FQ0NMLCBCcmVhayk7CisjZW5kaWYgLypTWVNDRkdfQ0ZHUjJfUFZETCovCit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbm5lY3Rpb25zIHRvIFRJTTEvMTUvMTYvMTcgQnJlYWsgaW5wdXRzCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBTUEwgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBWREwgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0cyAoKilcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIEVDQ0wgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0cworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqIEBpZm5vdCBTVE0zMkcwNzB4eAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19QVkQgKCopCisgICogQGVuZGlmCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU1fUEFSSVRZCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX0xPQ0tVUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19FQ0MKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzKHZvaWQpCit7CisjaWYgZGVmaW5lZChTWVNDRkdfQ0ZHUjJfUFZETCkKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0NMTCB8IFNZU0NGR19DRkdSMl9TUEwgfCBTWVNDRkdfQ0ZHUjJfUFZETCB8IFNZU0NGR19DRkdSMl9FQ0NMKSk7CisjZWxzZQorICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfQ0xMIHwgU1lTQ0ZHX0NGR1IyX1NQTCB8IFNZU0NGR19DRkdSMl9FQ0NMKSk7CisjZW5kaWYgLypTWVNDRkdfQ0ZHUjJfUFZETCovCit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1JBTSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMiBTUEYgICAgICBMTF9TWVNDRkdfSXNBY3RpdmVGbGFnX1NQCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1BGKSA9PSAoU1lTQ0ZHX0NGR1IyX1NQRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTUkFNIHBhcml0eSBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgU1BGICAgICAgTExfU1lTQ0ZHX0NsZWFyRmxhZ19TUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0NsZWFyRmxhZ19TUCh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9TUEYpOworfQorCisjaWYgZGVmaW5lZChTVE0zMkcwNDF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkgCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDbGFtcGluZyBEaW9kZSBvbiBzcGVjaWZpYyBwaW4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMiBQQTFfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQTNfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQTVfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQTZfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQTEzX0NERU4gIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQjBfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQjFfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBQQjJfQ0RFTiAgIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlCisgICogQHBhcmFtICBDb25maWdDbGFtcGluZ0Rpb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQTFfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQTNfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQTVfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQTZfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQTEzX0NERU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0ZHUjJfUEIwX0NERU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0ZHUjJfUEIxX0NERU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfQ0ZHUjJfUEIyX0NERU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlKHVpbnQzMl90IENvbmZpZ0NsYW1waW5nRGlvZGUpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgQ29uZmlnQ2xhbXBpbmdEaW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDbGFtcGluZyBEaW9kZSBvbiBzcGVjaWZpYyBwaW4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMiBQQTFfQ0RFTiAgIExMX1NZU0NGR19EaXNhYmxlQ2xhbXBpbmdEaW9kZVxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgUEEzX0NERU4gICBMTF9TWVNDRkdfRGlzYWJsZUNsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBBNV9DREVOICAgTExfU1lTQ0ZHX0Rpc2FibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQTZfQ0RFTiAgIExMX1NZU0NGR19EaXNhYmxlQ2xhbXBpbmdEaW9kZVxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgUEExM19DREVOICBMTF9TWVNDRkdfRGlzYWJsZUNsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBCMF9DREVOICAgTExfU1lTQ0ZHX0Rpc2FibGVDbGFtcGluZ0Rpb2RlXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQQjFfQ0RFTiAgIExMX1NZU0NGR19EaXNhYmxlQ2xhbXBpbmdEaW9kZVxuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgUEIyX0NERU4gICBMTF9TWVNDRkdfRGlzYWJsZUNsYW1waW5nRGlvZGUKKyAgKiBAcGFyYW0gIENvbmZpZ0NsYW1waW5nRGlvZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBMV9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBM19DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBNV9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBNl9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBMTNfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjBfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjFfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjJfQ0RFTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVDbGFtcGluZ0Rpb2RlKHVpbnQzMl90IENvbmZpZ0NsYW1waW5nRGlvZGUpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IyLCBDb25maWdDbGFtcGluZ0Rpb2RlKTsKK30KKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgY2xhbXBpbmcgZGlvZGUocykgaXMoYXJlKSBlbmFibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIFBBMV9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBBM19DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBBNV9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBBNl9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBBMTNfQ0RFTiAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBCMF9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFBCMV9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGVcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIFBCMl9DREVOICAgTExfU1lTQ0ZHX0lzRW5hYmxlZENsYW1waW5nRGlvZGUKKyAgKiBAcGFyYW0gIENvbmZpZ0NsYW1waW5nRGlvZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBMV9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBM19DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBNV9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBNl9DREVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0NGR1IyX1BBMTNfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjBfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjFfQ0RFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19DRkdSMl9QQjJfQ0RFTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRDbGFtcGluZ0Rpb2RlKHVpbnQzMl90IENvbmZpZ0NsYW1waW5nRGlvZGUpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjIsIENvbmZpZ0NsYW1waW5nRGlvZGUpID09IChDb25maWdDbGFtcGluZ0Rpb2RlKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX0RCR01DVSBEQkdNQ1UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgZGV2aWNlIGlkZW50aWZpZXIKKyAgKiBAbm90ZSBGb3IgU1RNMzJHMDgxeHggZGV2aWNlcywgdGhlIGRldmljZSBJRCBpcyAweDQ2MAorICAqIEBybXRvbGwgREJHX0lEQ09ERSBERVZfSUQgICAgICAgIExMX0RCR01DVV9HZXREZXZpY2VJRAorICAqIEByZXR2YWwgVmFsdWVzIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQkdNQ1VfR2V0RGV2aWNlSUQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREJHLT5JRENPREUsIERCR19JRENPREVfREVWX0lEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllcgorICAqIEBub3RlIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSByZXZpc2lvbiBvZiB0aGUgZGV2aWNlLgorICAqIEBybXRvbGwgREJHX0lEQ09ERSBSRVZfSUQgICAgICAgIExMX0RCR01DVV9HZXRSZXZpc2lvbklECisgICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9EQkdNQ1VfR2V0UmV2aXNpb25JRCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkctPklEQ09ERSwgREJHX0lEQ09ERV9SRVZfSUQpID4+IERCR19JRENPREVfUkVWX0lEX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAqIEBybXRvbGwgREJHX0NSICAgIERCR19TVE9QICAgICAgTExfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChEQkctPkNSLCBEQkdfQ1JfREJHX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgICogQHJtdG9sbCBEQkdfQ1IgICAgREJHX1NUT1AgICAgICBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChEQkctPkNSLCBEQkdfQ1JfREJHX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUKKyAgKiBAcm10b2xsIERCR19DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHLT5DUiwgREJHX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEBybXRvbGwgREJHX0NSICAgIERCR19TVEFOREJZICAgTExfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHLT5DUiwgREJHX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBGcmVlemUgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHX0FQQl9GWjEgREJHX1RJTTJfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1RJTTNfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1RJTTZfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1RJTTdfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1JUQ19TVE9QICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1dXREdfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX0lXREdfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX0NBTl9TVE9QICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiBAaWZub3QgU1RNMzJHMDcweHgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUCAoKikKKyAgKiBAZW5kaWYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTNfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNNl9TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNN19TVE9QICgqKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1dXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1AKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKERCRy0+QVBCRloxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbmZyZWV6ZSBBUEIxIHBlcmlwaGVyYWxzIChncm91cDEgcGVyaXBoZXJhbHMpCisgICogQHJtdG9sbCBEQkdfQVBCX0ZaMSBEQkdfVElNMl9TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIERCR19BUEJfRloxIERCR19USU0zX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1RJTTZfU1RPUCAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMSBEQkdfVElNN19TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIERCR19BUEJfRloxIERCR19USU0xNF9TVE9QICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX1JUQ19TVE9QICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMSBEQkdfV1dER19TVE9QICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIERCR19BUEJfRloxIERCR19JV0RHX1NUT1AgICAgICAgICAgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjEgREJHX0kyQzFfU01CVVNfVElNRU9VVCAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqIEBpZm5vdCBTVE0zMkcwNzB4eAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QICgqKQorICAqIEBlbmRpZgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNM19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU02X1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU03X1NUT1AgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9SVENfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfV1dER19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUAorICAqCisgICogICAgICAgICAoKikgdmFsdWUgbm90IGRlZmluZWQgaW4gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKERCRy0+QVBCRloxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGcmVlemUgQVBCMiBwZXJpcGhlcmFscworICAqIEBybXRvbGwgREJHX0FQQl9GWjIgREJHX1RJTTFfU1RPUCAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIERCR19BUEJfRloyIERCR19USU0xNF9TVE9QICBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMiBEQkdfVElNMTVfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGhcbgorICAqICAgICAgICAgREJHX0FQQl9GWjIgREJHX1RJTTE2X1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoXG4KKyAgKiAgICAgICAgIERCR19BUEJfRloyIERCR19USU0xN19TVE9QICBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTRfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1AKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKERCRy0+QVBCRloyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbmZyZWV6ZSBBUEIyIHBlcmlwaGVyYWxzCisgICogQHJtdG9sbCBEQkdfQVBCX0ZaMiBEQkdfVElNMV9TVE9QICAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMiBEQkdfVElNMTRfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMiBEQkdfVElNMTVfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMiBEQkdfVElNMTZfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaFxuCisgICogICAgICAgICBEQkdfQVBCX0ZaMiBEQkdfVElNMTdfU1RPUCAgTExfREJHTUNVX0FQQjJfR1JQMV9VbkZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTRfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTVfU1RPUCAoKikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE3X1NUT1AKKyAgKgorICAqICAgICAgICAgKCopIHZhbHVlIG5vdCBkZWZpbmVkIGluIGFsbCBkZXZpY2VzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkctPkFQQkZaMiwgUGVyaXBocyk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfVlJFRkJVRiBWUkVGQlVGCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUkVGQlVGX0NTUl9FTlZSICAgICAgICAgIExMX1ZSRUZCVUZfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0VuYWJsZSh2b2lkKQoreworICBTRVRfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfRU5WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIFZSRUZCVUZfQ1NSX0VOVlIgICAgICAgICAgTExfVlJFRkJVRl9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfRU5WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGhpZ2ggaW1wZWRhbmNlIChWUkVGK3BpbiBpcyBoaWdoIGltcGVkYW5jZSkKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUkVGQlVGX0NTUl9ISVogICAgICAgICAgIExMX1ZSRUZCVUZfRW5hYmxlSElaCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0VuYWJsZUhJWih2b2lkKQoreworICBTRVRfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfSElaKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGhpZ2ggaW1wZWRhbmNlIChWUkVGK3BpbiBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgdm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIG91dHB1dCkKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUkVGQlVGX0NTUl9ISVogICAgICAgICAgIExMX1ZSRUZCVUZfRGlzYWJsZUhJWgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9EaXNhYmxlSElaKHZvaWQpCit7CisgIENMRUFSX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0hJWik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIFZSRUZCVUZfQ1NSX1ZSUyAgICAgICAgICAgTExfVlJFRkJVRl9TZXRWb2x0YWdlU2NhbGluZworICAqIEBwYXJhbSAgU2NhbGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9TZXRWb2x0YWdlU2NhbGluZyh1aW50MzJfdCBTY2FsZSkKK3sKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUywgU2NhbGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUkVGQlVGX0NTUl9WUlMgICAgICAgICAgIExMX1ZSRUZCVUZfR2V0Vm9sdGFnZVNjYWxpbmcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9WUkVGQlVGX0dldFZvbHRhZ2VTY2FsaW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfVlJTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIGlzIHJlYWR5CisgICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgVlJFRkJVRl9DU1JfVlJTICAgICAgICAgICBMTF9WUkVGQlVGX0lzVlJFRlJlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVlJFRkJVRl9Jc1ZSRUZSZWFkeSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUikgPT0gKFZSRUZCVUZfQ1NSX1ZSUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHRyaW1taW5nIGNvZGUgZm9yIFZSRUZCVUYgY2FsaWJyYXRpb24KKyAgKiBAcm10b2xsIFZSRUZCVUZfQ0NSICBWUkVGQlVGX0NDUl9UUklNICAgICAgICAgIExMX1ZSRUZCVUZfR2V0VHJpbW1pbmcKKyAgKiBAcmV0dmFsIEJldHdlZW4gMCBhbmQgMHgzRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1ZSRUZCVUZfR2V0VHJpbW1pbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVlJFRkJVRi0+Q0NSLCBWUkVGQlVGX0NDUl9UUklNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmltbWluZyBjb2RlIGZvciBWUkVGQlVGIGNhbGlicmF0aW9uIChUdW5lIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgYnVmZmVyIHZvbHRhZ2UpCisgICogQHJtdG9sbCBWUkVGQlVGX0NDUiAgVlJFRkJVRl9DQ1JfVFJJTSAgICAgICAgICBMTF9WUkVGQlVGX1NldFRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBCZXR3ZWVuIDAgYW5kIDB4M0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfU2V0VHJpbW1pbmcodWludDMyX3QgVmFsdWUpCit7CisgIFdSSVRFX1JFRyhWUkVGQlVGLT5DQ1IsIFZhbHVlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBWUkVGQlVGICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX0ZMQVNIIEZMQVNICisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgRkxBU0ggTGF0ZW5jeQorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIEZMQVNIX0FDUl9MQVRFTkNZICAgICAgIExMX0ZMQVNIX1NldExhdGVuY3kKKyAgKiBAcGFyYW0gIExhdGVuY3kgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTEFTSF9MQVRFTkNZXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX1NldExhdGVuY3kodWludDMyX3QgTGF0ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfTEFURU5DWSwgTGF0ZW5jeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEZMQVNIIExhdGVuY3kKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBGTEFTSF9BQ1JfTEFURU5DWSAgICAgICBMTF9GTEFTSF9HZXRMYXRlbmN5CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0dldExhdGVuY3kodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0xBVEVOQ1kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUHJlZmV0Y2gKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBGTEFTSF9BQ1JfUFJGVEVOICAgICAgICBMTF9GTEFTSF9FbmFibGVQcmVmZXRjaAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlUHJlZmV0Y2godm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFByZWZldGNoCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRkxBU0hfQUNSX1BSRlRFTiAgICAgICAgTExfRkxBU0hfRGlzYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlUHJlZmV0Y2godm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFByZWZldGNoIGJ1ZmZlciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRkxBU0hfQUNSX1BSRlRFTiAgICAgICAgTExfRkxBU0hfSXNQcmVmZXRjaEVuYWJsZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTEFTSF9Jc1ByZWZldGNoRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKSA9PSAoRkxBU0hfQUNSX1BSRlRFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSW5zdHJ1Y3Rpb24gY2FjaGUKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBGTEFTSF9BQ1JfSUNFTiAgICAgICAgICBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZUluc3RDYWNoZSh2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEluc3RydWN0aW9uIGNhY2hlCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRkxBU0hfQUNSX0lDRU4gICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZSh2b2lkKQoreworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJbnN0cnVjdGlvbiBjYWNoZSByZXNldAorICAqIEBub3RlICBiaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBpcyBkaXNhYmxlZAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIEZMQVNIX0FDUl9JQ1JTVCAgICAgICAgIExMX0ZMQVNIX0VuYWJsZUluc3RDYWNoZVJlc2V0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGVSZXNldCh2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJbnN0cnVjdGlvbiBjYWNoZSByZXNldAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIEZMQVNIX0FDUl9JQ1JTVCAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVJbnN0Q2FjaGVSZXNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZVJlc2V0KHZvaWQpCit7CisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNSU1QpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoRkxBU0gpIHx8IGRlZmluZWQgKFNZU0NGRykgfHwgZGVmaW5lZCAoREJHKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX1NZU1RFTV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX3RpbS5oIGIvSW5jL3N0bTMyZzB4eF9sbF90aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFmYjZmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF90aW0uaApAQCAtMCwwICsxLDUwNDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFRJTSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyRzB4eF9MTF9USU1fSAorI2RlZmluZSBfX1NUTTMyRzB4eF9MTF9USU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFRJTTEpIHx8IGRlZmluZWQgKFRJTTIpIHx8IGRlZmluZWQgKFRJTTMpIHx8ICBkZWZpbmVkIChUSU0xNCkgfHwgIGRlZmluZWQgKFRJTTE1KSB8fCBkZWZpbmVkIChUSU0xNikgfHwgZGVmaW5lZCAoVElNMTcpIHx8IGRlZmluZWQgKFRJTTYpIHx8IGRlZmluZWQgKFRJTTcpCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMIFRJTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9WYXJpYWJsZXMgVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IE9GRlNFVF9UQUJfQ0NNUnhbXSA9Cit7CisgIDB4MDBVLCAgIC8qIDA6IFRJTXhfQ0gxICAqLworICAweDAwVSwgICAvKiAxOiBUSU14X0NIMU4gKi8KKyAgMHgwMFUsICAgLyogMjogVElNeF9DSDIgICovCisgIDB4MDBVLCAgIC8qIDM6IFRJTXhfQ0gyTiAqLworICAweDA0VSwgICAvKiA0OiBUSU14X0NIMyAgKi8KKyAgMHgwNFUsICAgLyogNTogVElNeF9DSDNOICovCisgIDB4MDRVLCAgIC8qIDY6IFRJTXhfQ0g0ICAqLworICAweDNDVSwgICAvKiA3OiBUSU14X0NINSAgKi8KKyAgMHgzQ1UgICAgLyogODogVElNeF9DSDYgICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfT0N4eFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogT0MxTSwgT0MxRkUsIE9DMVBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDE6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogMjogT0MyTSwgT0MyRkUsIE9DMlBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDM6IC0gTkEgKi8KKyAgMFUsICAgICAgICAgICAgLyogNDogT0MzTSwgT0MzRkUsIE9DM1BFICovCisgIDBVLCAgICAgICAgICAgIC8qIDU6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogNjogT0M0TSwgT0M0RkUsIE9DNFBFICovCisgIDBVLCAgICAgICAgICAgIC8qIDc6IE9DNU0sIE9DNUZFLCBPQzVQRSAqLworICA4VSAgICAgICAgICAgICAvKiA4OiBPQzZNLCBPQzZGRSwgT0M2UEUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFNISUZUX1RBQl9JQ3h4W10gPQoreworICAwVSwgICAgICAgICAgICAvKiAwOiBDQzFTLCBJQzFQU0MsIElDMUYgKi8KKyAgMFUsICAgICAgICAgICAgLyogMTogLSBOQSAqLworICA4VSwgICAgICAgICAgICAvKiAyOiBDQzJTLCBJQzJQU0MsIElDMkYgKi8KKyAgMFUsICAgICAgICAgICAgLyogMzogLSBOQSAqLworICAwVSwgICAgICAgICAgICAvKiA0OiBDQzNTLCBJQzNQU0MsIElDM0YgKi8KKyAgMFUsICAgICAgICAgICAgLyogNTogLSBOQSAqLworICA4VSwgICAgICAgICAgICAvKiA2OiBDQzRTLCBJQzRQU0MsIElDNEYgKi8KKyAgMFUsICAgICAgICAgICAgLyogNzogLSBOQSAqLworICAwVSAgICAgICAgICAgICAvKiA4OiAtIE5BICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfQ0N4UFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogQ0MxUCAqLworICAyVSwgICAgICAgICAgICAvKiAxOiBDQzFOUCAqLworICA0VSwgICAgICAgICAgICAvKiAyOiBDQzJQICovCisgIDZVLCAgICAgICAgICAgIC8qIDM6IENDMk5QICovCisgIDhVLCAgICAgICAgICAgIC8qIDQ6IENDM1AgKi8KKyAgMTBVLCAgICAgICAgICAgLyogNTogQ0MzTlAgKi8KKyAgMTJVLCAgICAgICAgICAgLyogNjogQ0M0UCAqLworICAxNlUsICAgICAgICAgICAvKiA3OiBDQzVQICovCisgIDIwVSAgICAgICAgICAgIC8qIDg6IENDNlAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IFNISUZUX1RBQl9PSVN4W10gPQoreworICAwVSwgICAgICAgICAgICAvKiAwOiBPSVMxICovCisgIDFVLCAgICAgICAgICAgIC8qIDE6IE9JUzFOICovCisgIDJVLCAgICAgICAgICAgIC8qIDI6IE9JUzIgKi8KKyAgM1UsICAgICAgICAgICAgLyogMzogT0lTMk4gKi8KKyAgNFUsICAgICAgICAgICAgLyogNDogT0lTMyAqLworICA1VSwgICAgICAgICAgICAvKiA1OiBPSVMzTiAqLworICA2VSwgICAgICAgICAgICAvKiA2OiBPSVM0ICovCisgIDhVLCAgICAgICAgICAgIC8qIDc6IE9JUzUgKi8KKyAgMTBVICAgICAgICAgICAgLyogODogT0lTNiAqLworfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9MTF9Qcml2YXRlX0NvbnN0YW50cyBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWZpbmVzIHVzZWQgZm9yIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIHJlZ2lzdGVyIGFuZCBwZXJmb3JtIG9mZnNldHMgKi8KKyNkZWZpbmUgVElNX1BPU0lUSU9OX0JSS19TT1VSQ0UgICAgICAgICAgICAoKFNvdXJjZSA+PiAxVSkgJiAweDFGVSkKKworLyogR2VuZXJpYyBiaXQgZGVmaW5pdGlvbnMgZm9yIFRJTXhfQUYxIHJlZ2lzdGVyICovCisjZGVmaW5lIFRJTXhfQUYxX0JLSU5FICAgICBUSU0xX0FGMV9CS0lORSAgICAgLyohPCBCUksgQktJTiBpbnB1dCBlbmFibGUgKi8KKyNpZiBkZWZpbmVkKENPTVAxKSAmJiBkZWZpbmVkKENPTVAyKQorI2RlZmluZSBUSU14X0FGMV9CS0NPTVAxRSAgVElNMV9BRjFfQktDTVAxRSAgIC8qITwgQlJLIENPTVAxIGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMV9CS0NPTVAyRSAgVElNMV9BRjFfQktDTVAyRSAgIC8qITwgQlJLIENPTVAyIGVuYWJsZSAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisjZGVmaW5lIFRJTXhfQUYxX0JLSU5QICAgICBUSU0xX0FGMV9CS0lOUCAgICAgLyohPCBCUksgQktJTiBpbnB1dCBwb2xhcml0eSAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIFRJTXhfQUYxX0JLQ09NUDFQICBUSU0xX0FGMV9CS0NNUDFQICAgLyohPCBCUksgQ09NUDEgaW5wdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNeF9BRjFfQktDT01QMlAgIFRJTTFfQUYxX0JLQ01QMlAgICAvKiE8IEJSSyBDT01QMiBpbnB1dCBwb2xhcml0eSAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisjZGVmaW5lIFRJTXhfQUYxX0VUUlNFTCAgICBUSU0xX0FGMV9FVFJTRUwgICAgLyohPCBUSU14IEVUUiBzb3VyY2Ugc2VsZWN0aW9uICovCisKKy8qIEdlbmVyaWMgYml0IGRlZmluaXRpb25zIGZvciBUSU14X0FGMiByZWdpc3RlciAqLworI2RlZmluZSBUSU14X0FGMl9CSzJJTkUgICAgVElNMV9BRjJfQksySU5FICAgICAgLyohPCBCUksyIEJLSU4yIGlucHV0IGVuYWJsZSAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIFRJTXhfQUYyX0JLMkNPTVAxRSBUSU0xX0FGMl9CSzJDTVAxRSAgICAvKiE8IEJSSzIgQ09NUDEgZW5hYmxlICovCisjZGVmaW5lIFRJTXhfQUYyX0JLMkNPTVAyRSBUSU0xX0FGMl9CSzJDTVAyRSAgICAvKiE8IEJSSzIgQ09NUDIgZW5hYmxlICovCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKyNkZWZpbmUgVElNeF9BRjJfQksySU5QICAgIFRJTTFfQUYyX0JLMklOUCAgICAgIC8qITwgQlJLMiBCS0lOMiBpbnB1dCBwb2xhcml0eSAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIFRJTXhfQUYyX0JLMkNPTVAxUCBUSU0xX0FGMl9CSzJDTVAxUCAgICAvKiE8IEJSSzIgQ09NUDEgaW5wdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNeF9BRjJfQksyQ09NUDJQIFRJTTFfQUYyX0JLMkNNUDJQICAgIC8qITwgQlJLMiBDT01QMiBpbnB1dCBwb2xhcml0eSAqLworCisjZW5kaWYgLyogQ09NUDEgJiYgQ09NUDIgKi8KKworCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBUREdbeDowXSBvZiB0aGUgRFRHIGJpdHMgb2YgdGhlIFRJTXhfQkRUUiByZWdpc3RlciAqLworI2RlZmluZSBEVF9ERUxBWV8xICgodWludDhfdCkweDdGKQorI2RlZmluZSBEVF9ERUxBWV8yICgodWludDhfdCkweDNGKQorI2RlZmluZSBEVF9ERUxBWV8zICgodWludDhfdCkweDFGKQorI2RlZmluZSBEVF9ERUxBWV80ICgodWludDhfdCkweDFGKQorCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBEVEdbNzo1XSBiaXRzIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyICovCisjZGVmaW5lIERUX1JBTkdFXzEgKCh1aW50OF90KTB4MDApCisjZGVmaW5lIERUX1JBTkdFXzIgKCh1aW50OF90KTB4ODApCisjZGVmaW5lIERUX1JBTkdFXzMgKCh1aW50OF90KTB4QzApCisjZGVmaW5lIERUX1JBTkdFXzQgKCh1aW50OF90KTB4RTApCisKKy8qKiBMZWdhY3kgZGVmaW5pdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorQGNvbmQgMAorKi8KKy8qKgorQGVuZGNvbmQKKyAgKi8KKworI2RlZmluZSBPQ1JFRl9DTEVBUl9TRUxFQ1RfUG9zICgxNlUpCisjZGVmaW5lIE9DUkVGX0NMRUFSX1NFTEVDVF9Nc2sgKDB4MVUgPDwgT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcykgICAgICAgICAgICAgICAgLyohPCAweDAwMDEwMDAwICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9NYWNyb3MgVElNIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIENvbnZlcnQgY2hhbm5lbCBpZCBpbnRvIGNoYW5uZWwgaW5kZXguCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoIF9fQ0hBTk5FTF9fKSBcCisoKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gxKSA/IDBVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDFOKSA/IDFVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDIpID8gMlUgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMk4pID8gM1UgOlwKKygoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMykgPyA0VSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gzTikgPyA1VSA6XAorKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0g0KSA/IDZVIDpcCisoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDUpID8gN1UgOiA4VSkKKworLyoqIEBicmllZiAgQ2FsY3VsYXRlIHRoZSBkZWFkdGltZSBzYW1wbGluZyBwZXJpb2QoaW4gcHMpLgorICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KS4KKyAgKiBAcGFyYW0gIF9fQ0tEX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgVElNX0NBTENfRFRTKF9fVElNQ0xLX18sIF9fQ0tEX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgPyAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLyhfX1RJTUNMS19fKSkgICAgICAgICA6IFwKKyAgICAgKChfX0NLRF9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSA/ICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUvKChfX1RJTUNMS19fKSA+PiAxVSkpIDogXAorICAgICAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLygoX19USU1DTEtfXykgPj4gMlUpKSkKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VTX0lOSVQgVElNIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUSU0gVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MTZfdCBQcmVzY2FsZXI7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVElNIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IENvdW50ZXJNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY291bnRlciBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19DT1VOVEVSTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRDb3VudGVyTW9kZSgpLiovCisKKyAgdWludDMyX3QgQXV0b3JlbG9hZDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhdXRvIHJlbG9hZCB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG8tUmVsb2FkIFJlZ2lzdGVyIGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lIHRpbWVyIGluc3RhbmNlcyBtYXkgc3VwcG9ydCAzMiBiaXRzIGNvdW50ZXJzLiBJbiB0aGF0IGNhc2UgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGRkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRBdXRvUmVsb2FkKCkuKi8KKworICB1aW50MzJfdCBDbG9ja0RpdmlzaW9uOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19DTE9DS0RJVklTSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldENsb2NrRGl2aXNpb24oKS4qLworCisgIHVpbnQ4X3QgUmVwZXRpdGlvbkNvdW50ZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoIHRpbWUgdGhlIFJDUiBkb3duY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVzIHplcm8sIGFuIHVwZGF0ZSBldmVudCBpcyBnZW5lcmF0ZWQgYW5kIGNvdW50aW5nIHJlc3RhcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFJDUiB2YWx1ZSAoTikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgaW4gUFdNIG1vZGUgdGhhdCAoTisxKSBjb3JyZXNwb25kcyB0bzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIFBXTSBwZXJpb2RzIGluIGVkZ2UtYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiBoYWxmIFBXTSBwZXJpb2QgaW4gY2VudGVyLWFsaWduZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMCBhbmQgMHhGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcigpLiovCit9IExMX1RJTV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gT3V0cHV0IENvbXBhcmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE9DTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9PQ19TZXRNb2RlKCkuKi8KKworICB1aW50MzJfdCBPQ1N0YXRlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DU1RBVEUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbCgpIG9yIEByZWYgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsKCkuKi8KKworICB1aW50MzJfdCBPQ05TdGF0ZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIGNvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKCkgb3IgQHJlZiBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoKS4qLworCisgIHVpbnQzMl90IENvbXBhcmVWYWx1ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBDb21wYXJlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIeCAoeD0xLi42KS4qLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NQT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NQT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldFBvbGFyaXR5KCkuKi8KKworCisgIHVpbnQzMl90IE9DSWRsZVN0YXRlOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DSURMRVNUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0SWRsZVN0YXRlKCkuKi8KKworICB1aW50MzJfdCBPQ05JZGxlU3RhdGU7ICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHBpbiBzdGF0ZSBkdXJpbmcgSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ0lETEVTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldElkbGVTdGF0ZSgpLiovCit9IExMX1RJTV9PQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gSW5wdXQgQ2FwdHVyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICAqLworCit0eXBlZGVmIHN0cnVjdAoreworCisgIHVpbnQzMl90IElDUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDQWN0aXZlSW5wdXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdCBJQ1ByZXNjYWxlcjsgICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDRmlsdGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworfSBMTF9USU1fSUNfSW5pdFR5cGVEZWY7CisKKworLyoqCisgICogQGJyaWVmICBUSU0gRW5jb2RlciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEVuY29kZXJNb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGVuY29kZXIgcmVzb2x1dGlvbiAoeDIgb3IgeDQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfRU5DT0RFUk1PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldEVuY29kZXJNb2RlKCkuKi8KKworICB1aW50MzJfdCBJQzFQb2xhcml0eTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiBUSTEgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19QT0xBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IElDMUFjdGl2ZUlucHV0OyAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FDVElWRUlOUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dCgpLiovCisKKyAgdWludDMyX3QgSUMxUHJlc2NhbGVyOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHByZXNjYWxlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKKyAgdWludDMyX3QgSUMyUG9sYXJpdHk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIFRJMiBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUMyQWN0aXZlSW5wdXQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdCBJQzJQcmVzY2FsZXI7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgSUMyRmlsdGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkyIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0RmlsdGVyKCkuKi8KKworfSBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gSGFsbCBzZW5zb3IgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworCisgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIFRJMSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUMxUHJlc2NhbGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHByZXNjYWxlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNjYWxlciBtdXN0IGJlIHNldCB0byBnZXQgYSBtYXhpbXVtIGNvdW50ZXIgcGVyaW9kIGxvbmdlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIDIgY29uc2VjdXRpdmUgY2hhbmdlcyBvbiB0aGUgSGFsbCBpbnB1dHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBJQzFGaWx0ZXI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworCisgIHVpbnQzMl90IENvbW11dGF0aW9uRGVsYXk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9zaXRpdmUgcHVsc2UgKFRSR08gZXZlbnQpIGlzIGdlbmVyYXRlZCB3aXRoIGEgcHJvZ3JhbW1hYmxlIGRlbGF5IGV2ZXJ5IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY2hhbmdlIG9jY3VycyBvbiB0aGUgSGFsbCBpbnB1dHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldENvbXBhcmVDSDIoKS4qLworfSBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBCRFRSIChCcmVhayBhbmQgRGVhZCBUaW1lKSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT1NTUlN0YXRlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBPZmYtU3RhdGUgc2VsZWN0aW9uIHVzZWQgaW4gUnVuIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09TU1IKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9TZXRPZmZTdGF0ZXMoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbm5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMiBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IE9TU0lTdGF0ZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgT2ZmLVN0YXRlIHVzZWQgaW4gSWRsZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT1NTSQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldE9mZlN0YXRlcygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAyIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgTG9ja0xldmVsOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBMT0NLIGxldmVsIHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0xPQ0tMRVZFTAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBMT0NLIGJpdHMgY2FuIGJlIHdyaXR0ZW4gb25seSBvbmNlIGFmdGVyIHRoZSByZXNldC4gT25jZSB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZWlyIGNvbnRlbnQgaXMgZnJvemVuIHVudGlsIHRoZSBuZXh0IHJlc2V0LiovCisKKyAgdWludDhfdCBEZWFkVGltZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gdGhlIHN3aXRjaGluZy1vZmYgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hpbmctb24gb2YgdGhlIG91dHB1dHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldERlYWRUaW1lKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxLCAyIG9yIDMgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MTZfdCBCcmVha1N0YXRlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEJyZWFrIGlucHV0IGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBS19FTkFCTEUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9USU1fRW5hYmxlQlJLKCkgb3IgQHJlZiBMTF9USU1fRGlzYWJsZUJSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrIElucHV0IHBpbiBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUtfUE9MQVJJVFkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9Db25maWdCUksoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVha0ZpbHRlcjsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhayBGaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLX0ZJTFRFUgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0NvbmZpZ0JSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrQUZNb2RlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9mIHRoZSBicmVhayBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUtfQUZNT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVElNX0NvbmZpZ0JSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgQmlkaXJlY3Rpb25hbCBicmVhayBpbnB1dCBpcyBvbmx5IHN1cHBvcnRlZCBieSBhZHZhbmNlZCB0aW1lcnMgaW5zdGFuY2VzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJTdGF0ZTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEJyZWFrMiBpbnB1dCBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUsyX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9FbmFibGVCUksyKCkgb3IgQHJlZiBMTF9USU1fRGlzYWJsZUJSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJQb2xhcml0eTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsyIElucHV0IHBpbiBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUsyX1BPTEFSSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fQ29uZmlnQlJLMigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrMkZpbHRlcjsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBCcmVhazIgRmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBSzJfRklMVEVSCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fQ29uZmlnQlJLMigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrMkFGTW9kZTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9mIHRoZSBicmVhazIgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLMl9BRk1PREUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9USU1fQ29uZmlnQlJLMigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgQmlkaXJlY3Rpb25hbCBicmVhayBpbnB1dCBpcyBvbmx5IHN1cHBvcnRlZCBieSBhZHZhbmNlZCB0aW1lcnMgaW5zdGFuY2VzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBBdXRvbWF0aWNPdXRwdXQ7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEF1dG9tYXRpYyBPdXRwdXQgZmVhdHVyZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQVVUT01BVElDT1VUUFVUX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCit9IExMX1RJTV9CRFRSX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVElNX1JlYWRSZWcgZnVuY3Rpb24uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1NSX1VJRiAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX1VJRiAgICAgICAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMUlGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMUlGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MySUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MySUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzNJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzNJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDNElGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNElGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0M1SUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M1SUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzZJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzZJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NPTUlGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NPTUlGICAgICAgICAgLyohPCBDT00gaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX1RJRiAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX1RJRiAgICAgICAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9CSUYgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9CSUYgICAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0IySUYgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0IySUYgICAgICAgICAgLyohPCBTZWNvbmQgYnJlYWsgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMU9GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMU9GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzJPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MzT0YgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MzT0YgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDNE9GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNE9GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9TQklGICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9TQklGICAgICAgICAgIC8qITwgU3lzdGVtIEJyZWFrIGludGVycnVwdCBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRU5BQkxFIEJyZWFrIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBCcmVhayBmdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRU5BQkxFICAgICAgICAgICAgIFRJTV9CRFRSX0JLRSAgICAgICAgICAgIC8qITwgQnJlYWsgZnVuY3Rpb24gZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0VOQUJMRSBCcmVhazIgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgQnJlYWsyIGZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRU5BQkxFICAgICAgICAgICAgIFRJTV9CRFRSX0JLMkUgICAgICAgICAgICAvKiE8IEJyZWFrMiBmdW5jdGlvbiBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19BVVRPTUFUSUNPVVRQVVRfRU5BQkxFIEF1dG9tYXRpYyBvdXRwdXQgZW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNT0UgY2FuIGJlIHNldCBvbmx5IGJ5IHNvZnR3YXJlICovCisjZGVmaW5lIExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRU5BQkxFICAgICAgICAgIFRJTV9CRFRSX0FPRSAgICAgICAgICAgIC8qITwgTU9FIGNhbiBiZSBzZXQgYnkgc29mdHdhcmUgb3IgYXV0b21hdGljYWxseSBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1RJTV9SZWFkUmVnIGFuZCAgTExfVElNX1dyaXRlUmVnIGZ1bmN0aW9ucy4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRElFUl9VSUUgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9VSUUgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDMUlFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMUlFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzJJRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzJJRSAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0MzSUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MzSUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDNElFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDNElFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DT01JRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DT01JRSAgICAgICAvKiE8IENPTSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1RJRSAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0JJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0JJRSAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVVBEQVRFU09VUkNFIFVwZGF0ZSBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93LCBTZXR0aW5nIHRoZSBVRyBiaXQgb3IgVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyIGdlbmVyYXRlcyBhbiB1cGRhdGUgcmVxdWVzdCAqLworI2RlZmluZSBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIgICAgICAgICAgICBUSU1fQ1IxX1VSUyAgICAgICAgICAvKiE8IE9ubHkgY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSByZXF1ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PTkVQVUxTRU1PREUgT25lIFB1bHNlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRSAgICAgICAgICAgICBUSU1fQ1IxX09QTSAgICAgICAgICAvKiE8IENvdW50ZXIgaXMgbm90IHN0b3BwZWQgYXQgdXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQ291bnRlciBzdG9wcyBjb3VudGluZyBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJNT0RFIENvdW50ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9VUCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITxDb3VudGVyIHVzZWQgYXMgdXBjb3VudGVyICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOICAgICAgICAgICAgICAgIFRJTV9DUjFfRElSICAgICAgICAgIC8qITwgQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAgICAgICAgICAgIFRJTV9DUjFfQ01TXzAgICAgICAgIC8qITwgVGhlIGNvdW50ZXIgY291bnRzIHVwIGFuZCBkb3duIGFsdGVybmF0aXZlbHkuIE91dHB1dCBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSB3aGVuIHRoZSBjb3VudGVyIGlzIGNvdW50aW5nIGRvd24uICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTiAgICAgICAgIFRJTV9DUjFfQ01TXzEgICAgICAgIC8qITxUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOICAgICAgVElNX0NSMV9DTVMgICAgICAgICAgLyohPCBUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgb3IgZG93bi4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NMT0NLRElWSVNJT04gQ2xvY2sgRGl2aXNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IHREVFM9dENLX0lOVCAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyICAgICAgICAgICAgICBUSU1fQ1IxX0NLRF8wICAgICAgICAvKiE8IHREVFM9Mip0Q0tfSU5UICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQgICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzEgICAgICAgIC8qITwgdERUUz00KnRDS19JTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJESVJFQ1RJT04gQ291bnRlciBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9VUCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFRpbWVyIGNvdW50ZXIgY291bnRzIHVwICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX0RPV04gICAgICAgICAgIFRJTV9DUjFfRElSICAgICAgICAgIC8qITwgVGltZXIgY291bnRlciBjb3VudHMgZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0NVUERBVEVTT1VSQ0UgQ2FwdHVyZSBDb21wYXJlICBVcGRhdGUgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfT05MWSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9ubHkgKi8KKyNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfQU5EX1RSR0kgICAgVElNX0NSMl9DQ1VTICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9yIHdoZW4gYSByaXNpbmcgZWRnZSBvY2N1cnMgb24gdHJpZ2dlciBpbnB1dCAoVFJHSSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NDRE1BUkVRVUVTVCBDYXB0dXJlIENvbXBhcmUgRE1BIFJlcXVlc3QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX0NDICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdCBzZW50IHdoZW4gQ0N4IGV2ZW50IG9jY3VycyAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX1VQREFURSAgICAgICAgICAgICBUSU1fQ1IyX0NDRFMgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdHMgc2VudCB3aGVuIHVwZGF0ZSBldmVudCBvY2N1cnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0xPQ0tMRVZFTCBMb2NrIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF9PRkYgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBMT0NLIE9GRiAtIE5vIGJpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8xICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18wICAgICAgLyohPCBMT0NLIExldmVsIDEgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8yICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18xICAgICAgLyohPCBMT0NLIExldmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8zICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DSyAgICAgICAgLyohPCBMT0NLIExldmVsIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NIQU5ORUwgQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMSAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMUUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDFOICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFORSAgICAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDIgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzJFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gyTiAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MyTkUgICAgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gzICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MzRSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIM04gICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDM05FICAgIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NINCAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDNEUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDUgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzVFICAgICAvKiE8IFRpbWVyIG91dHB1dCBjaGFubmVsIDUgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g2ICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0M2RSAgICAgLyohPCBUaW1lciBvdXRwdXQgY2hhbm5lbCA2ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1NUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBPQ3ggaXMgbm90IGFjdGl2ZSAqLworI2RlZmluZSBMTF9USU1fT0NTVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFFICAgICAgICAgICAvKiE8IE9DeCBzaWduYWwgaXMgb3V0cHV0IG9uIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DTU9ERSBPdXRwdXQgQ29uZmlndXJhdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GUk9aRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIG91dHB1dCBjb21wYXJlIHJlZ2lzdGVyIFRJTXhfQ0NSeSBhbmQgdGhlIGNvdW50ZXIgVElNeF9DTlQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3V0cHV0IGNoYW5uZWwgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9JTkFDVElWRSAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgbG93IG9uIGNvbXBhcmUgbWF0Y2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1RPR0dMRSAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAvKiE8T0N5UkVGIHRvZ2dsZXMgb24gY29tcGFyZSBtYXRjaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8T0N5UkVGIGlzIGZvcmNlZCBsb3cqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAvKiE8T0N5UkVGIGlzIGZvcmNlZCBoaWdoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9QV00xICAgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8xKSAgICAgICAgICAgICAgICAgICAgLyohPEluIHVwY291bnRpbmcsIGNoYW5uZWwgeSBpcyBhY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVDxUSU14X0NDUnkgZWxzZSBpbmFjdGl2ZS4gIEluIGRvd25jb3VudGluZywgY2hhbm5lbCB5IGlzIGluYWN0aXZlIGFzIGxvbmcgYXMgVElNeF9DTlQ+VElNeF9DQ1J5IGVsc2UgYWN0aXZlLiovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUFdNMiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITxJbiB1cGNvdW50aW5nLCBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVDxUSU14X0NDUnkgZWxzZSBhY3RpdmUuICBJbiBkb3duY291bnRpbmcsIGNoYW5uZWwgeSBpcyBhY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVD5USU14X0NDUnkgZWxzZSBpbmFjdGl2ZSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDEqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0yICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAvKiE8UmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAyKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8yKSAgICAgICAgICAgICAgICAgICAgLyohPENvbWJpbmVkIFBXTSBtb2RlIDEqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzAgfCBUSU1fQ0NNUjFfT0MxTV8yKSAvKiE8Q29tYmluZWQgUFdNIG1vZGUgMiovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITxBc3ltbWV0cmljIFBXTSBtb2RlIDEqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMiAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNKSAgICAgICAgICAgICAgICAgICAgICAvKiE8QXN5bW1ldHJpYyBQV00gbW9kZSAyKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DUE9MQVJJVFkgT3V0cHV0IENvbmZpZ3VyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT0NQT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBPQ3hhY3RpdmUgaGlnaCovCisjZGVmaW5lIExMX1RJTV9PQ1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMVAgICAgICAgICAgICAgICAvKiE8IE9DeGFjdGl2ZSBsb3cqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NJRExFU1RBVEUgT3V0cHV0IENvbmZpZ3VyYXRpb24gSWRsZSBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PQ0lETEVTVEFURV9MT1cgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxPQ3g9MCAoYWZ0ZXIgYSBkZWFkLXRpbWUgaWYgT0MgaXMgaW1wbGVtZW50ZWQpIHdoZW4gTU9FPTAqLworI2RlZmluZSBMTF9USU1fT0NJRExFU1RBVEVfSElHSCAgICAgICAgICAgICAgICBUSU1fQ1IyX09JUzEgICAgICAgICAgICAvKiE8T0N4PTEgKGFmdGVyIGEgZGVhZC10aW1lIGlmIE9DIGlzIGltcGxlbWVudGVkKSB3aGVuIE1PRT0wKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0dST1VQQ0g1IEdST1VQQ0g1CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0dST1VQQ0g1X05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDICovCisjZGVmaW5lIExMX1RJTV9HUk9VUENINV9PQzFSRUZDICAgICAgICAgICAgICAgIFRJTV9DQ1I1X0dDNUMxICAgICAgICAvKiE8IE9DMVJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMVJFRkMgYW5kIE9DNVJFRiAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfT0MyUkVGQyAgICAgICAgICAgICAgICBUSU1fQ0NSNV9HQzVDMiAgICAgICAgLyohPCBPQzJSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzJSRUZDIGFuZCBPQzVSRUYgKi8KKyNkZWZpbmUgTExfVElNX0dST1VQQ0g1X09DM1JFRkMgICAgICAgICAgICAgICAgVElNX0NDUjVfR0M1QzMgICAgICAgIC8qITwgT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVCBBY3RpdmUgSW5wdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTXzAgPDwgMTZVKSAvKiE8IElDeCBpcyBtYXBwZWQgb24gVEl4ICovCisjZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJICAgICAgICAgIChUSU1fQ0NNUjFfQ0MxU18xIDw8IDE2VSkgLyohPCBJQ3ggaXMgbWFwcGVkIG9uIFRJeSAqLworI2RlZmluZSBMTF9USU1fQUNUSVZFSU5QVVRfVFJDICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0NDMVMgPDwgMTZVKSAgIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUUkMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lDUFNDIElucHV0IENvbmZpZ3VyYXRpb24gUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0lDUFNDX0RJVjEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciwgY2FwdHVyZSBpcyBkb25lIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVYyICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDXzAgPDwgMTZVKSAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVY0ICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDXzEgPDwgMTZVKSAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzICovCisjZGVmaW5lIExMX1RJTV9JQ1BTQ19ESVY4ICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxUFNDIDw8IDE2VSkgICAgICAvKiE8IENhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19JQ19GSUxURVIgSW5wdXQgQ29uZmlndXJhdGlvbiBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMCA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRl8xIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042ICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMiA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYgICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzEpIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzMgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzEgfCBUSU1fQ0NNUjFfSUMxRl8wKSA8PCAxNlUpICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMikgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjggICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNfUE9MQVJJVFkgSW5wdXQgQ29uZmlndXJhdGlvbiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIFRJeEZQMSByaXNpbmcgZWRnZSwgVEl4RlAxIGlzIG5vdCBpbnZlcnRlZCAqLworI2RlZmluZSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFQICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgZmFsbGluZyBlZGdlLCBUSXhGUDEgaXMgaW52ZXJ0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFICAgICAgICAgICAgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkgLyohPCBUaGUgY2lyY3VpdCBpcyBzZW5zaXRpdmUgdG8gYm90aCBUSXhGUDEgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzLCBUSXhGUDEgaXMgbm90IGludmVydGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19DTE9DS1NPVVJDRSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRpbWVyIGlzIGNsb2NrZWQgYnkgdGhlIGludGVybmFsIGNsb2NrIHByb3ZpZGVkIGZyb20gdGhlIFJDQyAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUxICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAgIC8qITwgQ291bnRlciBjb3VudHMgYXQgZWFjaCByaXNpbmcgb3IgZmFsbGluZyBlZGdlIG9uIGEgc2VsZWN0ZWQgaW5wdXQqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUyICAgICAgICAgICBUSU1fU01DUl9FQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBjb3VudHMgYXQgZWFjaCByaXNpbmcgb3IgZmFsbGluZyBlZGdlIG9uIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGlucHV0IEVUUiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRU5DT0RFUk1PREUgRW5jb2RlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMSAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDEsIHgyIG1vZGUgLSBDb3VudGVyIGNvdW50cyB1cC9kb3duIG9uIFRJMUZQMSBlZGdlIGRlcGVuZGluZyBvbiBUSTJGUDIgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMiAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDIsIHgyIG1vZGUgLSBDb3VudGVyIGNvdW50cyB1cC9kb3duIG9uIFRJMkZQMiBlZGdlIGRlcGVuZGluZyBvbiBUSTFGUDEgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTIgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18xIHwgVElNX1NNQ1JfU01TXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFF1YWRyYXR1cmUgZW5jb2RlciBtb2RlIDMsIHg0IG1vZGUgLSBDb3VudGVyIGNvdW50cyB1cC9kb3duIG9uIGJvdGggVEkxRlAxIGFuZCBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiB0aGUgb3RoZXIgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RSR08gVHJpZ2dlciBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVFJHT19SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVHIGJpdCBmcm9tIHRoZSBUSU14X0VHUiByZWdpc3RlciBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBFbmFibGUgc2lnbmFsIChDTlRfRU4pIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fVVBEQVRFICAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19DQzFJRiAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAvKiE8IENDMSBjYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DMVJFRiAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DMlJFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMCkgICAgICAgICAgICAgICAgIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DM1JFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSkgICAgICAgICAgICAgICAgIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX09DNFJFRiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUkdPMiBUcmlnZ2VyIE91dHB1dCAyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX1JFU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVHIGJpdCBmcm9tIHRoZSBUSU14X0VHUiByZWdpc3RlciBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVMyXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX1VQREFURSAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVMyXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX0NDMUYgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENDMSBjYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMSAgICAgICAgICAgICAgICAgICAgICAgVElNX0NSMl9NTVMyXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzIgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0MzICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MzUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNCAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzUgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzVSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M2ICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M2UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HICAgICAgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DNFJFRiByaXNpbmcgb3IgZmFsbGluZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzZfUklTSU5HRkFMTElORyAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzZSRUYgcmlzaW5nIG9yIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR19PQzZfUklTSU5HICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR19PQzZfRkFMTElORyAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M0UkVGIHJpc2luZyBvciBPQzZSRUYgZmFsbGluZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9SSVNJTkcgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHxUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9GQUxMSU5HICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzVSRUYgcmlzaW5nIG9yIE9DNlJFRiBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1NMQVZFTU9ERSBTbGF2ZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTbGF2ZSBtb2RlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1NNU18yICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXQgTW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IChUUkdJKSByZWluaXRpYWxpemVzIHRoZSBjb3VudGVyICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfR0FURUQgICAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMiB8IFRJTV9TTUNSX1NNU18wKSAgIC8qITwgR2F0ZWQgTW9kZSAtIFRoZSBjb3VudGVyIGNsb2NrIGlzIGVuYWJsZWQgd2hlbiB0aGUgdHJpZ2dlciBpbnB1dCAoVFJHSSkgaXMgaGlnaCAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX1RSSUdHRVIgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgICAvKiE8IFRyaWdnZXIgTW9kZSAtIFRoZSBjb3VudGVyIHN0YXJ0cyBhdCBhIHJpc2luZyBlZGdlIG9mIHRoZSB0cmlnZ2VyIFRSR0kgKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIgVElNX1NNQ1JfU01TXzMgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21iaW5lZCByZXNldCArIHRyaWdnZXIgbW9kZSAtIFJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IChUUkdJKSAgcmVpbml0aWFsaXplcyB0aGUgY291bnRlciwgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBzdGFydHMgdGhlIGNvdW50ZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RTIFRyaWdnZXIgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAwIChJVFIwKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjEgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfVFNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAxIChJVFIxKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjIgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfVFNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAyIChJVFIyKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0lUUjMgICAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAzIChJVFIzKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMUZfRUQgICAgICAgICAgICAgICAgICAgICAgVElNX1NNQ1JfVFNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVEkxIEVkZ2UgRGV0ZWN0b3IgKFRJMUZfRUQpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfVEkxRlAxICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxIChUSTFGUDEpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfVEkyRlAyICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyIChUSTEyUDIpIGlzIHVzZWQgYXMgdHJpZ2dlciBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fVFNfRVRSRiAgICAgICAgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfVFNfMiB8IFRJTV9TTUNSX1RTXzEgfCBUSU1fU01DUl9UU18wKSAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBleHRlcm5hbCBUcmlnZ2VyIChFVFJGKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9QT0xBUklUWSBFeHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBFVFIgaXMgbm9uLWludmVydGVkLCBhY3RpdmUgYXQgaGlnaCBsZXZlbCBvciByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9USU1fRVRSX1BPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICBUSU1fU01DUl9FVFAgICAgICAgICAgICAvKiE8IEVUUiBpcyBpbnZlcnRlZCwgYWN0aXZlIGF0IGxvdyBsZXZlbCBvciBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUl9QUkVTQ0FMRVIgRXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEVUUiBwcmVzY2FsZXIgT0ZGICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFNfMCAgICAgICAgIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQU18xICAgICAgICAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTICAgICAgICAgICAvKiE8IEVUUiBmcmVxdWVuY3kgaXMgZGl2aWRlZCBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfRklMVEVSIEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGZpbHRlciwgc2FtcGxpbmcgaXMgZG9uZSBhdCBmRFRTICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX04yICAgICAgICAgICAgIFRJTV9TTUNSX0VURl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX040ICAgICAgICAgICAgIFRJTV9TTUNSX0VURl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX044ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMSB8IFRJTV9TTUNSX0VURl8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX042ICAgICAgICAgICAgIFRJTV9TTUNSX0VURl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjggICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9ONiAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X044ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8xIHwgVElNX1NNQ1JfRVRGXzApICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjYgICAgICAgICAgICAgVElNX1NNQ1JfRVRGXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjUgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjYgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMSB8IFRJTV9TTUNSX0VURl8wKSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMikgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjUgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8wKSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjYgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzMgfCBUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8xKSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMzJfTjggICAgICAgICAgICBUSU1fU01DUl9FVEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRVRSU09VUkNFIEV4dGVybmFsIFRyaWdnZXIgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9HUElPICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9DT01QMSAgICAgICAgICAgICAgICAgVElNMV9BRjFfRVRSU0VMXzAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9DT01QMiAgICAgICAgICAgICAgICAgVElNMV9BRjFfRVRSU0VMXzEgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworI2RlZmluZSBMTF9USU1fRVRSU09VUkNFX0FEQzFfQVdEMSAgICAgICAgICAgICAoVElNMV9BRjFfRVRSU0VMXzEgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEFEQzEgYW5hbG9nIHdhdGNoZG9nIDEgKi8KKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9BREMxX0FXRDIgICAgICAgICAgICAgVElNMV9BRjFfRVRSU0VMXzIgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBBREMxIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX1RJTV9FVFJTT1VSQ0VfQURDMV9BV0QzICAgICAgICAgICAgIChUSU0xX0FGMV9FVFJTRUxfMiB8IFRJTTFfQUYxX0VUUlNFTF8wKSAvKiE8IEVUUiBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQURDMSBhbmFsb2cgd2F0Y2hkb2cgMyAqLworI2RlZmluZSBMTF9USU1fRVRSU09VUkNFX0xTRSAgICAgICAgICAgICAgICAgICAoVElNMV9BRjFfRVRSU0VMXzEgfCBUSU0xX0FGMV9FVFJTRUxfMCkgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIExTRSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfUE9MQVJJVFkgYnJlYWsgcG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgVElNX0JEVFJfQktQICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBhY3RpdmUgaGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRklMVEVSIGJyZWFrIGZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjEgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBObyBmaWx0ZXIsIEJSSyBhY3RzIGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjIgICAgICAgICAgIDB4MDAwMTAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjQgICAgICAgICAgIDB4MDAwMjAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjggICAgICAgICAgIDB4MDAwMzAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYgICAgICAgICAgIDB4MDAwNDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9OOCAgICAgICAgICAgMHgwMDA1MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042ICAgICAgICAgICAweDAwMDYwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjggICAgICAgICAgIDB4MDAwNzAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9ONiAgICAgICAgICAgMHgwMDA4MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044ICAgICAgICAgICAweDAwMDkwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041ICAgICAgICAgIDB4MDAwQTAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X042ICAgICAgICAgIDB4MDAwQjAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X044ICAgICAgICAgIDB4MDAwQzAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041ICAgICAgICAgIDB4MDAwRDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX042ICAgICAgICAgIDB4MDAwRTAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX044ICAgICAgICAgIDB4MDAwRjAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBSzJfUE9MQVJJVFkgQlJFQUsyIFBPTEFSSVRZCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1cgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdIICAgICAgICAgICAgVElNX0JEVFJfQksyUCAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBSzJfRklMVEVSIEJSRUFLMiBGSUxURVIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgTm8gZmlsdGVyLCBCUksgYWN0cyBhc3luY2hyb25vdXNseSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAweDAwMTAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9ONCAgICAgICAgICAweDAwMjAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49NCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAweDAwMzAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAweDAwNDAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX044ICAgICAgICAgIDB4MDA1MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjYgICAgICAgICAgMHgwMDYwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAweDAwNzAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X042ICAgICAgICAgIDB4MDA4MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjggICAgICAgICAgMHgwMDkwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjUgICAgICAgICAweDAwQTAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYgICAgICAgICAweDAwQjAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAweDAwQzAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjUgICAgICAgICAweDAwRDAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYgICAgICAgICAweDAwRTAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjggICAgICAgICAweDAwRjAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49OCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT1NTSSBPU1NJCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09TU0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQ3gvT0N4TiBvdXRwdXRzIGFyZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fT1NTSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9PU1NJICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE94Qy9PQ3hOIG91dHB1dHMgYXJlIGZpcnN0IGZvcmNlZCB3aXRoIHRoZWlyIGluYWN0aXZlIGxldmVsIHRoZW4gZm9yY2VkIHRvIHRoZWlyIGlkbGUgbGV2ZWwgYWZ0ZXIgdGhlIGRlYWR0aW1lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PU1NSIE9TU1IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT1NTUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DeC9PQ3hOIG91dHB1dHMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9PU1NSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX09TU1IgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGVuYWJsZWQgd2l0aCB0aGVpciBpbmFjdGl2ZSBsZXZlbCBhcyBzb29uIGFzIENDeEU9MSBvciBDQ3hORT0xICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19JTlBVVCBCUkVBSyBJTlBVVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IFRJTXhfQktJTiBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjIgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBUSU14X0JLSU4yIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CS0lOX1NPVVJDRSBCS0lOIFNPVVJDRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOICAgICAgICAgICAgICAgIFRJTTFfQUYxX0JLSU5FICAgICAgLyohPCBCS0lOIGlucHV0IGZyb20gQUYgY29udHJvbGxlciAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAxICAgICAgICAgICAgIFRJTTFfQUYxX0JLQ01QMUUgICAgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAxIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMiAgICAgICAgICAgICBUSU0xX0FGMV9CS0NNUDJFICAgIC8qITwgaW50ZXJuYWwgc2lnbmFsOiBDT01QMiBvdXRwdXQgKi8KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQktJTl9QT0xBUklUWSBCS0lOIFBPTEFSSVRZCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JLSU5fUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgVElNMV9BRjFfQktJTlAgICAgICAgICAgLyohPCBCUksgQktJTiBpbnB1dCBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEJSSyBCS0lOIGlucHV0IGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19BRk1PREUgQlJFQUsgQUYgTU9ERQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19BRk1PREVfSU5QVVQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpbiBpbnB1dCBtb2RlICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19BRk1PREVfQklESVJFQ1RJT05BTCAgICAgIFRJTV9CRFRSX0JLQklEICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpbiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKyAgLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0FGTU9ERSBCUkVBSzIgQUYgTU9ERQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfQUZNT0RFX0lOUFVUICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQnJlYWsyIGlucHV0IEJSSzIgaW4gaW5wdXQgbW9kZSAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMICAgICBUSU1fQkRUUl9CSzJCSUQgICAgICAgICAvKiE8IEJyZWFrMiBpbnB1dCBCUksyIGluIGJpZGlyZWN0aW9uYWwgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfQkFTRUFERFIgRE1BIEJ1cnN0IEJhc2UgQWRkcmVzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NSMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjIgICAgICAgICAgIFRJTV9EQ1JfREJBXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NSMiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TTUNSICAgICAgICAgIFRJTV9EQ1JfREJBXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1NNQ1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUiAgICAgICAgICAoVElNX0RDUl9EQkFfMSB8ICBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9ESUVSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NSICAgICAgICAgICAgVElNX0RDUl9EQkFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfU1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRUdSICAgICAgICAgICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9FR1IgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEgICAgICAgICAoVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ01SMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMiAgICAgICAgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDRVIgICAgICAgICAgVElNX0RDUl9EQkFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NFUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NOVCByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9QU0MgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1BTQyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9BUlIgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IgICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X1JDUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IxICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMiAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ1IyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSB8IFRJTV9EQ1JfREJBXzApICAvKiE8IFRJTXhfQ0NSMyByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I0ICAgICAgICAgIFRJTV9EQ1JfREJBXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjQgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQkRUUiAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9CRFRSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX09SMSAgICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X09SMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMyAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIzIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjUgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSNSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I2ICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAgLyohPCBUSU14X0NDUjYgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYxICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9BRjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYyICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9BRjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfVElTRUwgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9USVNFTCByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19ETUFCVVJTVF9MRU5HVEggRE1BIEJ1cnN0IExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMVRSQU5TRkVSICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMSByZWdpc3RlciBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMlRSQU5TRkVSUyAgICAgIFRJTV9EQ1JfREJMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzNUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF80VFJBTlNGRVJTICAgICAgKFRJTV9EQ1JfREJMXzEgfCAgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNVRSQU5TRkVSUyAgICAgIFRJTV9EQ1JfREJMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzZUUkFOU0ZFUlMgICAgICAoVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF83VFJBTlNGRVJTICAgICAgKFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfOFRSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSB8IFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzlUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDkgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMFRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzExVFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDExIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTJUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMSB8IFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xM1RSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE0VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE0IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTVUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEpICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNlRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSB8IFRJTV9EQ1JfREJMXzApIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNiByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE3VFJBTlNGRVJTICAgICBUSU1fRENSX0RCTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMThUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF80IHwgIFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTggcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTFfVEkxX1JNUCAgVElNMSBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMV9USTFfUk1QX0dQSU8gICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QMSkKKyNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMSAgVElNX1RJU0VMX1RJMVNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTEgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTFfVEkyX1JNUCAgVElNMSBUaW1lciBJbnB1dCBDaDIgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMV9USTJfUk1QX0dQSU8gICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgTExfVElNX1RJTTFfVEkyX1JNUF9DT01QMiAgVElNX1RJU0VMX1RJMlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTEgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFRJTTIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX1RJMV9STVAgIFRJTTIgVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEkxX1JNUF9HUElPICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTFfUk1QX0NPTVAxICBUSU1fVElTRUxfVEkxU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBDT01QMV9PVVQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfVEkyX1JNUCAgVElNMiBUaW1lciBJbnB1dCBDaDIgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTJfUk1QX0dQSU8gICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDIgIFRJTV9USVNFTF9USTJTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0zX1RJMV9STVAgIFRJTTMgVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVEkxX1JNUF9HUElPICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTMgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2lmIGRlZmluZWQoQ09NUDEpCisjZGVmaW5lIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDEgIFRJTV9USVNFTF9USTFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zIGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0zX1RJMl9STVAgIFRJTTMgVGltZXIgSW5wdXQgQ2gyIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTNfVEkyX1JNUF9HUElPICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTMgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2lmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDIgIFRJTV9USVNFTF9USTJTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0zIGlucHV0IDIgaXMgY29ubmVjdGVkIHRvIENPTVAyX09VVCAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xNF9USTFfUk1QICBUSU0xNCBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMTRfVEkxX1JNUF9HUElPICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMTRfVEkxX1JNUF9SVENfQ0xLICBUSU1fVElTRUxfVEkxU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gUlRDIGNsb2NrICovCisjZGVmaW5lIExMX1RJTV9USU0xNF9USTFfUk1QX0hTRV8zMiAgIFRJTV9USVNFTF9USTFTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNF9USTEgaXMgY29ubmVjdGVkIHRvIEhTRS8zMiBjbG9jayAqLworI2RlZmluZSBMTF9USU1fVElNMTRfVEkxX1JNUF9NQ08gICAgICAoVElNX1RJU0VMX1RJMVNFTF8wICB8IFRJTV9USVNFTF9USTFTRUxfMSkgICAgIC8qITwgVElNMTQgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTUNPICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xNV9USTFfUk1QICBUSU0xNSBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTFfUk1QX0dQSU8gICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBMTF9USU1fVElNMTVfVEkxX1JNUF9USU0yX0lDMSBUSU1fVElTRUxfVEkxU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTUgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCAxICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTMpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTFfUk1QX1RJTTNfSUMxIFRJTV9USVNFTF9USTFTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNSBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IDEgKi8KKyNlbmRpZgorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xNV9USTJfUk1QICBUSU0xNSBUaW1lciBJbnB1dCBDaDIgUmVtYXAKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoVElNMTUpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX0dQSU8gICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjaWYgZGVmaW5lZChUSU0yKQorI2RlZmluZSBMTF9USU1fVElNMTVfVEkyX1JNUF9USU0yX0lDMiBUSU1fVElTRUxfVEkyU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTUgaW5wdXQgMiBpcyBjb25uZWN0ZWQgdG8gVElNMiBpbnB1dCAyICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTMpCisjZGVmaW5lIExMX1RJTV9USU0xNV9USTJfUk1QX1RJTTNfSUMyIFRJTV9USVNFTF9USTFTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNSBpbnB1dCAyIGlzIGNvbm5lY3RlZCB0byBUSU0zIGlucHV0IDIgKi8KKyNlbmRpZgorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xNl9USTFfUk1QICBUSU0xNiBUaW1lciBJbnB1dCBDaDEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9HUElPICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9MU0kgICAgIFRJTV9USVNFTF9USTFTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTYgaW5wdXQgMSBpcyBjb25uZWN0ZWQgdG8gTFNJICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX0xTRSAgICAgVElNX1RJU0VMX1RJMVNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNiBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfUlRDX1dLICAoVElNX1RJU0VMX1RJMVNFTF8wIHwgVElNX1RJU0VMX1RJMVNFTF8xKSAgICAgICAvKiE8IFRJTTE2IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIFJUQ19XQUtFVVAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTE3X1RJMV9STVAgIFRJTTE3IFRpbWVyIElucHV0IENoMSBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX0dQSU8gICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX0hTRV8zMiAgVElNX1RJU0VMX1RJMVNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNyBpbnB1dCAxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzIgY2xvY2sgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfTUNPICAgIChUSU1fVElTRUxfVEkxU0VMXzAgfCBUSU1fVElTRUxfVEkxU0VMXzEpICAgICAgICAvKiE8IFRJTTE3IGlucHV0IDEgaXMgY29ubmVjdGVkIHRvIE1DTyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NSRUZfQ0xSX0lOVCBPQ1JFRiBjbGVhciBpbnB1dCBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFIgICAgICAgICBPQ1JFRl9DTEVBUl9TRUxFQ1RfTXNrICAgICAgIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gRVRSRiAqLworI2lmIGRlZmluZWQoQ09NUDEpICYmIGRlZmluZWQoQ09NUDIpCisjZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAxICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPCBPQ1JFRiBjbGVhciBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDFfT1VUICovCisjZGVmaW5lIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAyICAgICAgIFRJTTFfT1IxX09DUkVGX0NMUiAgICAgICAgICAgLyohPCBPQ1JFRiBjbGVhciBpbnB1dCBpcyBjb25uZWN0ZWQgdG8gQ09NUDJfT1VUICovCisjZW5kaWYgLyogQ09NUDEgJiBDT01QMiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIExlZ2FjeSBkZWZpbml0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlCitAY29uZCAwCisqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfREZCSyAgTExfVElNX0JLSU5fU09VUkNFX0RGMUJLCisvKioKK0BlbmRjb25kCisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBUSU0gcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9USU1fV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFRJTSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBUSU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfVElNX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX0V4cG9ydGVkX01hY3JvcyBFeHBvcnRlZF9NYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXRyaWV2aW5nIHRoZSBVSUZDUFkgZmxhZyBmcm9tIHRoZSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZIChAcmVmIExMX1RJTV9HZXRDb3VudGVyICgpKTsKKyAgKiBAbm90ZSAgUmVsZXZhbnQgb25seSBpZiBVSUYgZmxhZyByZW1hcHBpbmcgaGFzIGJlZW4gZW5hYmxlZCAgKFVJRiBzdGF0dXMgYml0IGlzIGNvcGllZAorICAqICAgICAgICB0byBUSU14X0NOVCByZWdpc3RlciBiaXQgMzEpCisgICogQHBhcmFtICBfX0NOVF9fIENvdW50ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIFVJRiBzdGF0dXMgYml0CisgICovCisjZGVmaW5lIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZKF9fQ05UX18pICBcCisgICAoUkVBRF9CSVQoKF9fQ05UX18pLCBUSU1fQ05UX1VJRkNQWSkgPj4gVElNX0NOVF9VSUZDUFlfUG9zKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyBEVEdbMDo3XSBpbiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyIHRvIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBkZWFkIHRpbWUgZHVyYXRpb24uCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSAoODAwMDAwMDAsIEByZWYgTExfVElNX0dldENsb2NrRGl2aXNpb24gKCksIDEyMCk7CisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBfX0NLRF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICogQHBhcmFtICBfX0RUX18gZGVhZHRpbWUgZHVyYXRpb24gKGluIG5zKQorICAqIEByZXR2YWwgRFRHWzA6N10KKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUFEVElNRShfX1RJTUNMS19fLCBfX0NLRF9fLCBfX0RUX18pICBcCisgICAgKCAoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKSA8ICgoRFRfREVMQVlfMSsxVSkgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgICAgICAgID8gKHVpbnQ4X3QpKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSAvIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpICAmIERUX0RFTEFZXzEpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKCg2NFUgKyAoRFRfREVMQVlfMisxVSkpICogMlUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgID8gKHVpbnQ4X3QpKERUX1JBTkdFXzIgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gMVUpIC0gKHVpbnQ4X3QpIDY0KSAmIERUX0RFTEFZXzIpKSA6XAorICAgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKDMyVSArIChEVF9ERUxBWV8zKzFVKSkgKiA4VSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgPyAodWludDhfdCkoRFRfUkFOR0VfMyB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKCh1aW50NjRfdCkoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiAzVSkgLSAodWludDhfdCkgMzIpICYgRFRfREVMQVlfMykpIDpcCisgICAgICAoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKSA8ICgoMzJVICsgKERUX0RFTEFZXzQrMVUpKSAqIDE2VSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSA/ICh1aW50OF90KShEVF9SQU5HRV80IHwgKCh1aW50OF90KSgodWludDhfdCkoKCgoKHVpbnQ2NF90KShfX0RUX18pKjEwMDBVKSkvIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpID4+IDRVKSAtICh1aW50OF90KSAzMikgJiBEVF9ERUxBWV80KSkgOlwKKyAgICAgICAwVSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIHByZXNjYWxlciB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeS4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX1BTQyAoODAwMDAwMDAsIDEwMDAwMDApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19DTlRDTEtfXyBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHJldHZhbCBQcmVzY2FsZXIgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX1BTQyhfX1RJTUNMS19fLCBfX0NOVENMS19fKSAgIFwKKyAgICgoKF9fVElNQ0xLX18pID49IChfX0NOVENMS19fKSkgPyAodWludDMyX3QpKCgoX19USU1DTEtfXykvKF9fQ05UQ0xLX18pKSAtIDFVKSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgb3V0cHV0IHNpZ25hbCBmcmVxdWVuY3kuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19BUlIgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAwMDApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIF9fRlJFUV9fIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcmV0dmFsICBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfQVJSKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fRlJFUV9fKSBcCisgICAgICgoKChfX1RJTUNMS19fKS8oKF9fUFNDX18pICsgMVUpKSA+PSAoX19GUkVRX18pKSA/ICgoKF9fVElNQ0xLX18pLygoX19GUkVRX18pICogKChfX1BTQ19fKSArIDFVKSkpIC0gMVUpIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBjb21wYXJlIHZhbHVlIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheS4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX0RFTEFZICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksIDEwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAgKiBAcmV0dmFsIENvbXBhcmUgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX0RFTEFZKF9fVElNQ0xLX18sIF9fUFNDX18sIF9fREVMQVlfXykgIFwKKygodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pKSBcCisgICAgICAgICAgLyAoKHVpbnQ2NF90KTEwMDAwMDBVICogKHVpbnQ2NF90KSgoX19QU0NfXykgKyAxVSkpKSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIHB1bHNlIGR1cmF0aW9uICh3aGVuIHRoZSB0aW1lciBvcGVyYXRlcyBpbiBvbmUgcHVsc2UgbW9kZSkuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19QVUxTRSAoMTAwMDAwMCwgQHJlZiBMTF9USU1fR2V0UHJlc2NhbGVyICgpLCAxMCwgMjApOworICAqIEBwYXJhbSAgX19USU1DTEtfXyB0aW1lciBpbnB1dCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBwYXJhbSAgX19QU0NfXyBwcmVzY2FsZXIKKyAgKiBAcGFyYW0gIF9fREVMQVlfXyB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkgKGluIHVzKQorICAqIEBwYXJhbSAgX19QVUxTRV9fIHB1bHNlIGR1cmF0aW9uIChpbiB1cykKKyAgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19QVUxTRShfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18sIF9fUFVMU0VfXykgIFwKKyAoKHVpbnQzMl90KShfX0xMX1RJTV9DQUxDX0RFTEFZKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19QVUxTRV9fKSkgXAorICAgICAgICAgICArIF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX0RFTEFZX18pKSkpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIHJldHJpZXZpbmcgdGhlIHJhdGlvIG9mIHRoZSBpbnB1dCBjYXB0dXJlIHByZXNjYWxlcgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0dFVF9JQ1BTQ19SQVRJTyAoQHJlZiBMTF9USU1fSUNfR2V0UHJlc2NhbGVyICgpKTsKKyAgKiBAcGFyYW0gIF9fSUNQU0NfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY4CisgICogQHJldHZhbCBJbnB1dCBjYXB0dXJlIHByZXNjYWxlciByYXRpbyAoMSwgMiwgNCBvciA4KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9HRVRfSUNQU0NfUkFUSU8oX19JQ1BTQ19fKSAgXAorICAgKCh1aW50MzJfdCkoMHgwMVUgPDwgKCgoX19JQ1BTQ19fKSA+PiAxNlUpID4+IFRJTV9DQ01SMV9JQzFQU0NfUG9zKSkpCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9UaW1lX0Jhc2UgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGltZXIgY291bnRlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDRU4gICAgICAgICAgIExMX1RJTV9FbmFibGVDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRpbWVyIGNvdW50ZXIuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fRGlzYWJsZUNvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0aW1lciBjb3VudGVyIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0VOKSA9PSAoVElNX0NSMV9DRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0VuYWJsZVVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHVwZGF0ZSBldmVudCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEludmVydGVkIHN0YXRlIG9mIGJpdCAoMCBvciAxKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkVXBkYXRlRXZlbnQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VRElTKSA9PSAodWludDMyX3QpUkVTRVQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdXBkYXRlIGV2ZW50IHNvdXJjZQorICAqIEBub3RlIFVwZGF0ZSBldmVudCBzb3VyY2Ugc2V0IHRvIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUjogYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzCisgICogICAgICAgZ2VuZXJhdGUgYW4gdXBkYXRlIGludGVycnVwdCBvciBETUEgcmVxdWVzdCBpZiBlbmFibGVkOgorICAqICAgICAgICAtIENvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93CisgICogICAgICAgIC0gU2V0dGluZyB0aGUgVUcgYml0CisgICogICAgICAgIC0gVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyCisgICogQG5vdGUgVXBkYXRlIGV2ZW50IHNvdXJjZSBzZXQgdG8gTExfVElNX1VQREFURVNPVVJDRV9DT1VOVEVSOiBvbmx5IGNvdW50ZXIKKyAgKiAgICAgICBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVUlMgICAgICAgICAgIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFVwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFVwZGF0ZVNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVXBkYXRlU291cmNlKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgVElNX0NSMV9VUlMsIFVwZGF0ZVNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBldmVudCB1cGRhdGUgc291cmNlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVVJTICAgICAgICAgICBMTF9USU1fR2V0VXBkYXRlU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfUkVHVUxBUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgb25lIHB1bHNlIG1vZGUgKG9uZSBzaG90IHYucy4gcmVwZXRpdGl2ZSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fU2V0T25lUHVsc2VNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPbmVQdWxzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgT25lUHVsc2VNb2RlKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMSwgVElNX0NSMV9PUE0sIE9uZVB1bHNlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBvbmUgcHVsc2UgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBPUE0gICAgICAgICAgIExMX1RJTV9HZXRPbmVQdWxzZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1JFUEVUSVRJVkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0T25lUHVsc2VNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfT1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lciBjb3VudGVyIGNvdW50aW5nIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0bworICAqICAgICAgIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjb3VudGVyIG1vZGUgc2VsZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkCisgICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRElSICAgICAgICAgICBMTF9USU1fU2V0Q291bnRlck1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIENNUyAgICAgICAgICAgTExfVElNX1NldENvdW50ZXJNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb3VudGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENvdW50ZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb3VudGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIChUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSwgQ291bnRlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY291bnRlciBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8KKyAgKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICAqICAgICAgIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRElSICAgICAgICAgICBMTF9USU1fR2V0Q291bnRlck1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIENNUyAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRDb3VudGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRW5hYmxlQVJSUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0FSUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0by1yZWxvYWQgKEFSUikgcHJlbG9hZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBUlBFICAgICAgICAgIExMX1RJTV9EaXNhYmxlQVJSUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0FSUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBUlBFICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBUlJQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEFSUlByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKSA9PSAoVElNX0NSMV9BUlBFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgIGFuZCB0aGUgc2FtcGxpbmcgY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAgKiAgICAgICBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja0RpdmlzaW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja0RpdmlzaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2xvY2tEaXZpc2lvbikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfQ0tELCBDbG9ja0RpdmlzaW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGFjdHVhbCBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAgYW5kIHRoZSBzYW1wbGluZyBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUgZGlnaXRhbCBmaWx0ZXJzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcgorICAqICAgICAgIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENLRCAgICAgICAgICAgTExfVElNX0dldENsb2NrRGl2aXNpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9DS0QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfVElNX1NldENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgQ291bnRlciB2YWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkYgb3IgMHhGRkZGRkZGRikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb3VudGVyKQoreworICBXUklURV9SRUcoVElNeC0+Q05ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfVElNX0dldENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGIG9yIDB4RkZGRkZGRkYpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldENvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNOVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBkaXJlY3Rpb24gb2YgdGhlIGNvdW50ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9HZXREaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJESVJFQ1RJT05fVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldERpcmVjdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0RJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBub3RlIFRoZSBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSBDS19DTlQgaXMgZXF1YWwgdG8gZkNLX1BTQyAvIChQU0NbMTU6MF0gKyAxKS4KKyAgKiBAbm90ZSBUaGUgcHJlc2NhbGVyIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSBmbHkgYXMgdGhpcyBjb250cm9sIHJlZ2lzdGVyIGlzIGJ1ZmZlcmVkLiBUaGUgbmV3CisgICogICAgICAgcHJlc2NhbGVyIHJhdGlvIGlzIHRha2VuIGludG8gYWNjb3VudCBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19QU0MgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBQcmVzY2FsZXIgcGFyYW1ldGVyCisgICogQHJtdG9sbCBQU0MgICAgICAgICAgUFNDICAgICAgICAgICBMTF9USU1fU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBXUklURV9SRUcoVElNeC0+UFNDLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcHJlc2NhbGVyIHZhbHVlLgorICAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgIFByZXNjYWxlciB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+UFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAgKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBIZWxwZXIgbWFjcm8gQHJlZiBfX0xMX1RJTV9DQUxDX0FSUiBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIEF1dG9SZWxvYWQgcGFyYW1ldGVyCisgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9USU1fU2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JlbG9hZCBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0QXV0b1JlbG9hZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQXV0b1JlbG9hZCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkFSUiwgQXV0b1JlbG9hZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KKyAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9HZXRBdXRvUmVsb2FkCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0QXV0b1JlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+QVJSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgRm9yIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcyBSZXBldGl0aW9uQ291bnRlciBjYW4gYmUgdXAgdG8gNjU1MzUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIHJlcGV0aXRpb24gY291bnRlci4KKyAgKiBAcm10b2xsIFJDUiAgICAgICAgICBSRVAgICAgICAgICAgIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVwZXRpdGlvbkNvdW50ZXIgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUmVwZXRpdGlvbkNvdW50ZXIpCit7CisgIFdSSVRFX1JFRyhUSU14LT5SQ1IsIFJlcGV0aXRpb25Db3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgcmVwZXRpdGlvbiBjb3VudGVyLgorICAqIEBybXRvbGwgUkNSICAgICAgICAgIFJFUCAgICAgICAgICAgTExfVElNX0dldFJlcGV0aXRpb25Db3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0UmVwZXRpdGlvbkNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPlJDUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIGEgY29udGludW91cyBjb3B5IG9mIHRoZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgaW50byB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoYml0IDMxKS4KKyAgKiBAbm90ZSBUaGlzIGFsbG93cyBib3RoIHRoZSBjb3VudGVyIHZhbHVlIGFuZCBhIHBvdGVudGlhbCByb2xsLW92ZXIgY29uZGl0aW9uIHNpZ25hbGxlZCBieSB0aGUgVUlGQ1BZIGZsYWcgdG8gYmUgcmVhZCBpbiBhbiBhdG9taWMgd2F5LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVJRlJFTUFQICAgICAgTExfVElNX0VuYWJsZVVJRlJlbWFwCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlVUlGUmVtYXAoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VJRlJFTUFQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSByZW1hcHBpbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUlGUkVNQVAgICAgICBMTF9USU1fRGlzYWJsZVVJRlJlbWFwCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZVVJRlJlbWFwKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VJRlJFTUFQKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfQ2FwdHVyZV9Db21wYXJlIENhcHR1cmUgQ29tcGFyZSBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlICB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwgQ0N4TkUgYW5kIE9DeE0pIHByZWxvYWQuCisgICogQG5vdGUgQ0N4RSwgQ0N4TkUgYW5kIE9DeE0gYml0cyBhcmUgcHJlbG9hZGVkLCBhZnRlciBoYXZpbmcgYmVlbiB3cml0dGVuLAorICAqICAgICAgIHRoZXkgYXJlIHVwZGF0ZWQgb25seSB3aGVuIGEgY29tbXV0YXRpb24gZXZlbnQgKENPTSkgb2NjdXJzLgorICAqIEBub3RlIE9ubHkgb24gY2hhbm5lbHMgdGhhdCBoYXZlIGEgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFibGUgdG8gZ2VuZXJhdGUgYSBjb21tdXRhdGlvbiBldmVudC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1BDICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRW5hYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgdGhlIGNhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgKENDeEUsIENDeE5FIGFuZCBPQ3hNKSBwcmVsb2FkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NQQyAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19EaXNhYmxlUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9DQ1BDKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHVwZGF0ZWQgc291cmNlIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFibGUgdG8gZ2VuZXJhdGUgYSBjb21tdXRhdGlvbiBldmVudC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1VTICAgICAgICAgIExMX1RJTV9DQ19TZXRVcGRhdGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENDVXBkYXRlU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfT05MWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ1VQREFURVNPVVJDRV9DT01HX0FORF9UUkdJCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfU2V0VXBkYXRlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDQ1VwZGF0ZVNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfQ0NVUywgQ0NVcGRhdGVTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdHJpZ2dlciBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIERNQSByZXF1ZXN0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDRFMgICAgICAgICAgTExfVElNX0NDX1NldERNQVJlcVRyaWdnZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERNQVJlcVRyaWdnZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX0NDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9VUERBVEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19TZXRETUFSZXFUcmlnZ2VyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBETUFSZXFUcmlnZ2VyKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9DQ0RTLCBETUFSZXFUcmlnZ2VyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIHRyaWdnZXIgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSBETUEgcmVxdWVzdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ0RTICAgICAgICAgIExMX1RJTV9DQ19HZXRETUFSZXFUcmlnZ2VyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfQ0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX1VQREFURQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9DQ19HZXRETUFSZXFUcmlnZ2VyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgbG9jayBsZXZlbCB0byBmcmVlemUgdGhlCisgICogICAgICAgICBjb25maWd1cmF0aW9uIG9mIHNldmVyYWwgY2FwdHVyZS9jb21wYXJlIHBhcmFtZXRlcnMuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICB0aGUgbG9jayBtZWNoYW5pc20gaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgTE9DSyAgICAgICAgICBMTF9USU1fQ0NfU2V0TG9ja0xldmVsCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBMb2NrTGV2ZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMX09GRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9MT0NLTEVWRUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9MT0NLTEVWRUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9MT0NLTEVWRUxfMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldExvY2tMZXZlbChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgTG9ja0xldmVsKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0xPQ0ssIExvY2tMZXZlbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSBjaGFubmVscy4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNORSAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19FbmFibGVDaGFubmVsCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVscyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVscykKK3sKKyAgU0VUX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgY2hhbm5lbHMuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNORSAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNUUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWxzKQoreworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgQ2hhbm5lbHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgY2hhbm5lbChzKSBpcyhhcmUpIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTkUgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzRSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2RSAgICAgICAgICBMTF9USU1fQ0NfSXNFbmFibGVkQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWxzKQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DQ0VSLCBDaGFubmVscykgPT0gKENoYW5uZWxzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9PdXRwdXRfQ2hhbm5lbCBPdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzNTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgQ0M1UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBDQzZTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzZQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzEgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzQgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVM2ICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9ISUdIIG9yIEByZWYgTExfVElNX09DUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0xPVyBvciBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfQ29uZmlnT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBDb25maWd1cmF0aW9uKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfQ0MxUyA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgIChDb25maWd1cmF0aW9uICYgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIChUSU1fQ1IyX09JUzEgPDwgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIFRJTV9DUjJfT0lTMSkgPDwgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBEZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBvdXRwdXQgcmVmZXJlbmNlIHNpZ25hbCBPQ3hSRUYgZnJvbSB3aGljaAorICAqICAgICAgICAgT0N4IGFuZCBPQ3hOICh3aGVuIHJlbGV2YW50KSBhcmUgZGVyaXZlZC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZNICAgICAgICAgIExMX1RJTV9PQ19TZXRNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GUk9aRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1RPR0dMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0TW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTW9kZSkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfT0MxTSAgfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSwgIE1vZGUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIG91dHB1dCBjb21wYXJlIG1vZGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzTSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2TSAgICAgICAgICBMTF9USU1fT0NfR2V0TW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZST1pFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfVE9HR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1BXTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0TW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuIChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfT0MxTSAgfCBUSU1fQ0NNUjFfQ0MxUykgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2UCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLCAgUG9sYXJpdHkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2UCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmV0dXJuIChSRUFEX0JJVChUSU14LT5DQ0VSLCAoVElNX0NDRVJfQ0MxUCA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgSURMRSBzdGF0ZSBvZiBhbiBvdXRwdXQgY2hhbm5lbAorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmlmaWNhbnQgb25seSBmb3IgdGhlIHRpbWVyIGluc3RhbmNlcworICAqICAgICAgIHN1cHBvcnRpbmcgdGhlIGJyZWFrIGZlYXR1cmUuIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpCisgICogICAgICAgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcworICAqICAgICAgIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICBPSVMxICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzIgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyTiAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzNOICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM0ICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzYgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBwYXJhbSAgSWRsZVN0YXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0SWRsZVN0YXRlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBJZGxlU3RhdGUpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksICBJZGxlU3RhdGUgPDwgU0hJRlRfVEFCX09JU3hbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIElETEUgc3RhdGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwKKyAgKiBAcm10b2xsIENSMiAgICAgICAgIE9JUzEgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyTiAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMiAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzJOICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMzICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTM04gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzQgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM1ICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRJZGxlU3RhdGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGZhc3QgbW9kZSBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBub3RlIEFjdHMgb25seSBpZiB0aGUgY2hhbm5lbCBpcyBjb25maWd1cmVkIGluIFBXTTEgb3IgUFdNMiBtb2RlLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3QKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUZFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworCit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYXN0IG1vZGUgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZUZhc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIGZhc3QgbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZWdpc3RlciB1aW50MzJfdCBiaXRmaWVsZCA9IFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF07CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCBiaXRmaWVsZCkgPT0gYml0ZmllbGQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxUEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMlBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNVBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIFNFVF9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUngpIHByZWxvYWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMlBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNVBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFQRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBjb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUngpIHByZWxvYWQgaXMgZW5hYmxlZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gT3V0cHV0IGNvbXBhcmUgYW5kIFBXTSBtb2Rlcy4gSXQgZG9lcyBub3Qgd29yayBpbiBGb3JjZWQgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlQ2xlYXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIFNFVF9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzQ0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2Q0UgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVDbGVhcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVDbGVhcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUNFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQgaXMgZW5hYmxlZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuIEl0IGRvZXMgbm90IHdvcmsgaW4gRm9yY2VkIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxQ0UgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBkZWFkLXRpbWUgZGVsYXkgKGRlbGF5IGluc2VydGVkIGJldHdlZW4gdGhlIHJpc2luZyBlZGdlIG9mIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgdGhlIE9jeCBhbmQgT0N4TiBzaWduYWxzKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGRlYWQtdGltZSBpbnNlcnRpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSBIZWxwZXIgbWFjcm8gQHJlZiBfX0xMX1RJTV9DQUxDX0RFQURUSU1FIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgRGVhZFRpbWUgcGFyYW1ldGVyCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgRFRHICAgICAgICAgICBMTF9USU1fT0NfU2V0RGVhZFRpbWUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIERlYWRUaW1lIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0RGVhZFRpbWUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IERlYWRUaW1lKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0RURywgRGVhZFRpbWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAxIChUSU14X0NDUjEpLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAxIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMSAgICAgICAgIENDUjEgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBXUklURV9SRUcoVElNeC0+Q0NSMSwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMiAoVElNeF9DQ1IyKS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjIgICAgICAgICBDQ1IyICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjIsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDMgKFRJTXhfQ0NSMykuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBXUklURV9SRUcoVElNeC0+Q0NSMywgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNCAoVElNeF9DQ1I0KS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjQsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDUgKFRJTXhfQ0NSNSkuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjUsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDYgKFRJTXhfQ0NSNikuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNiBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjYgICAgICAgICBDQ1I2ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g2CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDYoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjYsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IyKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjMpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDMuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDMgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IzICAgICAgICAgQ0NSMyAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNCkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNC4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I1KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA1LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I1KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNikgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzZfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA2IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNINihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBvbiB3aGljaCByZWZlcmVuY2Ugc2lnbmFsIHRoZSBPQzVSRUYgaXMgY29tYmluZWQgdG8uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NQklORUQzUEhBU0VQV01fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBjb21iaW5lZCAzLXBoYXNlIFBXTSBtb2RlLgorICAqIEBybXRvbGwgQ0NSNSAgICAgICAgIEdDNUMzICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMiAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVsc1xuCisgICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzEgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEdyb3VwQ0g1IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfT0MxUkVGQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9PQzJSRUZDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X09DM1JFRkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBHcm91cENINSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ1I1LCBUSU1fQ0NSNV9DQ1I1LCBHcm91cENINSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0lucHV0X0NoYW5uZWwgSW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGlucHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgQ0MxUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMkYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0M0UyAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19Db25maWcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIENvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkgb3IgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSBvciBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMSBvciAuLi4gb3IgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEgb3IgLi4uIG9yIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HIG9yIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcgb3IgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19Db25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKChDb25maWd1cmF0aW9uID4+IDE2VSkgJiAoVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0NDMVMpKSAgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLCAoKFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MxUCkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYWN0aXZlIGlucHV0LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ0FjdGl2ZUlucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDQWN0aXZlSW5wdXQpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksIChJQ0FjdGl2ZUlucHV0ID4+IDE2VSkgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIGlucHV0LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBDQzJTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX1RSQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkgPDwgMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHByZXNjYWxlciBvZiBpbnB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMVBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNFBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgSUNQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSUNQcmVzY2FsZXIpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX0lDMVBTQykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwgKElDUHJlc2NhbGVyID4+IDE2VSkgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgcHJlc2NhbGVyIHZhbHVlIGFjdGluZyBvbiBhbiAgaW5wdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UHJlc2NhbGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgKChUSU1fQ0NNUjFfSUMxUFNDKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pIDw8IDE2VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBpbnB1dCBmaWx0ZXIgZHVyYXRpb24uCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM0YgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0RiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDRmlsdGVyKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFGKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLCAoSUNGaWx0ZXIgPj4gMTZVKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgaW5wdXQgZmlsdGVyIGR1cmF0aW9uLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldEZpbHRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMUYpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSkgPDwgMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgcG9sYXJpdHkuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM1AgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0UCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNE5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBJQ1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDUG9sYXJpdHkpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSksCisgICAgICAgICAgICAgSUNQb2xhcml0eSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY3VycmVudCBpbnB1dCBjaGFubmVsIHBvbGFyaXR5LgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSkpID4+CisgICAgICAgICAgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIFhPUiBpbnB1dC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19FbmFibGVYT1JDb21iaW5hdGlvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0VuYWJsZVhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNjb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgZnJvbSB0aGUgVEkxIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0Rpc2FibGVYT1JDb21iaW5hdGlvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX0Rpc2FibGVYT1JDb21iaW5hdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMiwgVElNX0NSMl9USTFTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgYXJlIGNvbm5lY3RlY3RlZCB0byB0aGUgVEkxIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfVEkxUykgPT0gKFRJTV9DUjJfVEkxUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gxKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDIuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAzLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgaW5wdXQgY2hhbm5lbCAzIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgNC4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgNCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjQgICAgICAgICBDQ1I0ICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0g0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0g0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I0KSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0Nsb2NrX1NlbGVjdGlvbiBDb3VudGVyIGNsb2NrIHNlbGVjdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBleHRlcm5hbCBjbG9jayBtb2RlIDIuCisgICogQG5vdGUgV2hlbiBleHRlcm5hbCBjbG9jayBtb2RlIDIgaXMgZW5hYmxlZCB0aGUgY291bnRlciBpcyBjbG9ja2VkIGJ5IGFueSBhY3RpdmUgZWRnZSBvbiB0aGUgRVRSRiBzaWduYWwuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0VuYWJsZUV4dGVybmFsQ2xvY2sKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX0VDRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBleHRlcm5hbCBjbG9jayBtb2RlIDIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGlzIGVuYWJsZWQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2sKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRXh0ZXJuYWxDbG9jayhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKSA9PSAoVElNX1NNQ1JfRUNFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2xvY2sgc291cmNlIG9mIHRoZSBjb3VudGVyIGNsb2NrLgorICAqIEBub3RlIHdoZW4gc2VsZWN0ZWQgY2xvY2sgc291cmNlIGlzIGV4dGVybmFsIGNsb2NrIG1vZGUgMSwgdGhlIHRpbWVyIGlucHV0CisgICogICAgICAgdGhlIGV4dGVybmFsIGNsb2NrIGlzIGFwcGxpZWQgaXMgc2VsZWN0ZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBMTF9USU1fU2V0VHJpZ2dlcklucHV0KCkKKyAgKiAgICAgICBmdW5jdGlvbi4gVGhpcyB0aW1lciBpbnB1dCBtdXN0IGJlIGNvbmZpZ3VyZWQgYnkgY2FsbGluZworICAqICAgICAgIHRoZSBAcmVmIExMX1RJTV9JQ19Db25maWcoKSBmdW5jdGlvbi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTEuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNUyAgICAgICAgICAgTExfVElNX1NldENsb2NrU291cmNlXG4KKyAgKiAgICAgICAgIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tTT1VSQ0VfRVhUX01PREUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENsb2NrU291cmNlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDbG9ja1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UsIENsb2NrU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGVuY29kZXIgaW50ZXJmYWNlIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIHRoZSBlbmNvZGVyIG1vZGUuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0RW5jb2Rlck1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVuY29kZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVuY29kZXJNb2RlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBFbmNvZGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9TTVMsIEVuY29kZXJNb2RlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfVGltZXJfU3luY2hyb25pemF0aW9uIFRpbWVyIHN5bmNocm9uaXNhdGlvbiBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykgdXNlZCBmb3IgdGltZXIgc3luY2hyb25pemF0aW9uIC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgbWFzdGVyIHRpbWVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUyAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVyU3luY2hyb25pemF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19VUERBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19DQzFJRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DMVJFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DMlJFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DM1JFRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX09DNFJFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFRyaWdnZXJPdXRwdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRpbWVyU3luY2hyb25pemF0aW9uKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9NTVMsIFRpbWVyU3luY2hyb25pemF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb3V0cHV0IDIgKFRSR08yKSB1c2VkIGZvciBBREMgc3luY2hyb25pemF0aW9uIC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9UUkdPMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yIEFEQyBzeW5jaHJvbml6YXRpb24uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTU1TMiAgICAgICAgICBMTF9USU1fU2V0VHJpZ2dlck91dHB1dDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFEQ1N5bmNocm9uaXphdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfVVBEQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX0NDMUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0MxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M2X1JJU0lOR0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M0X1JJU0lOR19PQzZfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0MihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQURDU3luY2hyb25pemF0aW9uKQoreworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9NTVMyLCBBRENTeW5jaHJvbml6YXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgb2YgYSBzbGF2ZSB0aW1lci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNsYXZlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfRElTQUJMRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9HQVRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfVFJJR0dFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0U2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBTbGF2ZU1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TLCBTbGF2ZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc2VsZWN0cyB0aGUgdHJpZ2dlciBpbnB1dCB0byBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIFRTICAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJJbnB1dAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ2dlcklucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkxRl9FRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19USTFGUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkyRlAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0VUUkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRyaWdnZXJJbnB1dCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9UUywgVHJpZ2dlcklucHV0KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0Rpc2FibGVNYXN0ZXJTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlTWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfTVNNKTsKK30KKworLyoqCisgICogQGJyaWVmIEluZGljYXRlcyB3aGV0aGVyIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZE1hc3RlclNsYXZlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX01TTSkgPT0gKFRJTV9TTUNSX01TTSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGV4dGVybmFsIHRyaWdnZXIgKEVUUikgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fRVRSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBleHRlcm5hbCB0cmlnZ2VyIGlucHV0LgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVUUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUlxuCisgICogICAgICAgICBTTUNSICAgICAgICAgRVRQUyAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSXG4KKyAgKiAgICAgICAgIFNNQ1IgICAgICAgICBFVEYgICAgICAgICAgIExMX1RJTV9Db25maWdFVFIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVUUlBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QT0xBUklUWV9OT05JTlZFUlRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUE9MQVJJVFlfSU5WRVJURUQKKyAgKiBAcGFyYW0gIEVUUlByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjgKKyAgKiBAcGFyYW0gIEVUUkZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9ONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX044CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnRVRSKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBFVFJQb2xhcml0eSwgdWludDMyX3QgRVRSUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFVFJGaWx0ZXIpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfRVRQIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VURiwgRVRSUG9sYXJpdHkgfCBFVFJQcmVzY2FsZXIgfCBFVFJGaWx0ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoRVRSKSBpbnB1dCBzb3VyY2UuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fRVRSU0VMX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAgKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBFVFIgc291cmNlIHNlbGVjdGlvbi4KKyAgKiBAcm10b2xsIEFGMSAgICAgICAgICBFVFJTRUwgICAgICAgIExMX1RJTV9TZXRFVFJTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVUUlNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgVElNMQorICAqCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9HUElPCisgICogQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJTT1VSQ0VfQ09NUDIKKyAgKiBAZW5kaWYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0FEQzFfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJTT1VSQ0VfQURDMV9BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9BREMxX0FXRDMKKyAgKgorICAqICAgICAgICAgVElNMgorICAqCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9HUElPCisgICogQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJTT1VSQ0VfQ09NUDIKKyAgKiBAZW5kaWYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0xTRQorICAqCisgICogICAgICAgICBUSU0zCisgICoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0dQSU8KKyAgKiBAaWYgU1RNMzJHMDgxeHgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9DT01QMgorICAqIEBlbmRpZgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVUUlNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRVRSU291cmNlKQoreworCisgIE1PRElGWV9SRUcoVElNeC0+QUYxLCBUSU14X0FGMV9FVFJTRUwsIEVUUlNvdXJjZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0JyZWFrX0Z1bmN0aW9uIEJyZWFrIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGJyZWFrIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0VuYWJsZUJSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUJSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJyZWFrIGZ1bmN0aW9uLgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVCUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBub3RlIEJpZGlyZWN0aW9uYWwgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBhZHZhbmNlZCB0aW1lciBpbnN0YW5jZXMuCisgICogICAgICAgTWFjcm8gQHJlZiBJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGlzIGFuIGFkdmFuY2VkLWNvbnRyb2wgdGltZXIuCisgICogQG5vdGUgSW4gYmlkaXJlY3Rpb25hbCBtb2RlIChCS0JJRCBiaXQgc2V0KSwgdGhlIEJyZWFrIGlucHV0IGlzIGNvbmZpZ3VyZWQgYm90aCAKKyAgKiAgICAgICAgaW4gaW5wdXQgbW9kZSBhbmQgaW4gb3BlbiBkcmFpbiBvdXRwdXQgbW9kZS4gQW55IGFjdGl2ZSBCcmVhayBldmVudCB3aWxsCisgICogICAgICAgIGFzc2VydCBhIGxvdyBsb2dpYyBsZXZlbCBvbiB0aGUgQnJlYWsgaW5wdXQgdG8gaW5kaWNhdGUgYW4gaW50ZXJuYWwgYnJlYWsKKyAgKiAgICAgICAgZXZlbnQgdG8gZXh0ZXJuYWwgZGV2aWNlcy4KKyAgKiBAbm90ZSBXaGVuIGJpZGlyZWN0aW9uYWwgbW9kZSBpc24ndCBzdXBwb3J0ZWQsIEJyZWFrQUZNb2RlIG11c3QgYmUgc2V0IHRvIAorICAqICAgICAgIExMX1RJTV9CUkVBS19BRk1PREVfSU5QVVQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktQICAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLXG4KKyAgKiAgICAgICAgIEJEVFIgICAgICAgICBCS0YgICAgICAgICAgIExMX1RJTV9Db25maWdCUktcbgorICAqICAgICAgICAgQkRUUiAgICAgICAgIEJLQklEICAgICAgICAgTExfVElNX0NvbmZpZ0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQnJlYWtQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfUE9MQVJJVFlfSElHSAorICAqIEBwYXJhbSAgQnJlYWtGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX044CisgICogQHBhcmFtICBCcmVha0FGTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19BRk1PREVfSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfQUZNT0RFX0JJRElSRUNUSU9OQUwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrUG9sYXJpdHksIHVpbnQzMl90IEJyZWFrRmlsdGVyLCB1aW50MzJfdCBCcmVha0FGTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9CS1AgfCBUSU1fQkRUUl9CS0YgfCBUSU1fQkRUUl9CS0JJRCAsIEJyZWFrUG9sYXJpdHkgfCBCcmVha0ZpbHRlciB8IEJyZWFrQUZNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhcm0gdGhlIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwgbW9kZSkuCisgICogQG5vdGUgIFRoZSBicmVhayBpbnB1dCBjYW4gYmUgZGlzYXJtZWQgb25seSB3aGVuIGl0IGlzIGNvbmZpZ3VyZWQgaW4KKyAgKiAgICAgICAgYmlkaXJlY3Rpb25hbCBtb2RlIGFuZCB3aGVuIHdoZW4gTU9FIGlzIHJlc2V0LgorICAqIEBub3RlICBQdXJwb3NlIGlzIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgaW5wdXQgdm9sdGFnZSBiYWNrIHRvIGhpZ2gtc3RhdGUsCisgICogICAgICAgIHdoYXRldmVyIHRoZSB0aW1lIGNvbnN0YW50IG9uIHRoZSBvdXRwdXQgLgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRFNSTSAgICAgICAgTExfVElNX0Rpc2FybUJSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FybUJSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0RTUk0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlLWFybSB0aGUgYnJlYWsgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4KKyAgKiBAbm90ZSAgVGhlIEJyZWFrIGlucHV0IGlzIGF1dG9tYXRpY2FsbHkgYXJtZWQgYXMgc29vbiBhcyBNT0UgYml0IGlzIHNldC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCS0RTUk0gICAgICAgIExMX1RJTV9SZUFybUJSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1JlQXJtQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktEU1JNKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGJyZWFrIDIgZnVuY3Rpb24uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkUgICAgICAgICAgTExfVElNX0VuYWJsZUJSSzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJyZWFrICAyIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJFICAgICAgICAgIExMX1RJTV9EaXNhYmxlQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBicmVhayAyIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAbm90ZSBCaWRpcmVjdGlvbmFsIG1vZGUgaXMgb25seSBzdXBwb3J0ZWQgYnkgYWR2YW5jZWQgdGltZXIgaW5zdGFuY2VzLgorICAqICAgICAgIE1hY3JvIEByZWYgSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBpcyBhbiBhZHZhbmNlZC1jb250cm9sIHRpbWVyLgorICAqIEBub3RlIEluIGJpZGlyZWN0aW9uYWwgbW9kZSAoQksyQklEIGJpdCBzZXQpLCB0aGUgQnJlYWsgMiBpbnB1dCBpcyBjb25maWd1cmVkIGJvdGggCisgICogICAgICAgIGluIGlucHV0IG1vZGUgYW5kIGluIG9wZW4gZHJhaW4gb3V0cHV0IG1vZGUuIEFueSBhY3RpdmUgQnJlYWsgZXZlbnQgd2lsbAorICAqICAgICAgICBhc3NlcnQgYSBsb3cgbG9naWMgbGV2ZWwgb24gdGhlIEJyZWFrIDIgaW5wdXQgdG8gaW5kaWNhdGUgYW4gaW50ZXJuYWwgYnJlYWsKKyAgKiAgICAgICAgZXZlbnQgdG8gZXh0ZXJuYWwgZGV2aWNlcy4KKyAgKiBAbm90ZSBXaGVuIGJpZGlyZWN0aW9uYWwgbW9kZSBpc24ndCBzdXBwb3J0ZWQsIEJyZWFrMkFGTW9kZSBtdXN0IGJlIHNldCB0byAKKyAgKiAgICAgICBMTF9USU1fQlJFQUsyX0FGTU9ERV9JTlBVVC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJQICAgICAgICAgIExMX1RJTV9Db25maWdCUksyXG4KKyAgKiAgICAgICAgIEJEVFIgICAgICAgICBCSzJGICAgICAgICAgIExMX1RJTV9Db25maWdCUksyXG4KKyAgKiAgICAgICAgIEJEVFIgICAgICAgICBCSzJCSUQgICAgICAgIExMX1RJTV9Db25maWdCUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVhazJQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdICisgICogQHBhcmFtICBCcmVhazJGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOAorICAqIEBwYXJhbSAgQnJlYWsyQUZNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9BRk1PREVfSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0FGTU9ERV9CSURJUkVDVElPTkFMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnQlJLMihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWsyUG9sYXJpdHksIHVpbnQzMl90IEJyZWFrMkZpbHRlciwgdWludDMyX3QgQnJlYWsyQUZNb2RlKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMlAgfCBUSU1fQkRUUl9CSzJGIHwgVElNX0JEVFJfQksyQklELCBCcmVhazJQb2xhcml0eSB8IEJyZWFrMkZpbHRlciB8IEJyZWFrMkFGTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYXJtIHRoZSBicmVhayAyIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwgbW9kZSkuCisgICogQG5vdGUgIFRoZSBicmVhayAyIGlucHV0IGNhbiBiZSBkaXNhcm1lZCBvbmx5IHdoZW4gaXQgaXMgY29uZmlndXJlZCBpbgorICAqICAgICAgICBiaWRpcmVjdGlvbmFsIG1vZGUgYW5kIHdoZW4gd2hlbiBNT0UgaXMgcmVzZXQuCisgICogQG5vdGUgIFB1cnBvc2UgaXMgdG8gYmUgYWJsZSB0byBoYXZlIHRoZSBpbnB1dCB2b2x0YWdlIGJhY2sgdG8gaGlnaC1zdGF0ZSwKKyAgKiAgICAgICAgd2hhdGV2ZXIgdGhlIHRpbWUgY29uc3RhbnQgb24gdGhlIG91dHB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJEU1JNICAgICAgIExMX1RJTV9EaXNhcm1CUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYXJtQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CSzJEU1JNKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZS1hcm0gdGhlIGJyZWFrIDIgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4KKyAgKiBAbm90ZSAgVGhlIEJyZWFrIDIgaW5wdXQgaXMgYXV0b21hdGljYWxseSBhcm1lZCBhcyBzb29uIGFzIE1PRSBiaXQgaXMgc2V0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkRTUk0gICAgICAgTExfVElNX1JlQXJtQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1JlQXJtQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMkRTUk0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgb3V0cHV0cyBvZmYgc3RhdGUgKGVuYWJsZWQgdi5zLiBkaXNhYmxlZCkgaW4gSWRsZSBhbmQgUnVuIG1vZGVzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE9TU0kgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlc1xuCisgICogICAgICAgICBCRFRSICAgICAgICAgT1NTUiAgICAgICAgICBMTF9USU1fU2V0T2ZmU3RhdGVzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZTdGF0ZUlkbGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTSV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU0lfRU5BQkxFCisgICogQHBhcmFtICBPZmZTdGF0ZVJ1biBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTUl9FTkFCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPZmZTdGF0ZXMoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9mZlN0YXRlSWRsZSwgdWludDMyX3QgT2ZmU3RhdGVSdW4pCit7CisgIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfT1NTSSB8IFRJTV9CRFRSX09TU1IsIE9mZlN0YXRlSWRsZSB8IE9mZlN0YXRlUnVuKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIG91dHB1dCAoTU9FIGNhbiBiZSBzZXQgYnkgc29mdHdhcmUgb3IgYXV0b21hdGljYWxseSB3aGVuIGEgYnJlYWsgaW5wdXQgaXMgYWN0aXZlKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBBT0UgICAgICAgICAgIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBvdXRwdXQgKE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGF1dG9tYXRpYyBvdXRwdXQgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBBT0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBdXRvbWF0aWNPdXRwdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9BT0UpID09IChUSU1fQkRUUl9BT0UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBvdXRwdXRzIChzZXQgdGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyKS4KKyAgKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cyBieQorICAqICAgICAgIHNvZnR3YXJlIGFuZCBpcyByZXNldCBpbiBjYXNlIG9mIGJyZWFrIG9yIGJyZWFrMiBldmVudAorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE1PRSAgICAgICAgICAgTExfVElNX0VuYWJsZUFsbE91dHB1dHMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBbGxPdXRwdXRzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgb3V0cHV0cyAocmVzZXQgdGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyKS4KKyAgKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cyBieQorICAqICAgICAgIHNvZnR3YXJlIGFuZCBpcyByZXNldCBpbiBjYXNlIG9mIGJyZWFrIG9yIGJyZWFrMiBldmVudC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVBbGxPdXRwdXRzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvdXRwdXRzIGFyZSBlbmFibGVkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE1PRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZEFsbE91dHB1dHMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfTU9FKSA9PSAoVElNX0JEVFJfTU9FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2lnbmFscyBjb25uZWN0ZWQgdG8gdGhlIGRlc2lnbmF0ZWQgdGltZXIgYnJlYWsgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGFsbG93cyBmb3IgYnJlYWsgaW5wdXQgc2VsZWN0aW9uLgorICAqIEBybXRvbGwgQUYxICAgICAgICAgIEJLSU5FICAgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqIEBpZiBTVE0zMkcwODF4eAorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMUUgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMkUgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqIEBlbmRpZgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMklORSAgICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqIEBpZiBTVE0zMkcwODF4eAorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDFFICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJFICAgICAgTExfVElNX0VuYWJsZUJyZWFrSW5wdXRTb3VyY2UKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJyZWFrSW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLSU4KKyAgKiBAaWYgU1RNMzJHMDgxeHgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAyCisgICogQGVuZGlmCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWtJbnB1dCwgdWludDMyX3QgU291cmNlKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5BRjEpICsgQnJlYWtJbnB1dCkpOworICBTRVRfQklUKCpwUmVnLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNpZ25hbHMgY29ubmVjdGVkIHRvIHRoZSBkZXNpZ25hdGVkIHRpbWVyIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4KKyAgKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgICogQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAxRSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiBAZW5kaWYKKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJJTkUgICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgICogQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QMUUgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJFICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlCisgICogQGVuZGlmCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVha0lucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjIKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOCisgICogQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMgorICAqIEBlbmRpZgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBCcmVha0lucHV0LCB1aW50MzJfdCBTb3VyY2UpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkFGMSkgKyBCcmVha0lucHV0KSk7CisgIENMRUFSX0JJVCgqcFJlZywgU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBicmVhayBzaWduYWwgZm9yIHRoZSB0aW1lciBicmVhayBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS1NPVVJDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgYWxsb3dzIGZvciBicmVhayBpbnB1dCBzZWxlY3Rpb24uCisgICogQHJtdG9sbCBBRjEgICAgICAgICAgQktJTlAgICAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAgKiBAaWYgU1RNMzJHMDgxeHgKKyAgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDFQICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMlAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgICogQGVuZGlmCisgICogICAgICAgICBBRjIgICAgICAgICAgQksySU5QICAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAgKiBAaWYgU1RNMzJHMDgxeHgKKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJDTVAxUCAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDJQICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eQorICAqIEBlbmRpZgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQnJlYWtJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4yCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktJTgorICAqIEBpZiBTVE0zMkcwODF4eAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDIKKyAgKiBAZW5kaWYKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fUE9MQVJJVFlfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWtJbnB1dCwgdWludDMyX3QgU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+QUYxKSArIEJyZWFrSW5wdXQpKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKFRJTXhfQUYxX0JLSU5QIDw8IFRJTV9QT1NJVElPTl9CUktfU09VUkNFKSAsIChQb2xhcml0eSA8PCBUSU1fUE9TSVRJT05fQlJLX1NPVVJDRSkpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRE1BX0J1cnN0X01vZGUgRE1BIGJ1cnN0IG1vZGUgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHRpbWVyIERNQSBidXJzdCBmZWF0dXJlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKKyAgKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgRE1BIGJ1cnN0IG1vZGUuCisgICogQHJtdG9sbCBEQ1IgICAgICAgICAgREJMICAgICAgICAgICBMTF9USU1fQ29uZmlnRE1BQnVyc3RcbgorICAqICAgICAgICAgRENSICAgICAgICAgIERCQSAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBETUFCdXJzdEJhc2VBZGRyZXNzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfU01DUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9ESUVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0VHUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ0VSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9QU0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQVJSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1JDUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0JEVFIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I1ICAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNiAgCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FGMSAgCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FGMiAgCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1RJU0VMCisgICogQHBhcmFtICBETUFCdXJzdExlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMVRSQU5TRkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF80VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF81VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF83VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF84VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMFRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTFUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xM1RSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTRUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNlRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTdUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnRE1BQnVyc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IERNQUJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IERNQUJ1cnN0TGVuZ3RoKQoreworICBNT0RJRllfUkVHKFRJTXgtPkRDUiwgKFRJTV9EQ1JfREJMIHwgVElNX0RDUl9EQkEpLCAoRE1BQnVyc3RCYXNlQWRkcmVzcyB8IERNQUJ1cnN0TGVuZ3RoKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX1RpbWVyX0lucHV0c19SZW1hcHBpbmcgVGltZXIgaW5wdXQgcmVtYXBwaW5nCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgUmVtYXAgVElNIGlucHV0cyAoaW5wdXQgY2hhbm5lbCwgaW50ZXJuYWwvZXh0ZXJuYWwgdHJpZ2dlcnMpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1JFTUFQX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSBzb21lIHRpbWVyIGlucHV0cyBjYW4gYmUgcmVtYXBwZWQuCisgICogQHJtdG9sbCBUSU0xX1RJU0VMICAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xX1RJU0VMICAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX1RJU0VMICAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX1RJU0VMICAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0zX1RJU0VMICAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0zX1RJU0VMICAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNF9USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNV9USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNV9USVNFTCAgIFRJMlNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNl9USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xN19USVNFTCAgIFRJMVNFTCAgICAgIExMX1RJTV9TZXRSZW1hcAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmVtYXAgUmVtYXAgcGFyYW0gZGVwZW5kcyBvbiB0aGUgVElNeC4gRGVzY3JpcHRpb24gYXZhaWxhYmxlIG9ubHkKKyAgKiAgICAgICAgIGluIENITSB2ZXJzaW9uIG9mIHRoZSBVc2VyIE1hbnVhbCAobm90IGluIC5wZGYpLgorICAqICAgICAgICAgT3RoZXJ3aXNlIHNlZSBSZWZlcmVuY2UgTWFudWFsIGRlc2NyaXB0aW9uIG9mIFRJU0VMIHJlZ2lzdGVycy4KKyAgKgorICAqICAgICAgICAgQmVsb3cgZGVzY3JpcHRpb24gc3VtbWFyaXplcyAiVGltZXIgSW5zdGFuY2UiIGFuZCAiUmVtYXAiIHBhcmFtIGNvbWJpbmF0aW9uczoKKyAgKgorICAqICAgICAgICAgVElNMTogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAgYW5kIFRJMl9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMV9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMV9STVBfQ09NUDEKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMl9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX1RJMl9STVBfQ09NUDIKKyAgKgorICAqICAgICAgICAgVElNMjogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAgYW5kIFRJMl9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMV9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMV9STVBfQ09NUDEKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMl9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJMl9STVBfQ09NUDIKKyAgKgorICAqICAgICAgICAgVElNMzogYW55IGNvbWJpbmF0aW9uIG9mIFRJMV9STVAgYW5kIFRJMl9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMV9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMV9STVBfQ09NUDEKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJMl9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0zX1RJMl9STVBfQ09NUDIKKyAgKgorICAqICAgICAgICAgVElNMTQ6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE0X1RJMV9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNF9USTFfUk1QX1JUQ19DTEsKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTRfVEkxX1JNUF9IU0VfMzIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTRfVEkxX1JNUF9NQ08KKyAgKgorICAqICAgICAgICAgVElNMTU6IGFueSBjb21iaW5hdGlvbiBvZiBUSTFfUk1QIGFuZCBUSTJfUk1QIHdoZXJlCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkxX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMV9STVBfVElNMl9JQzEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTVfVEkxX1JNUF9USU0zX0lDMQorICAqCisgICogICAgICAgICAgICAuIC4gVEkyX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMl9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNV9USTJfUk1QX1RJTTJfSUMyCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE1X1RJMl9STVBfVElNM19JQzIKKyAgKgorICAqICAgICAgICAgVElNMTY6IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX0xTSQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX0xTRQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xNl9USTFfUk1QX1JUQ19XSworICAqCisgICogICAgICAgICBUSU0xNzogb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE3X1RJMV9STVBfSFNFXzMyCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE3X1RJMV9STVBfTUNPCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZW1hcChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUmVtYXApCit7CisgIE1PRElGWV9SRUcoVElNeC0+VElTRUwsIChUSU1fVElTRUxfVEkxU0VMIHwgVElNX1RJU0VMX1RJMlNFTCB8IFRJTV9USVNFTF9USTNTRUwgfCBUSU1fVElTRUxfVEk0U0VMKSwgUmVtYXApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9PQ1JFRl9DbGVhciBPQ1JFRl9DbGVhcl9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBPQ1JFRiBjbGVhciBpbnB1dCBzb3VyY2UKKyAgKiBAbm90ZSBUaGUgT0N4UkVGIHNpZ25hbCBvZiBhIGdpdmVuIGNoYW5uZWwgY2FuIGJlIGNsZWFyZWQgd2hlbiBhIGhpZ2ggbGV2ZWwgaXMgYXBwbGllZCBvbiB0aGUgT0NSRUZfQ0xSX0lOUFVUCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgIE9DQ1MgICAgICAgICAgICAgICAgTExfVElNX1NldE9DUmVmQ2xlYXJJbnB1dFNvdXJjZQorICAqIEBybXRvbGwgT1IxICAgICAgICAgICBPQ1JFRl9DTFIgICAgICAgICAgIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0VUUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUkVGX0NMUl9JTlRfQ09NUDIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5TTUNSLCBUSU1fU01DUl9PQ0NTLAorICAgICAgICAgICAgICgoT0NSZWZDbGVhcklucHV0U291cmNlICYgT0NSRUZfQ0xFQVJfU0VMRUNUX01zaykgPj4gT0NSRUZfQ0xFQVJfU0VMRUNUX1BvcykgPDwgVElNX1NNQ1JfT0NDU19Qb3MpOworICBNT0RJRllfUkVHKFRJTXgtPk9SMSwgVElNMV9PUjFfT0NSRUZfQ0xSLCBPQ1JlZkNsZWFySW5wdXRTb3VyY2UpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUctTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVUlGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfVUlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgaXMgc2V0ICh1cGRhdGUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFVJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9VSUYpID09IChUSU1fU1JfVUlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAoQ0MxRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MxSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MxSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFJRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxSUYpID09IChUSU1fU1JfQ0MxSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnIChDQzJGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzJJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKENDMkYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMklGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzJJRikgPT0gKFRJTV9TUl9DQzJJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKENDM0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM0lGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDM0lGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAoQ0MzRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDM0lGKSA9PSAoVElNX1NSX0NDM0lGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAoQ0M0RikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0SUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M0SUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRJRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0SUYpID09IChUSU1fU1JfQ0M0SUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnIChDQzVGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzVJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M1CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzVJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGZsYWcgKENDNUYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzVJRikgPT0gKFRJTV9TUl9DQzVJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKENDNkYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNklGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0M2KFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDNklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAoQ0M2RikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M2SUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M2KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNklGKSA9PSAoVElNX1NSX0NDNklGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZyAoQ09NSUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENPTUlGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NPTUlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZyAoQ09NSUYpIGlzIHNldCAoY29tbXV0YXRpb24gaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENPTUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DT01JRikgPT0gKFRJTV9TUl9DT01JRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX1RJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdHJpZ2dlciBpbnRlcnJ1cHQgZmxhZyAoVElGKSBpcyBzZXQgKHRyaWdnZXIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFRJRiAgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1RJRikgPT0gKFRJTV9TUl9USUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGJyZWFrIGludGVycnVwdCBmbGFnIChCSUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEJJRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0JJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgYnJlYWsgaW50ZXJydXB0IGZsYWcgKEJJRikgaXMgc2V0IChicmVhayBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQklGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0JJRikgPT0gKFRJTV9TUl9CSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGJyZWFrIDIgaW50ZXJydXB0IGZsYWcgKEIySUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEIySUYgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19CUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0JSSzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQjJJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgYnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAoQjJJRikgaXMgc2V0IChicmVhayAyIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCMklGICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9CMklGKSA9PSAoVElNX1NSX0IySUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MxT0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMU9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzFPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MxT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMU9GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMU9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MxT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzFPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MxT0YpID09IChUSU1fU1JfQ0MxT0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MyT0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMk9GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MyT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMk9GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDMk9GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMk9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMk9GKSA9PSAoVElNX1NSX0NDMk9GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDM09GKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MzT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzNPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDMgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzNPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM09GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzNPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzNPRikgPT0gKFRJTV9TUl9DQzNPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzRPRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M0T0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNE9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzRPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M0T0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA0IG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0M0T0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M0T1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzRPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M0T0YpID09IChUSU1fU1JfQ0M0T0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIHN5c3RlbSBicmVhayBpbnRlcnJ1cHQgZmxhZyAoU0JJRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0JJRiAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX1NZU0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19TWVNCUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfU0JJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgc3lzdGVtIGJyZWFrIGludGVycnVwdCBmbGFnIChTQklGKSBpcyBzZXQgKHN5c3RlbSBicmVhayBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0JJRiAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1NZU0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfU1lTQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1NCSUYpID09IChUSU1fU1JfU0JJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSVRfTWFuYWdlbWVudCBJVC1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXBkYXRlIGludGVycnVwdCAoVUlFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VJRSkgPT0gKFRJTV9ESUVSX1VJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IChDQzFJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAxICBpbnRlcnJ1cHQgKENDMUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IChDQzFJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFJRSkgPT0gKFRJTV9ESUVSX0NDMUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiBpbnRlcnJ1cHQgKENDMklFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJJRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MySUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDIgIGludGVycnVwdCAoQ0MySUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMklFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MySUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMiBpbnRlcnJ1cHQgKENDMklFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMklFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMklFKSA9PSAoVElNX0RJRVJfQ0MySUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0lFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyAgaW50ZXJydXB0IChDQzNJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIGludGVycnVwdCAoQ0MzSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzSUUpID09IChUSU1fRElFUl9DQzNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IChDQzRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0SUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSA0ICBpbnRlcnJ1cHQgKENDNElFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IChDQzRJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRJRSkgPT0gKFRJTV9ESUVSX0NDNElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgKENPTUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tbXV0YXRpb24gaW50ZXJydXB0IChDT01JRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NSUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbW11dGF0aW9uIGludGVycnVwdCAoQ09NSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NSUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NSUUpID09IChUSU1fRElFUl9DT01JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVElFKSA9PSAoVElNX0RJRVJfVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQklFICAgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQklFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9CSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBicmVhayBpbnRlcnJ1cHQgKEJJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9CSUUpID09IChUSU1fRElFUl9CSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQS1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHVwZGF0ZSBETUEgcmVxdWVzdCAoVURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVREUgICAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIERNQSByZXF1ZXN0IChVREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1cGRhdGUgRE1BIHJlcXVlc3QgIChVREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVURFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VREUpID09IChUSU1fRElFUl9VREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAxIERNQSByZXF1ZXN0IChDQzFERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDEgIERNQSByZXF1ZXN0IChDQzFERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDEgRE1BIHJlcXVlc3QgKENDMURFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMURFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpID09IChUSU1fRElFUl9DQzFERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDIgRE1BIHJlcXVlc3QgKENDMkRFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiAgRE1BIHJlcXVlc3QgKENDMkRFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MyREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMiBETUEgcmVxdWVzdCAoQ0MyREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MyREUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSkgPT0gKFRJTV9ESUVSX0NDMkRFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMyBETUEgcmVxdWVzdCAoQ0MzREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0RFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAzICBETUEgcmVxdWVzdCAoQ0MzREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0RFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAzIERNQSByZXF1ZXN0IChDQzNERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0RFKSA9PSAoVElNX0RJRVJfQ0MzREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSA0IERNQSByZXF1ZXN0IChDQzRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDQgIERNQSByZXF1ZXN0IChDQzRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDQgRE1BIHJlcXVlc3QgKENDNERFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNERFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpID09IChUSU1fRElFUl9DQzRERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01ERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21tdXRhdGlvbiBETUEgcmVxdWVzdCAoQ09NREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTURFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01ERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbW11dGF0aW9uIERNQSByZXF1ZXN0IChDT01ERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01ERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKSA9PSAoVElNX0RJRVJfQ09NREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFRERSAgICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyaWdnZXIgaW50ZXJydXB0IChUREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RERSkgPT0gKFRJTV9ESUVSX1RERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRVZFTlRfTWFuYWdlbWVudCBFVkVOVC1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFVHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX1VHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMSBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzFHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzFHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMiBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzJHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzJHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgMyBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzNHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzNHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBDYXB0dXJlL0NvbXBhcmUgNCBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDQzRHICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DQzRHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBjb21tdXRhdGlvbiBldmVudC4KKyAgKiBAcm10b2xsIEVHUiAgICAgICAgICBDT01HICAgICAgICAgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9DT01HKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSB0cmlnZ2VyIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIFRHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVEcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGJyZWFrIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIEJHICAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0JHKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBicmVhayAyIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIEIyRyAgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0dlbmVyYXRlRXZlbnRfQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfQjJHKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUZfSW5pdCBJbml0aWFsaXNhdGlvbiBhbmQgZGVpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9USU1fRGVJbml0KFRJTV9UeXBlRGVmICpUSU14KTsKK3ZvaWQgTExfVElNX1N0cnVjdEluaXQoTExfVElNX0luaXRUeXBlRGVmICpUSU1fSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0luaXRUeXBlRGVmICpUSU1fSW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9PQ19TdHJ1Y3RJbml0KExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX09DX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fSUNfU3RydWN0SW5pdChMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0lDX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fRU5DT0RFUl9TdHJ1Y3RJbml0KExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0VOQ09ERVJfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9IQUxMU0VOU09SX1N0cnVjdEluaXQoTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgKlRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fSEFMTFNFTlNPUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0JEVFJfU3RydWN0SW5pdChMTF9USU1fQkRUUl9Jbml0VHlwZURlZiAqVElNX0JEVFJJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9CRFRSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFRJTTEgfHwgVElNMiB8fCBUSU0zIHx8ICBUSU0xNCB8fCBUSU0xNSB8fCBUSU0xNiB8fCBUSU0xNyB8fCBUSU02IHx8IFRJTTcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fU1RNMzJHMHh4X0xMX1RJTV9IICovCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF91Y3BkLmggYi9JbmMvc3RtMzJnMHh4X2xsX3VjcGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNkZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZzB4eF9sbF91Y3BkLmgKQEAgLTAsMCArMSwxODU4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3VjcGQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVUNQRCBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJHMHh4X0xMX1VDUERfSAorI2RlZmluZSBTVE0zMkcweHhfTExfVUNQRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoVUNQRDEpIHx8IGRlZmluZWQgKFVDUEQyKQorCisvKiogQGRlZmdyb3VwIFVDUERfTEwgVUNQRAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FU19JTklUIFVDUEQgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVDUEQgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IHBzY191Y3BkY2xrOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgZm9yIHRoZSB1Y3BkIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUNQRF9MTF9FQ19QU0MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VQ1BEX1NldFBTQ0NsaygpLiovCisKKyAgdWludDMyX3QgdHJhbnN3aW47ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjeWNsZXMgKG1pbnVzIDEpIG9mIHRoZSBoYWxmIGJpdCBjbG9jayAoc2VlIEhCSVRDTEtESVYpIHRvIGFjaGlldmUgYSBsZWdhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRyYW5zaXRpb25XaW5kb3cgKHNldCBhY2NvcmRpbmcgdG8gcGVyaXBoZXJhbCBjbG9jayB0byBkZWZpbmUgYW4gaW50ZXJ2YWwgb2YgYmV0d2VlbiAxMiBhbmQgMjAgdXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDEgYW5kIE1heF9EYXRhPTB4MUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VDUERfU2V0VHJhbnNXaW4oKS4qLworCisgIHVpbnQzMl90IElmckdhcDsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbG9jayBkaXZpZGVyIChtaW51cyAxKSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0SW50ZXJmcmFtZUdhcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcGVyaXBoZXJhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgxIGFuZCBNYXhfRGF0YT0weDFGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VDUERfU2V0SWZyR2FwKCkuKi8KKworICB1aW50MzJfdCBIYml0Q2xvY2tEaXY7ICAgICAgICAvKiE8IFNwZWNpZmllcyAgdGhlIG51bWJlciBvZiBjeWNsZXMgKG1pbnVzIG9uZSkgYXQgVUNQRCBwZXJpcGhlcmFsIGZvciBhIGhhbGYgYml0IGNsb2NrIGUuZy4gcHJvZ3JhbSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgYml0IGNsb2NrIHRoYXQgdGFrZXMgOCBjeWNsZXMgb2YgdGhlIHBlcmlwaGVyYWwgY2xvY2sgIlVDUEQxX0NMSyIuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weDNGLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVUNQRF9TZXRIYml0Q2xvY2tEaXYoKS4qLworCit9IExMX1VDUERfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVDUERfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFVDUEQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF91Y3BkX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1RYSVMgICAgICAgICAgICAgVUNQRF9TUl9UWElTICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9UWE1TR0RJU0MgICAgICAgIFVDUERfU1JfVFhNU0dESVNDICAgICAgICAgIC8qITwgVHJhbnNtaXQgbWVzc2FnZSBkaXNjYXJkZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIExMX1VDUERfU1JfVFhNU0dTRU5UICAgICAgICBVQ1BEX1NSX1RYTVNHU0VOVCAgICAgICAgICAvKiE8IFRyYW5zbWl0IG1lc3NhZ2Ugc2VudCBpbnRlcnJ1cHQgICAgICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1RYTVNHQUJUICAgICAgICAgVUNQRF9TUl9UWE1TR0FCVCAgICAgICAgICAgLyohPCBUcmFuc21pdCBtZXNzYWdlIGFib3J0IGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9IUlNURElTQyAgICAgICAgIFVDUERfU1JfSFJTVERJU0MgICAgICAgICAgIC8qITwgSFJTVCBkaXNjYXJkZWQgaW50ZXJydXB0ICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VDUERfU1JfSFJTVFNFTlQgICAgICAgICBVQ1BEX1NSX0hSU1RTRU5UICAgICAgICAgICAvKiE8IEhSU1Qgc2VudCBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1RYVU5EICAgICAgICAgICAgVUNQRF9TUl9UWFVORCAgICAgICAgICAgICAgLyohPCBUeCBkYXRhIHVuZGVycnVuIGNvbmRpdGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9SWE5FICAgICAgICAgICAgIFVDUERfU1JfUlhORSAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgICovCisjZGVmaW5lIExMX1VDUERfU1JfUlhPUkRERVQgICAgICAgICBVQ1BEX1NSX1JYT1JEREVUICAgICAgICAgICAvKiE8IFJ4IG9yZGVyZWQgc2V0ICg0IEstY29kZXMpIGRldGVjdGVkIGludGVycnVwdCAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9SWEhSU1RERVQgICAgICAgIFVDUERfU1JfUlhIUlNUREVUICAgICAgICAgIC8qITwgUnggSGFyZCBSZXNldCBkZXRlY3QgaW50ZXJydXB0ICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1JYT1ZSICAgICAgICAgICAgVUNQRF9TUl9SWE9WUiAgICAgICAgICAgICAgLyohPCBSeCBkYXRhIG92ZXJmbG93IGludGVycnVwdCAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9SWE1TR0VORCAgICAgICAgIFVDUERfU1JfUlhNU0dFTkQgICAgICAgICAgIC8qITwgUnggbWVzc2FnZSByZWNlaXZlZCAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9SWEVSUiAgICAgICAgICAgIFVDUERfU1JfUlhFUlIgICAgICAgICAgICAgIC8qITwgUnggZXJyb3IgICovCisjZGVmaW5lIExMX1VDUERfU1JfVFlQRUNFVlQxICAgICAgICBVQ1BEX1NSX1RZUEVDRVZUMSAgICAgICAgICAvKiE8IFR5cGUgQyB2b2x0YWdlIGxldmVsIGV2ZW50IG9uIENDMSAgKi8KKyNkZWZpbmUgTExfVUNQRF9TUl9UWVBFQ0VWVDIgICAgICAgIFVDUERfU1JfVFlQRUNFVlQyICAgICAgICAgIC8qITwgVHlwZSBDIHZvbHRhZ2UgbGV2ZWwgZXZlbnQgb24gQ0MyICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzEgVUNQRF9TUl9UWVBFQ19WU1RBVEVfQ0MxICAgLyohPFN0YXR1cyBvZiBEQyBsZXZlbCBvbiBDQzEgcGluICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzIgVUNQRF9TUl9UWVBFQ19WU1RBVEVfQ0MyICAgLyohPFN0YXR1cyBvZiBEQyBsZXZlbCBvbiBDQzIgcGluICAqLworI2RlZmluZSBMTF9VQ1BEX1NSX0ZSU0VWVCAgICAgICAgICAgVUNQRF9TUl9GUlNFVlQgICAgICAgICAgICAgLyohPEZhc3QgUm9sZSBTd2FwIGRldGVjdGlvbiBldmVudCAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VDUERfUmVhZFJlZyBhbmQgIExMX1VDUERfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfVFhJUyAgICAgICAgICAgICBVQ1BEX0lNUl9UWElTSUUgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfVFhNU0dESVNDICAgICAgICBVQ1BEX0lNUl9UWE1TR0RJU0NJRSAgICAgICAgICAvKiE8IEVuYWJsZSB0cmFuc21pdCBtZXNzYWdlIGRpc2NhcmRlZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfVFhNU0dTRU5UICAgICAgICBVQ1BEX0lNUl9UWE1TR1NFTlRJRSAgICAgICAgICAvKiE8IEVuYWJsZSB0cmFuc21pdCBtZXNzYWdlIHNlbnQgaW50ZXJydXB0ICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfVFhNU0dBQlQgICAgICAgICBVQ1BEX0lNUl9UWE1TR0FCVElFICAgICAgICAgICAvKiE8IEVuYWJsZSB0cmFuc21pdCBtZXNzYWdlIGFib3J0IGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfSFJTVERJU0MgICAgICAgICBVQ1BEX0lNUl9IUlNURElTQ0lFICAgICAgICAgICAvKiE8IEVuYWJsZSBIUlNUIGRpc2NhcmRlZCBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfSFJTVFNFTlQgICAgICAgICBVQ1BEX0lNUl9IUlNUU0VOVElFICAgICAgICAgICAvKiE8IEVuYWJsZSBIUlNUIHNlbnQgaW50ZXJydXB0ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfVFhVTkQgICAgICAgICAgICBVQ1BEX0lNUl9UWFVORElFICAgICAgICAgICAgICAvKiE8IEVuYWJsZSB0eCBkYXRhIHVuZGVycnVuIGNvbmRpdGlvbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfUlhORSAgICAgICAgICAgICBVQ1BEX0lNUl9SWE5FSUUgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdCAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfUlhPUkRERVQgICAgICAgICBVQ1BEX0lNUl9SWE9SRERFVElFICAgICAgICAgICAvKiE8IEVuYWJsZSBSeCBvcmRlcmVkIHNldCAoNCBLLWNvZGVzKSBkZXRlY3RlZCBpbnRlcnJ1cHQgICovCisjZGVmaW5lIExMX1VDUERfSU1SX1JYSFJTVERFVCAgICAgICAgVUNQRF9JTVJfUlhIUlNUREVUSUUgICAgICAgICAgLyohPCBFbmFibGUgUnggSGFyZCBSZXNldCBkZXRlY3QgaW50ZXJydXB0ICAqLworI2RlZmluZSBMTF9VQ1BEX0lNUl9SWE9WUiAgICAgICAgICAgIFVDUERfSU1SX1JYT1ZSSUUgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFJ4IGRhdGEgb3ZlcmZsb3cgaW50ZXJydXB0ICAqLworI2RlZmluZSBMTF9VQ1BEX0lNUl9SWE1TR0VORCAgICAgICAgIFVDUERfSU1SX1JYTVNHRU5EICAgICAgICAgICAgIC8qITwgRW5hYmxlIFJ4IG1lc3NhZ2UgcmVjZWl2ZWQgICovCisjZGVmaW5lIExMX1VDUERfSU1SX1JYRVJSICAgICAgICAgICAgVUNQRF9JTVJfUlhNU0dFTkRJRSAgICAgICAgICAgLyohPCBFbmFibGUgUnggZXJyb3IgICovCisjZGVmaW5lIExMX1VDUERfSU1SX1RZUEVDRVZUMSAgICAgICAgVUNQRF9JTVJfVFlQRUNFVlQxSUUgICAgICAgICAgLyohPCBFbmFibGUgVHlwZSBDIHZvbHRhZ2UgbGV2ZWwgZXZlbnQgb24gQ0MxICAqLworI2RlZmluZSBMTF9VQ1BEX0lNUl9UWVBFQ0VWVDIgICAgICAgIFVDUERfSU1SX1RZUEVDRVZUMklFICAgICAgICAgIC8qITwgRW5hYmxlIFR5cGUgQyB2b2x0YWdlIGxldmVsIGV2ZW50IG9uIENDMiAgKi8KKyNkZWZpbmUgTExfVUNQRF9JTVJfRlJTRVZUICAgICAgICAgICBVQ1BEX0lNUl9GUlNFVlRJRSAgICAgICAgICAgICAvKiE8IEVuYWJsZSBmYXN0IFJvbGUgU3dhcCBkZXRlY3Rpb24gZXZlbnQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUNfT1JERVJTRVQgb3JkZXJzZXQgdmFsdWUKKyAgKiBAYnJpZWYgICAgZGVmaW5pdGlvbiBvZiB0aGUgdXN1YWwgb3JkZXJzZXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1NZTkMxIDB4MTh1CisjZGVmaW5lIExMX1VDUERfU1lOQzIgMHgxMXUKKyNkZWZpbmUgTExfVUNQRF9TWU5DMyAweDA2dQorI2RlZmluZSBMTF9VQ1BEX1JTVDEgIDB4MDd1CisjZGVmaW5lIExMX1VDUERfUlNUMiAgMHgxOXUKKyNkZWZpbmUgTExfVUNQRF9FT1AgICAweDBEdQorCisjZGVmaW5lIExMX1VDUERfT1JERVJFRF9TRVRfU09QICAgICAgICAgKExMX1VDUERfU1lOQzEgfCAoTExfVUNQRF9TWU5DMTw8NXUpIHwgKExMX1VDUERfU1lOQzE8PDEwdSkgfCAoTExfVUNQRF9TWU5DMjw8MTV1KSkKKyNkZWZpbmUgTExfVUNQRF9PUkRFUkVEX1NFVF9TT1AxICAgICAgICAoTExfVUNQRF9TWU5DMSB8IChMTF9VQ1BEX1NZTkMxPDw1dSkgfCAoTExfVUNQRF9TWU5DMzw8MTB1KSB8IChMTF9VQ1BEX1NZTkMzPDwxNXUpKQorI2RlZmluZSBMTF9VQ1BEX09SREVSRURfU0VUX1NPUDIgICAgICAgIChMTF9VQ1BEX1NZTkMxIHwgKExMX1VDUERfU1lOQzM8PDV1KSB8IChMTF9VQ1BEX1NZTkMxPDwxMHUpIHwgKExMX1VDUERfU1lOQzM8PDE1dSkpCisjZGVmaW5lIExMX1VDUERfT1JERVJFRF9TRVRfSEFSRF9SRVNFVCAgKExMX1VDUERfUlNUMSAgfCAoTExfVUNQRF9SU1QxPDw1dSkgIHwgKExMX1VDUERfUlNUMTw8MTB1KSAgfCAoTExfVUNQRF9SU1QyPDwxNXUgKSkKKyNkZWZpbmUgTExfVUNQRF9PUkRFUkVEX1NFVF9DQUJMRV9SRVNFVCAoTExfVUNQRF9SU1QxICB8IChMTF9VQ1BEX1NZTkMxPDw1dSkgfCAoTExfVUNQRF9SU1QxPDwxMHUpICB8IChMTF9VQ1BEX1NZTkMzPDwxNXUpKQorI2RlZmluZSBMTF9VQ1BEX09SREVSRURfU0VUX1NPUDFfREVCVUcgIChMTF9VQ1BEX1NZTkMxIHwgKExMX1VDUERfUlNUMjw8NXUpICB8IChMTF9VQ1BEX1JTVDI8PDEwdSkgIHwgKExMX1VDUERfU1lOQzM8PDE1dSkpCisjZGVmaW5lIExMX1VDUERfT1JERVJFRF9TRVRfU09QMl9ERUJVRyAgKExMX1VDUERfU1lOQzEgfCAoTExfVUNQRF9SU1QyPDw1dSkgIHwgKExMX1VDUERfU1lOQzM8PDEwdSkgfCAoTExfVUNQRF9TWU5DMjw8MTV1KSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FQ19NT0RFIFJvbGUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VDUERfUk9MRV9TTksgICAgICAgICAgICAgVUNQRF9DUl9BTkFNT0RFICAgICAgICAvKiE8IE1vZGUgU05LIFJkICAgICAgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9ST0xFX1NSQyAgICAgICAgICAgICAweDBVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUNfUkVTSVNUT1IgcmVzaXN0b3IgdmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1JFU0lTVE9SX0RFRkFVTFQgICAgVUNQRF9DUl9BTkFTVUJNT0RFXzAgICAvKiE8IFJwIGRlZmF1bHQgICovCisjZGVmaW5lIExMX1VDUERfUkVTSVNUT1JfMV81QSAgICAgICBVQ1BEX0NSX0FOQVNVQk1PREVfMSAgIC8qITwgUnAgMS41IEEgICAgKi8KKyNkZWZpbmUgTExfVUNQRF9SRVNJU1RPUl8zXzBBICAgICAgIFVDUERfQ1JfQU5BU1VCTU9ERSAgICAgLyohPCBScCAzLjAgQSAgICAqLworI2RlZmluZSBMTF9VQ1BEX1JFU0lTVE9SX05PTkUgICAgICAgMHgwVSAgICAgICAgICAgICAgICAgICAgLyohPCBObyByZXNpc3RvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VDX0NGRzFfT1JERVJTRVQgb3JkZXJzZXQgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VDUERfT1JERVJTRVRfU09QICAgICAgICAgVUNQRF9DRkcxX1JYT1JEU0VURU5fMAorI2RlZmluZSBMTF9VQ1BEX09SREVSU0VUX1NPUDEgICAgICAgIFVDUERfQ0ZHMV9SWE9SRFNFVEVOXzEKKyNkZWZpbmUgTExfVUNQRF9PUkRFUlNFVF9TT1AyICAgICAgICBVQ1BEX0NGRzFfUlhPUkRTRVRFTl8yCisjZGVmaW5lIExMX1VDUERfT1JERVJTRVRfSEFSRFJTVCAgICAgVUNQRF9DRkcxX1JYT1JEU0VURU5fMworI2RlZmluZSBMTF9VQ1BEX09SREVSU0VUX0NBQkxFUlNUICAgIFVDUERfQ0ZHMV9SWE9SRFNFVEVOXzQKKyNkZWZpbmUgTExfVUNQRF9PUkRFUlNFVF9TT1AxX0RFQlVHICBVQ1BEX0NGRzFfUlhPUkRTRVRFTl81CisjZGVmaW5lIExMX1VDUERfT1JERVJTRVRfU09QMl9ERUJVRyAgVUNQRF9DRkcxX1JYT1JEU0VURU5fNgorI2RlZmluZSBMTF9VQ1BEX09SREVSU0VUX1NPUF9FWFQxICAgIFVDUERfQ0ZHMV9SWE9SRFNFVEVOXzcKKyNkZWZpbmUgTExfVUNQRF9PUkRFUlNFVF9TT1BfRVhUMiAgICBVQ1BEX0NGRzFfUlhPUkRTRVRFTl84CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUNfQ0N4RVZUICBjY3hldnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1NOS19DQzFfVk9QRU4gICAgICAweDAwdQorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzFfVlJQICAgICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzFfMAorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzFfVlJQMTVBICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzFfMQorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzFfVlJQMzBBICAgICAoVUNQRF9TUl9UWVBFQ19WU1RBVEVfQ0MxXzAgfCBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzFfMSkKKworI2RlZmluZSBMTF9VQ1BEX1NOS19DQzJfVk9QRU4gICAgICAweDAwdQorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzJfVlJQICAgICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzJfMAorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzJfVlJQMTVBICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzJfMQorI2RlZmluZSBMTF9VQ1BEX1NOS19DQzJfVlJQMzBBICAgICAoVUNQRF9TUl9UWVBFQ19WU1RBVEVfQ0MyXzAgfCBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzJfMSkKKworI2RlZmluZSBMTF9VQ1BEX1NSQ19DQzFfVlJBICAgICAgICAweDBVCisjZGVmaW5lIExMX1VDUERfU1JDX0NDMV9WUkQgICAgICAgIFVDUERfU1JfVFlQRUNfVlNUQVRFX0NDMV8wCisjZGVmaW5lIExMX1VDUERfU1JDX0NDMV9PUEVOICAgICAgIFVDUERfU1JfVFlQRUNfVlNUQVRFX0NDMV8xCisKKyNkZWZpbmUgTExfVUNQRF9TUkNfQ0MyX1ZSQSAgICAgICAgMHgwVQorI2RlZmluZSBMTF9VQ1BEX1NSQ19DQzJfVlJEICAgICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzJfMAorI2RlZmluZSBMTF9VQ1BEX1NSQ19DQzJfT1BFTiAgICAgICBVQ1BEX1NSX1RZUEVDX1ZTVEFURV9DQzJfMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VDX1BTQyBwcmVzY2FsZXIgZm9yIFVDUERDTEsKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1BTQ19ESVYxICAgICAgICAgICAgMHgwdQorI2RlZmluZSBMTF9VQ1BEX1BTQ19ESVYyICAgICAgICAgICAgVUNQRF9DRkcxX1BTQ19VQ1BEQ0xLXzAKKyNkZWZpbmUgTExfVUNQRF9QU0NfRElWNCAgICAgICAgICAgIFVDUERfQ0ZHMV9QU0NfVUNQRENMS18xCisjZGVmaW5lIExMX1VDUERfUFNDX0RJVjggICAgICAgICAgICAoVUNQRF9DRkcxX1BTQ19VQ1BEQ0xLXzEgfCBVQ1BEX0NGRzFfUFNDX1VDUERDTEtfMCkKKyNkZWZpbmUgTExfVUNQRF9QU0NfRElWMTYgICAgICAgICAgIFVDUERfQ0ZHMV9QU0NfVUNQRENMS18yCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUNfQ0NFTkFCTEUgY2MgcGluIGVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VDUERfQ0NFTkFCTEVfTk9ORSAgICAgICAweDBVCisjZGVmaW5lIExMX1VDUERfQ0NFTkFCTEVfQ0MxICAgICAgICBVQ1BEX0NSX0NDRU5BQkxFXzAKKyNkZWZpbmUgTExfVUNQRF9DQ0VOQUJMRV9DQzIgICAgICAgIFVDUERfQ1JfQ0NFTkFCTEVfMQorI2RlZmluZSBMTF9VQ1BEX0NDRU5BQkxFX0NDMUNDMiAgICAgKFVDUERfQ1JfQ0NFTkFCTEVfMCB8IFVDUERfQ1JfQ0NFTkFCTEVfMSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FQ19DQ1BJTiBjYyBwaW4gc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVUNQRF9DQ1BJTl9DQzEgICAgICAgICAgIDB4MFUKKyNkZWZpbmUgTExfVUNQRF9DQ1BJTl9DQzIgICAgICAgICAgIFVDUERfQ1JfUEhZQ0NTRUwKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FQ19SWE1PREUgcnggbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VDUERfUlhNT0RFX05PUk1BTCAgICAgICAgICAgMHgwVQorI2RlZmluZSBMTF9VQ1BEX1JYTU9ERV9CSVNUX1RFU1RfREFUQSAgIFVDUERfQ1JfUlhNT0RFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUNfVFhNT0RFIHR4IG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VQ1BEX1RYTU9ERV9OT1JNQUwgICAgICAgICAgIDB4MFUKKyNkZWZpbmUgTExfVUNQRF9UWE1PREVfQ0FCTEVfUkVTRVQgICAgICBVQ1BEX0NSX1RYTU9ERV8wCisjZGVmaW5lIExMX1VDUERfVFhNT0RFX0JJU1RfQ0FSUklFUjIgICAgVUNQRF9DUl9UWE1PREVfMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VDX1JYT1JEU0VUIHJ4IG9yZGVyc2V0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVUNQRF9SWE9SRFNFVF9TT1AgICAgICAgICAgICAgMHgwVQorI2RlZmluZSBMTF9VQ1BEX1JYT1JEU0VUX1NPUDEgICAgICAgICAgICBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8wCisjZGVmaW5lIExMX1VDUERfUlhPUkRTRVRfU09QMiAgICAgICAgICAgIFVDUERfUlhfT1JEU0VUX1JYT1JEU0VUXzEKKyNkZWZpbmUgTExfVUNQRF9SWE9SRFNFVF9TT1AxX0RFQlVHICAgICAgKFVDUERfUlhfT1JEU0VUX1JYT1JEU0VUXzAgfCBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8xKQorI2RlZmluZSBMTF9VQ1BEX1JYT1JEU0VUX1NPUDJfREVCVUcgICAgICBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8yCisjZGVmaW5lIExMX1VDUERfUlhPUkRTRVRfQ0FCTEVfUkVTRVQgICAgIChVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8yIHwgVUNQRF9SWF9PUkRTRVRfUlhPUkRTRVRfMCkKKyNkZWZpbmUgTExfVUNQRF9SWE9SRFNFVF9TT1BFWFQxICAgICAgICAgKFVDUERfUlhfT1JEU0VUX1JYT1JEU0VUXzIgfCBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8xKQorI2RlZmluZSBMTF9VQ1BEX1JYT1JEU0VUX1NPUEVYVDIgICAgICAgICAoVUNQRF9SWF9PUkRTRVRfUlhPUkRTRVRfMiB8IFVDUERfUlhfT1JEU0VUX1JYT1JEU0VUXzEgfCBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVF8wKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FeHBvcnRlZF9NYWNyb3MgVUNQRCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBVQ1BEIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVUNQRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfVUNQRF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVUNQRCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfVUNQRF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoKF9fSU5TVEFOQ0VfXyktPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVQ1BEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfQ0ZHMSBDRkcxIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFVDUEQgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgQ0ZHMSAgICAgICAgICBVQ1BERU4gICAgICAgICAgIExMX1VDUERfRW5hYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0VuYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5DRkcxLCBVQ1BEX0NGRzFfVUNQREVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFVDUEQgcGVyaXBoZXJhbAorICAqIEBub3RlICAgV2hlbiBkaXNhYmxpbmcgdGhlIFVDUEQsIGZvbGxvdyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbiB0aGUgUmVmZXJlbmNlIE1hbnVhbC4KKyAgKiBAcm10b2xsIENGRzEgICAgICAgICAgVUNQREVOICAgICAgICAgICBMTF9VQ1BEX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRGlzYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9VQ1BERU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVDUEQgcGVyaXBoZXJhbCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDRkcxICAgICAgICAgIFVDUERFTiAgICAgICAgICAgTExfVUNQRF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlZChVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9VQ1BERU4pID09IChVQ1BEX0NGRzFfVUNQREVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcmVjZWl2ZXIgb3JkZXJlZCBzZXQgZGV0ZWN0aW9uIGVuYWJsZQorICAqIEBybXRvbGwgQ0ZHMSAgICAgICAgICBSWE9SRFNFVEVOICAgICAgICAgIExMX1VDUERfU2V0UnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgT3JkZXJTZXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJTRVRfU09QCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9PUkRFUlNFVF9TT1AxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9PUkRFUlNFVF9TT1AyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9PUkRFUlNFVF9IQVJEUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9PUkRFUlNFVF9DQUJMRVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJTRVRfU09QMV9ERUJVRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJTRVRfU09QMl9ERUJVRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJTRVRfU09QX0VYVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX09SREVSU0VUX1NPUF9FWFQyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldFJ4T3JkZXJTZXQoVUNQRF9UeXBlRGVmICpVQ1BEeCwgdWludDMyX3QgT3JkZXJTZXQpCit7CisgIE1PRElGWV9SRUcoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9SWE9SRFNFVEVOLCBPcmRlclNldCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBwcmVzY2FsZXIgZm9yIHVjcGQgY2xvY2sKKyAgKiBAcm10b2xsIENGRzEgICAgICAgICAgVUNQRENMSyAgICAgICAgICBMTF9VQ1BEX1NldFBTQ0NsaworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHNjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9QU0NfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUFNDX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9QU0NfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUFNDX0RJVjE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldFBTQ0NsayhVQ1BEX1R5cGVEZWYgKlVDUER4LCB1aW50MzJfdCBQc2MpCit7CisgIE1PRElGWV9SRUcoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9QU0NfVUNQRENMSywgUHNjKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG51bWJlciBvZiBjeWNsZXMgKG1pbnVzIDEpIG9mIHRoZSBoYWxmIGJpdCBjbG9jaworICAqIEBybXRvbGwgQ0ZHMSAgICAgICAgICBUUkFOU1dJTiAgICAgICAgICBMTF9VQ1BEX1NldFRyYW5zV2luCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHBhcmFtICBUcmFuc1dpbiBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgxIGFuZCBNYXhfRGF0YT0weDFGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldFRyYW5zV2luKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IFRyYW5zV2luKQoreworICBNT0RJRllfUkVHKFVDUER4LT5DRkcxLCBVQ1BEX0NGRzFfVFJBTlNXSU4sIFRyYW5zV2luIDw8IFVDUERfQ0ZHMV9UUkFOU1dJTl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2xvY2sgZGl2aWRlciB2YWx1ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZyYW1lIGdhcAorICAqIEBybXRvbGwgQ0ZHMSAgICAgICAgICBJRlJHQVAgICAgICAgICAgTExfVUNQRF9TZXRJZnJHYXAKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIElmckdhcCBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgxIGFuZCBNYXhfRGF0YT0weDFGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldElmckdhcChVQ1BEX1R5cGVEZWYgKlVDUER4LCB1aW50MzJfdCBJZnJHYXApCit7CisgIE1PRElGWV9SRUcoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9JRlJHQVAsIElmckdhcCA8PCBVQ1BEX0NGRzFfSUZSR0FQX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjbG9jayBkaXZpZGVyIHZhbHVlIHRvIGdlbmVyYXRlIGFuIGludGVyZnJhbWUgZ2FwCisgICogQHJtdG9sbCBDRkcxICAgICAgICAgIEhCSVRDTEtESVYgICAgICAgICAgTExfVUNQRF9TZXRIYml0Q2xvY2tEaXYKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhiaXRDbG9jayBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weDNGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldEhiaXRDbG9ja0RpdihVQ1BEX1R5cGVEZWYgKlVDUER4LCB1aW50MzJfdCBIYml0Q2xvY2spCit7CisgIE1PRElGWV9SRUcoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9IQklUQ0xLRElWLCBIYml0Q2xvY2sgPDwgVUNQRF9DRkcxX0hCSVRDTEtESVZfUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQ1BEX0xMX0VGX0NGRzIgQ0ZHMiByZWdpc3RlcgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3YWtldXAgbW9kZQorICAqIEBybXRvbGwgQ0ZHMiAgICAgICAgICBXVVBFTiAgICAgICAgICBMTF9VQ1BEX1dha2VVcEVuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9XYWtlVXBFbmFibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q0ZHMiwgVUNQRF9DRkcyX1dVUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB3YWtldXAgbW9kZQorICAqIEBybXRvbGwgQ0ZHMiAgICAgICAgICBXVVBFTiAgICAgICAgICBMTF9VQ1BEX1dha2VVcERpc2FibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfV2FrZVVwRGlzYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNGRzIsIFVDUERfQ0ZHMl9XVVBFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgY2xvY2sgZW5hYmxlCisgICogQHJtdG9sbCBDRkcyICAgICAgICAgIEZPUkNFQ0xLICAgICAgICAgIExMX1VDUERfRm9yY2VDbG9ja0VuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9Gb3JjZUNsb2NrRW5hYmxlKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPkNGRzIsIFVDUERfQ0ZHMl9GT1JDRUNMSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgY2xvY2sgZGlzYWJsZQorICAqIEBybXRvbGwgQ0ZHMiAgICAgICAgICBGT1JDRUNMSyAgICAgICAgICBMTF9VQ1BEX0ZvcmNlQ2xvY2tEaXNhYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0ZvcmNlQ2xvY2tEaXNhYmxlKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+Q0ZHMiwgVUNQRF9DRkcyX0ZPUkNFQ0xLKTsKK30KKworLyoqCisgICogQGJyaWVmICBSeEZpbHRlciBlbmFibGUKKyAgKiBAcm10b2xsIENGRzIgICAgICAgICAgUlhGSUxURElTICAgICAgICAgIExMX1VDUERfUnhGaWx0ZXJFbmFibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfUnhGaWx0ZXJFbmFibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5DRkcyLCBVQ1BEX0NGRzJfUlhGSUxURElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBSeEZpbHRlciBkaXNhYmxlCisgICogQHJtdG9sbCBDRkcyICAgICAgICAgIFJYRklMVERJUyAgICAgICAgICBMTF9VQ1BEX1J4RmlsdGVyRGlzYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9SeEZpbHRlckRpc2FibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q0ZHMiwgVUNQRF9DRkcyX1JYRklMVERJUyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FRl9DUiBDUiByZWdpc3RlcgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFR5cGUgQyBkZXRlY3RvciBmb3IgQ0MyIGVuYWJsZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgQ0MyVENESVMgICAgICAgICAgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMkVuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMkVuYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNSLCBVQ1BEX0NSX0NDMlRDRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBUeXBlIEMgZGV0ZWN0b3IgZm9yIENDMiBkaXNhYmxlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBDQzJUQ0RJUyAgICAgICAgICBMTF9VQ1BEX1R5cGVDRGV0ZWN0aW9uQ0MyRGlzYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMkRpc2FibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfQ0MyVENESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFR5cGUgQyBkZXRlY3RvciBmb3IgQ0MxIGVuYWJsZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgQ0MxVENESVMgICAgICAgICAgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMUVuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMUVuYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNSLCBVQ1BEX0NSX0NDMVRDRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBUeXBlIEMgZGV0ZWN0b3IgZm9yIENDMSBkaXNhYmxlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBDQzFUQ0RJUyAgICAgICAgICBMTF9VQ1BEX1R5cGVDRGV0ZWN0aW9uQ0MxRGlzYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeXBlQ0RldGVjdGlvbkNDMURpc2FibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfQ0MxVENESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNvdXJjZSBWY29ubiBkaXNjaGFyZ2UgZW5hYmxlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBSRENIICAgICAgICAgIExMX1VDUERfVmNvbm5EaXNjaGFyZ2VFbmFibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfVmNvbm5EaXNjaGFyZ2VFbmFibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfUkRDSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU291cmNlIFZjb25uIGRpc2NoYXJnZSBkaXNhYmxlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBSRENIICAgICAgICAgIExMX1VDUERfVmNvbm5EaXNjaGFyZ2VEaXNhYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1Zjb25uRGlzY2hhcmdlRGlzYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNSLCBVQ1BEX0NSX1JEQ0gpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNpZ25hbCBGYXN0IFJvbGUgU3dhcCByZXF1ZXN0CisgICogQHJtdG9sbCBDUiAgICAgICAgICBGUlNUWCAgICAgICAgICBMTF9VQ1BEX1Zjb25uRGlzY2hhcmdlRGlzYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9TaWduYWxGUlNUWChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5DUiwgVUNQRF9DUl9GUlNUWCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmFzdCBSb2xlIHN3YXAgUlggZGV0ZWN0aW9uIGVuYWJsZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgRlJTUlhFTiAgICAgICAgICBMTF9VQ1BEX0ZSU0RldGVjdGlvbkVuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9GUlNEZXRlY3Rpb25FbmFibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfRlJTUlhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmFzdCBSb2xlIHN3YXAgUlggZGV0ZWN0aW9uIGRpc2FibGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgIEZSU1JYRU4gICAgICAgICAgTExfVUNQRF9GUlNEZXRlY3Rpb25EaXNhYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0ZSU0RldGVjdGlvbkRpc2FibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5DUiwgVUNQRF9DUl9GUlNSWEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY2MgZW5hYmxlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBDQzFWQ09OTkVOICAgICAgICAgIExMX1VDUERfU2V0Y2NFbmFibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENDRW5hYmxlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9DQ0VOQUJMRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9DQ0VOQUJMRV9DQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX0NDRU5BQkxFX0NDMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfQ0NFTkFCTEVfQ0MxQ0MyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldGNjRW5hYmxlKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IENDRW5hYmxlKQoreworICBNT0RJRllfUkVHKFVDUER4LT5DUiwgVUNQRF9DUl9DQ0VOQUJMRSwgQ0NFbmFibGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBVQ1BEIFNOSyByb2xlCisgICogQHJtdG9sbCBDUiAgICAgICAgQU5BTU9ERSAgICAgICAgICBMTF9VQ1BEX1NldFNOS1JvbGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfU2V0U05LUm9sZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5DUiwgVUNQRF9DUl9BTkFNT0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVUNQRCBTUkMgcm9sZQorICAqIEBybXRvbGwgQ1IgICAgICAgIEFOQU1PREUgICAgICAgICAgTExfVUNQRF9TZXRTUkNSb2xlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldFNSQ1JvbGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5DUiwgVUNQRF9DUl9BTkFNT0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVUNQRCBSb2xlCisgICogQHJtdG9sbCBDUiAgICAgICAgICBBTkFNT0RFICAgICAgICAgIExMX1VDUERfR2V0Um9sZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1JPTEVfU05LCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9ST0xFX1NSQworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfR2V0Um9sZShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVUNQRHgtPkNSLCBVQ1BEX0NSX0FOQU1PREUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUnAgcmVzaXN0b3IKKyAgKiBAcm10b2xsIENSICAgICAgICBBTkFTVUJNT0RFICAgICAgICAgIExMX1VDUERfU2V0UnBSZXNpc3RvcgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVzaXN0b3IgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1JFU0lTVE9SX0RFRkFVTFQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1JFU0lTVE9SXzFfNUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1JFU0lTVE9SXzNfMEEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1JFU0lTVE9SX05PTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfU2V0UnBSZXNpc3RvcihVQ1BEX1R5cGVEZWYgKlVDUER4LCB1aW50MzJfdCBSZXNpc3RvcikKK3sKKyAgTU9ESUZZX1JFRyhVQ1BEeC0+Q1IsIFVDUERfQ1JfQU5BU1VCTU9ERSwgIFJlc2lzdG9yKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ0MgcGluCisgICogQHJtdG9sbCBDUiAgICAgICAgUEhZQ0NTRUwgICAgICAgICAgTExfVUNQRF9TZXRDQ1BpbgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ0NQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX0NDUElOX0NDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfQ0NQSU5fQ0MyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldENDUGluKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IENDUGluKQoreworICBNT0RJRllfUkVHKFVDUER4LT5DUiwgVUNQRF9DUl9QSFlDQ1NFTCwgIENDUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBSeCBlbmFibGUKKyAgKiBAcm10b2xsIENSICAgICAgICBQSFlSWEVOICAgICAgICAgIExMX1VDUERfUnhFbmFibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfUnhFbmFibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfUEhZUlhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUnggZGlzYWJsZQorICAqIEBybXRvbGwgQ1IgICAgICAgIFBIWVJYRU4gICAgICAgICAgTExfVUNQRF9SeERpc2FibGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfUnhEaXNhYmxlKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfUEhZUlhFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJ4IG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICBSWE1PREUgICAgICAgICAgTExfVUNQRF9TZXRSeE1vZGUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJ4TW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUlhNT0RFX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUlhNT0RFX0JJU1RfVEVTVF9EQVRBCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NldFJ4TW9kZShVQ1BEX1R5cGVEZWYgKlVDUER4LCB1aW50MzJfdCBSeE1vZGUpCit7CisgIE1PRElGWV9SRUcoVUNQRHgtPkNSLCBVQ1BEX0NSX1JYTU9ERSwgUnhNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIEhhcmQgUmVzZXQKKyAgKiBAcm10b2xsIENSICAgICAgICBUWEhSU1QgICAgICAgICAgTExfVUNQRF9TZW5kSGFyZFJlc2V0CisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1NlbmRIYXJkUmVzZXQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+Q1IsIFVDUERfQ1JfVFhIUlNUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIG1lc3NhZ2UKKyAgKiBAcm10b2xsIENSICAgICAgICBUWFNFTkQgICAgICAgICAgTExfVUNQRF9TZW5kTWVzc2FnZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9TZW5kTWVzc2FnZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5DUiwgVUNQRF9DUl9UWFNFTkQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUeCBtb2RlCisgICogQHJtdG9sbCBDUiAgICAgICAgVFhNT0RFICAgICAgICAgIExMX1VDUERfU2V0VHhNb2RlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHBhcmFtICBUeE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1RYTU9ERV9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX1RYTU9ERV9DQUJMRV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfVFhNT0RFX0JJU1RfQ0FSUklFUjIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfU2V0VHhNb2RlKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IFR4TW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhVQ1BEeC0+Q1IsIFVDUERfQ1JfVFhNT0RFLCBUeE1vZGUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZSUyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBGUlNFVlRJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfRlJTCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0VuYWJsZUlUX0ZSUyhVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX0ZSU0VWVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHlwZSBjIGV2ZW50IG9uIENDMgorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRZUEVDRVZUMklFICAgICAgICBMTF9VQ1BEX0VuYWJsZUlUX1R5cGVDRXZlbnRDQzIKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHlwZUNFdmVudENDMihVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RZUEVDRVZUMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHlwZSBjIGV2ZW50IG9uIENDMQorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRZUEVDRVZUMUlFICAgICAgICBMTF9VQ1BEX0VuYWJsZUlUX1R5cGVDRXZlbnRDQzEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHlwZUNFdmVudENDMShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RZUEVDRVZUMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUnggbWVzc2FnZSBlbmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgUlhNU0dFTkRJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfUnhNc2dFbmQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfUnhNc2dFbmQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9SWE1TR0VORElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUnggb3ZlcnJ1biBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBSWE9WUklFICAgICAgICAgTExfVUNQRF9FbmFibGVJVF9SeE92cgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9FbmFibGVJVF9SeE92cihVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1JYT1ZSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSeCBoYXJkIHJlc3J0IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFJYSFJTVERFVElFICAgICAgICAgTExfVUNQRF9FbmFibGVJVF9SeEhSU1QKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfUnhIUlNUKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhIUlNUREVUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSeCBvcmRlcnNldCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBSWE9SRERFVElFICAgICAgICAgTExfVUNQRF9FbmFibGVJVF9SeE9yZGVyU2V0CisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0VuYWJsZUlUX1J4T3JkZXJTZXQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9SWE9SRERFVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUnggbm9uIGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFJYTkVJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfUnhORQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9FbmFibGVJVF9SeE5FKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhORUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFggdW5kZXJydW4gaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgVFhVTkRJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfVHhVTkQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHhVTkQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9UWFVORElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaGFyZCByZXNldCBzZW50IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIEhSU1RTRU5USUUgICAgICAgICBMTF9VQ1BEX0VuYWJsZUlUX1R4SFJTVFNFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHhIUlNUU0VOVChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX0hSU1RTRU5USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBoYXJkIHJlc2V0IGRpc2NhcmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgSFJTVERJU0NJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfVHhIUlNURElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9FbmFibGVJVF9UeEhSU1RESVNDKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfSFJTVERJU0NJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFR4IG1lc3NhZ2UgYWJvcnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgVFhNU0dBQlRJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfVHhNU0dBQlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHhNU0dBQlQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9UWE1TR0FCVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHggbWVzc2FnZSBzZW50IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHU0VOVElFICAgICAgICAgTExfVUNQRF9FbmFibGVJVF9UeE1TR1NFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRW5hYmxlSVRfVHhNU0dTRU5UKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfVFhNU0dTRU5USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBtZXNzYWdlIGRpc2NhcmRlZCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBUWE1TR0RJU0NJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfVHhNU0dESVNDCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0VuYWJsZUlUX1R4TVNHRElTQyhVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHRElTQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHggZGF0YSByZWNlaXZlIGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYSVNJRSAgICAgICAgIExMX1VDUERfRW5hYmxlSVRfVHhJUworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9FbmFibGVJVF9UeElTKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfVFhJU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZSUyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBGUlNFVlRJRSAgICAgICAgIExMX1VDUERfRGlzYWJsZUlUX0ZSUworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfRlJTKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9GUlNFVlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0eXBlIGMgZXZlbnQgb24gQ0MyCisgICogQHJtdG9sbCBJTVIgICAgICAgICAgVFlQRUNFVlQySUUgICAgICAgIExMX1VDUERfRGlzYWJsZUlUX1R5cGVDRXZlbnRDQzIKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfRGlzYWJsZUlUX1R5cGVDRXZlbnRDQzIoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RZUEVDRVZUMklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHR5cGUgYyBldmVudCBvbiBDQzEKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBUWVBFQ0VWVDFJRSAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfVHlwZUNFdmVudENDMQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfVHlwZUNFdmVudENDMShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfVFlQRUNFVlQxSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUnggbWVzc2FnZSBlbmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgUlhNU0dFTkRJRSAgICAgICAgIExMX1VDUERfRGlzYWJsZUlUX1J4TXNnRW5kCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0Rpc2FibGVJVF9SeE1zZ0VuZChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhNU0dFTkRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBvdmVycnVuIGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFJYT1ZSSUUgICAgICAgICBMTF9VQ1BEX0Rpc2FibGVJVF9SeE92cgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfUnhPdnIoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1JYT1ZSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUnggaGFyZCByZXNydCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBSWEhSU1RERVRJRSAgICAgICAgIExMX1VDUERfRGlzYWJsZUlUX1J4SFJTVAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfUnhIUlNUKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9SWEhSU1RERVRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBvcmRlcnNldCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBSWE9SRERFVElFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfUnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfUnhPcmRlclNldChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhPUkRERVRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBub24gZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBJTVIgICAgICAgICAgUlhORUlFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfUnhORQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfUnhORShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhORUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRYIHVuZGVycnVuIGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYVU5ESUUgICAgICAgICBMTF9VQ1BEX0Rpc2FibGVJVF9UeFVORAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfVHhVTkQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYVU5ESUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaGFyZCByZXNldCBzZW50IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIEhSU1RTRU5USUUgICAgICAgICBMTF9VQ1BEX0Rpc2FibGVJVF9UeEhSU1RTRU5UCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0Rpc2FibGVJVF9UeEhSU1RTRU5UKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9IUlNUU0VOVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGhhcmQgcmVzZXQgZGlzY2FyZCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBIUlNURElTQ0lFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfVHhIUlNURElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfVHhIUlNURElTQyhVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfSFJTVERJU0NJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUeCBtZXNzYWdlIGFib3J0IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHQUJUSUUgICAgICAgICBMTF9VQ1BEX0Rpc2FibGVJVF9UeE1TR0FCVAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9EaXNhYmxlSVRfVHhNU0dBQlQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHQUJUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHggbWVzc2FnZSBzZW50IGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHU0VOVElFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfVHhNU0dTRU5UCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0Rpc2FibGVJVF9UeE1TR1NFTlQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHU0VOVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFR4IG1lc3NhZ2UgZGlzY2FyZGVkIGludGVycnVwdAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHRElTQ0lFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfVHhNU0dESVNDCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0Rpc2FibGVJVF9UeE1TR0RJU0MoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHRElTQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFR4IGRhdGEgcmVjZWl2ZSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBUWElTSUUgICAgICAgICBMTF9VQ1BEX0Rpc2FibGVJVF9UeElTCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0Rpc2FibGVJVF9UeElTKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIENMRUFSX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9UWElTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZSUyBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIEZSU0VWVElFICAgICAgICAgTExfVUNQRF9EaXNhYmxlSVRfRlJTCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9Jc0VuYWJsZUlUX0ZSUyhVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfRlJTRVZUSUUpID09IFVDUERfSU1SX0ZSU0VWVElFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdHlwZSBjIGV2ZW50IG9uIENDMiBlbmFibGVkCisgICogQHJtdG9sbCBJTVIgICAgICAgICAgVFlQRUNFVlQySUUgICAgICAgIExMX1VDUERfRGlzYWJsZUlUX1R5cGVDRXZlbnRDQzIKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfVHlwZUNFdmVudENDMihVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfVFlQRUNFVlQySUUpID09IFVDUERfSU1SX1RZUEVDRVZUMklFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdHlwZSBjIGV2ZW50IG9uIENDMSBlbmFibGVkCisgICogQHJtdG9sbCBJTVIyICAgICAgICAgIFRZUEVDRVZUMUlFICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfVHlwZUNFdmVudENDMQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVJVF9UeXBlQ0V2ZW50Q0MxKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9UWVBFQ0VWVDFJRSkgPT0gVUNQRF9JTVJfVFlQRUNFVlQxSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBtZXNzYWdlIGVuZCBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFJYTVNHRU5ESUUgICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfUnhNc2dFbmQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfUnhNc2dFbmQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1JYTVNHRU5ESUUpID09IFVDUERfSU1SX1JYTVNHRU5ESUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBvdmVycnVuIGludGVycnVwdCBlbmFibGVkCisgICogQHJtdG9sbCBJTVIgICAgICAgICAgUlhPVlJJRSAgICAgICAgIExMX1VDUERfSXNFbmFibGVJVF9SeE92cgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVJVF9SeE92cihVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhPVlJJRSkgPT0gVUNQRF9JTVJfUlhPVlJJRSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGhhcmQgcmVzcnQgaW50ZXJydXB0IGVuYWJsZWQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBSWEhSU1RERVRJRSAgICAgICAgIExMX1VDUERfSXNFbmFibGVJVF9SeEhSU1QKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfUnhIUlNUKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9SWEhSU1RERVRJRSkgPT0gVUNQRF9JTVJfUlhIUlNUREVUSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBvcmRlcnNldCBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFJYT1JEREVUSUUgICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfUnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVJVF9SeE9yZGVyU2V0KFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9SWE9SRERFVElFKSA9PSBVQ1BEX0lNUl9SWE9SRERFVElFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUnggbm9uIGVtcHR5IGludGVycnVwdCBlbmFibGVkCisgICogQHJtdG9sbCBJTVIgICAgICAgICAgUlhORUlFICAgICAgICAgTExfVUNQRF9Jc0VuYWJsZUlUX1J4TkUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfUnhORShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfUlhORUlFKSA9PSBVQ1BEX0lNUl9SWE5FSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUWCB1bmRlcnJ1biBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYVU5ESUUgICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhVTkQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhVTkQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYVU5ESUUpID09IFVDUERfSU1SX1RYVU5ESUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkIHJlc2V0IHNlbnQgaW50ZXJydXB0IGVuYWJsZWQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBIUlNUU0VOVElFICAgICAgICAgTExfVUNQRF9Jc0VuYWJsZUlUX1R4SFJTVFNFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhIUlNUU0VOVChVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPklNUiwgVUNQRF9JTVJfSFJTVFNFTlRJRSkgPT0gVUNQRF9JTVJfSFJTVFNFTlRJRSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGhhcmQgcmVzZXQgZGlzY2FyZCBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIEhSU1RESVNDSUUgICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhIUlNURElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVJVF9UeEhSU1RESVNDKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9IUlNURElTQ0lFKSA9PSBVQ1BEX0lNUl9IUlNURElTQ0lFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggbWVzc2FnZSBhYm9ydCBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHQUJUSUUgICAgICAgICBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhNU0dBQlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhNU0dBQlQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHQUJUSUUpID09IFVDUERfSU1SX1RYTVNHQUJUSUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBtZXNzYWdlIHNlbnQgaW50ZXJydXB0IGVuYWJsZWQKKyAgKiBAcm10b2xsIElNUiAgICAgICAgICBUWE1TR1NFTlRJRSAgICAgICAgIExMX1VDUERfSXNFbmFibGVJVF9UeE1TR1NFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlSVRfVHhNU0dTRU5UKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+SU1SLCBVQ1BEX0lNUl9UWE1TR1NFTlRJRSkgPT0gVUNQRF9JTVJfVFhNU0dTRU5USUUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBtZXNzYWdlIGRpc2NhcmRlZCBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYTVNHRElTQ0lFICAgICAgICAgTExfVUNQRF9Jc0VuYWJsZUlUX1R4TVNHRElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVJVF9UeE1TR0RJU0MoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYTVNHRElTQ0lFKSA9PSBVQ1BEX0lNUl9UWE1TR0RJU0NJRSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFR4IGRhdGEgcmVjZWl2ZSBpbnRlcnJ1cHQgZW5hYmxlZAorICAqIEBybXRvbGwgSU1SICAgICAgICAgIFRYSVNJRSAgICAgICAgIExMX1VDUERfSXNFbmFibGVJVF9UeElTCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9Jc0VuYWJsZUlUX1R4SVMoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5JTVIsIFVDUERfSU1SX1RYSVNJRSkgPT0gVUNQRF9JTVJfVFhJU0lFKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUNQRF9MTF9FRl9JVF9DbGVhciBJbnRlcnJ1cHQgQ2xlYXIKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDbGVhciBGUlMgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRlJTRVZUSUUgICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19GUlMKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX0ZSUyhVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX0ZSU0VWVENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0eXBlIGMgZXZlbnQgb24gQ0MyCisgICogQHJtdG9sbCBJSU1SICAgICAgICAgIFRZUEVDRVZUMklFICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19UeXBlQ0V2ZW50Q0MyCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0NsZWFyRmxhZ19UeXBlQ0V2ZW50Q0MyKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklDUiwgVUNQRF9JQ1JfVFlQRUNFVlQyQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHR5cGUgYyBldmVudCBvbiBDQzEKKyAgKiBAcm10b2xsIElJTVIgICAgICAgICAgVFlQRUNFVlQxSUUgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1R5cGVDRXZlbnRDQzEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX1R5cGVDRXZlbnRDQzEoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SUNSLCBVQ1BEX0lDUl9UWVBFQ0VWVDFDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUnggbWVzc2FnZSBlbmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlhNU0dFTkRJRSAgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1J4TXNnRW5kCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0NsZWFyRmxhZ19SeE1zZ0VuZChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX1JYTVNHRU5EQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJ4IG92ZXJydW4gaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlhPVlJJRSAgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1J4T3ZyCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX0NsZWFyRmxhZ19SeE92cihVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX1JYT1ZSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJ4IGhhcmQgcmVzcnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlhIUlNUREVUSUUgICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19SeEhSU1QKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX1J4SFJTVChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX1JYSFJTVERFVENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBSeCBvcmRlcnNldCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBSWE9SRERFVElFICAgICAgICAgTExfVUNQRF9DbGVhckZsYWdfUnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9DbGVhckZsYWdfUnhPcmRlclNldChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX1JYT1JEREVUQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFRYIHVuZGVycnVuIGludGVycnVwdAorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRYVU5ESUUgICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19UeFVORAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9DbGVhckZsYWdfVHhVTkQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SUNSLCBVQ1BEX0lDUl9UWFVORENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBoYXJkIHJlc2V0IHNlbnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSFJTVFNFTlRJRSAgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1R4SFJTVFNFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX1R4SFJTVFNFTlQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SUNSLCBVQ1BEX0lDUl9IUlNUU0VOVENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBoYXJkIHJlc2V0IGRpc2NhcmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSFJTVERJU0NJRSAgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1R4SFJTVERJU0MKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX1R4SFJTVERJU0MoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SUNSLCBVQ1BEX0lDUl9IUlNURElTQ0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUeCBtZXNzYWdlIGFib3J0IGludGVycnVwdAorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRYTVNHQUJUSUUgICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19UeE1TR0FCVAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9DbGVhckZsYWdfVHhNU0dBQlQoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgU0VUX0JJVChVQ1BEeC0+SUNSLCBVQ1BEX0lDUl9UWE1TR0FCVENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUeCBtZXNzYWdlIHNlbnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVFhNU0dTRU5USUUgICAgICAgICBMTF9VQ1BEX0NsZWFyRmxhZ19UeE1TR1NFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfQ2xlYXJGbGFnX1R4TVNHU0VOVChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5JQ1IsIFVDUERfSUNSX1RYTVNHU0VOVENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUeCBtZXNzYWdlIGRpc2NhcmRlZCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUWE1TR0RJU0NJRSAgICAgICAgIExMX1VDUERfQ2xlYXJGbGFnX1R4TVNHRElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9DbGVhckZsYWdfVHhNU0dESVNDKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPklDUiwgVUNQRF9JQ1JfVFhNU0dESVNDQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUcgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRlJTIGludGVycnVwdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgRlJTRVZUICAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfRlJTCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfRlJTKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+U1IsIFVDUERfU1JfRlJTRVZUKSA9PSBVQ1BEX1NSX0ZSU0VWVCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHR5cGUgYyBldmVudCBvbiBDQzIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFRZUEVDRVZUMiAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfVHlwZUNFdmVudENDMgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1R5cGVDRXZlbnRDQzIoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5TUiwgVUNQRF9TUl9UWVBFQ0VWVDIpID09IFVDUERfU1JfVFlQRUNFVlQyKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdHlwZSBjIGV2ZW50IG9uIENDMQorICAqIEBybXRvbGwgU1IgICAgICAgICAgVFlQRUNFVlQxICAgICAgICBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeXBlQ0V2ZW50Q0MxCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfVHlwZUNFdmVudENDMShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1RZUEVDRVZUMSkgPT0gVUNQRF9TUl9UWVBFQ0VWVDEpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBtZXNzYWdlIGVuZCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFJYTVNHRU5EICAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfUnhNc2dFbmQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19SeE1zZ0VuZChVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1JYTVNHRU5EKSA9PSBVQ1BEX1NSX1JYTVNHRU5EKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUnggb3ZlcnJ1biBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFJYT1ZSICAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfUnhPdnIKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19SeE92cihVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1JYT1ZSKSA9PSBVQ1BEX1NSX1JYT1ZSKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUnggaGFyZCByZXNydCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFJYSFJTVERFVCAgICAgICAgIExMX1VDUERfSXNBY3RpdmVGbGFnX1J4SFJTVAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1J4SFJTVChVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1JYSFJTVERFVCkgPT0gVUNQRF9TUl9SWEhSU1RERVQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBvcmRlcnNldCBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFJYT1JEREVUICAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfUnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1J4T3JkZXJTZXQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5TUiwgVUNQRF9TUl9SWE9SRERFVCkgPT0gVUNQRF9TUl9SWE9SRERFVCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IG5vbiBlbXB0eSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNSICAgICAgICAgIFJYTkUgICAgICAgICBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19SeE5FCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfUnhORShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1JYTkUpID09IFVDUERfU1JfUlhORSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFRYIHVuZGVycnVuIGludGVycnVwdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgVFhVTkQgICAgICAgICBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeFVORAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1R4VU5EKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+U1IsIFVDUERfU1JfVFhVTkQpID09IFVDUERfU1JfVFhVTkQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkIHJlc2V0IHNlbnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBTUiAgICAgICAgICBIUlNUU0VOVCAgICAgICAgIExMX1VDUERfSXNBY3RpdmVGbGFnX1R4SFJTVFNFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeEhSU1RTRU5UKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+U1IsIFVDUERfU1JfSFJTVFNFTlQpID09IFVDUERfU1JfSFJTVFNFTlQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkIHJlc2V0IGRpc2NhcmQgaW50ZXJydXB0CisgICogQHJtdG9sbCBTUiAgICAgICAgICBIUlNURElTQyAgICAgICAgIExMX1VDUERfSXNBY3RpdmVGbGFnX1R4SFJTVERJU0MKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeEhSU1RESVNDKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+U1IsIFVDUERfU1JfSFJTVERJU0MpID09IFVDUERfU1JfSFJTVERJU0MpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBtZXNzYWdlIGFib3J0IGludGVycnVwdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgVFhNU0dBQlQgICAgICAgICBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeE1TR0FCVAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1R4TVNHQUJUKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+U1IsIFVDUERfU1JfVFhNU0dBQlQpID09IFVDUERfU1JfVFhNU0dBQlQpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBtZXNzYWdlIHNlbnQgaW50ZXJydXB0CisgICogQHJtdG9sbCBTUiAgICAgICAgICBUWE1TR1NFTlQgICAgICAgICBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeE1TR1NFTlQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzQWN0aXZlRmxhZ19UeE1TR1NFTlQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5TUiwgVUNQRF9TUl9UWE1TR1NFTlQpID09IFVDUERfU1JfVFhNU0dTRU5UKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggbWVzc2FnZSBkaXNjYXJkZWQgaW50ZXJydXB0CisgICogQHJtdG9sbCBTUiAgICAgICAgIFRYTVNHRElTQyAgICAgICAgIExMX1VDUERfSXNBY3RpdmVGbGFnX1R4TVNHRElTQworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1R4TVNHRElTQyhVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVUNQRHgtPlNSLCBVQ1BEX1NSX1RYTVNHRElTQykgPT0gVUNQRF9TUl9UWE1TR0RJU0MpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBkYXRhIHJlY2VpdmUgaW50ZXJydXB0CisgICogQHJtdG9sbCBTUiAgICAgICAgICBUWElTICAgICAgICAgTExfVUNQRF9Jc0FjdGl2ZUZsYWdfVHhJUworICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNBY3RpdmVGbGFnX1R4SVMoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5TUiwgVUNQRF9TUl9UWElTKSA9PSBVQ1BEX1NSX1RYSVMpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIHZzdGF0ZSB2YWx1ZSBmb3IgQ0MyCisgICogQHJtdG9sbCBTUiAgICAgICAgICBUWElTICAgICAgICAgTExfVUNQRF9HZXRUeXBlQ1ZzdGF0ZUNDMgorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgdmFsCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9HZXRUeXBlQ1ZzdGF0ZUNDMihVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuIFVDUER4LT5TUiAmIFVDUERfU1JfVFlQRUNfVlNUQVRFX0NDMjsKK30KKworLyoqCisgICogQGJyaWVmICByZXR1cm4gdGhlIHZzdGF0ZSB2YWx1ZSBmb3IgQ0MxCisgICogQHJtdG9sbCBTUiAgICAgICAgICBUWElTICAgICAgICAgTExfVUNQRF9HZXRUeXBlQ1ZzdGF0ZUNDMQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgdmFsCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVUNQRF9HZXRUeXBlQ1ZzdGF0ZUNDMShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuIFVDUER4LT5TUiAmIFVDUERfU1JfVFlQRUNfVlNUQVRFX0NDMTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJ4IERNQSBFbmFibGUKKyAgKiBAcm10b2xsIENGRzEgICAgICAgICAgUlhETUFFTiAgICAgICAgICBMTF9VQ1BEX1J4RE1BRW5hYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1J4RE1BRW5hYmxlKFVDUERfVHlwZURlZiAqVUNQRHgpCit7CisgIFNFVF9CSVQoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9SWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBSeCBETUEgRGlzYWJsZQorICAqIEBybXRvbGwgQ0ZHMSAgICAgICAgICBSWERNQUVOICAgICAgICAgIExMX1VDUERfUnhETUFEaXNhYmxlCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VQ1BEX1J4RE1BRGlzYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBDTEVBUl9CSVQoVUNQRHgtPkNGRzEsIFVDUERfQ0ZHMV9SWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBUeCBETUEgRW5hYmxlCisgICogQHJtdG9sbCBDRkcxICAgICAgICAgIFRYRE1BRU4gICAgICAgICAgTExfVUNQRF9UeERNQUVuYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeERNQUVuYWJsZShVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBTRVRfQklUKFVDUER4LT5DRkcxLCBVQ1BEX0NGRzFfVFhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggRE1BIERpc2FibGUKKyAgKiBAcm10b2xsIENGRzEgICAgICAgICAgVFhETUFFTiAgICAgICAgICBMTF9VQ1BEX1R4RE1BRGlzYWJsZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9UeERNQURpc2FibGUoVUNQRF9UeXBlRGVmICpVQ1BEeCkKK3sKKyAgQ0xFQVJfQklUKFVDUER4LT5DRkcxLCBVQ1BEX0NGRzFfVFhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIFR4IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1VDUERfSXNFbmFibGVkVHhETUEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX0lzRW5hYmxlZFR4RE1BKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVQ1BEeC0+Q0ZHMSwgVUNQRF9DRkcxX1RYRE1BRU4pID09IChVQ1BEX0NGRzFfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgUnggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfVUNQRF9Jc0VuYWJsZWRSeERNQQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfSXNFbmFibGVkUnhETUEoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVDUER4LT5DRkcxLCBVQ1BEX0NGRzFfUlhETUFFTikgPT0gKFVDUERfQ0ZHMV9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfREFUQV9NYW5hZ2VtZW50IERBVEEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgd3JpdGUgdGhlIG9yZGVyc2V0IGZvciBUeCBtZXNzYWdlCisgICogQHJtdG9sbCBUWF9PUkRTRVQgICAgICAgICAgIFRYT1JEU0VUICAgICAgICAgICAgTExfVUNQRF9Xcml0ZVR4T3JkZXJTZXQKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4T3JkZXJTZXQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX09SREVSRURfU0VUX1NPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJFRF9TRVRfU09QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJFRF9TRVRfU09QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJFRF9TRVRfSEFSRF9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfT1JERVJFRF9TRVRfQ0FCTEVfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX09SREVSRURfU0VUX1NPUDFfREVCVUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VQ1BEX09SREVSRURfU0VUX1NPUDJfREVCVUcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfV3JpdGVUeE9yZGVyU2V0KFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IFR4T3JkZXJTZXQpCit7CisgIFdSSVRFX1JFRyhVQ1BEeC0+VFhfT1JEU0VULCBUeE9yZGVyU2V0KTsKK30KKworLyoqCisgICogQGJyaWVmICB3cml0ZSB0aGUgVHggcGF5c2l6ZQorICAqIEBybXRvbGwgVFhfUEFZU1ogICAgICAgICAgVFhQQVlTWiAgICAgICAgICAgIExMX1VDUERfV3JpdGVUeFBheVNpemUKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4UGF5U2l6ZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfV3JpdGVUeFBheVNpemUoVUNQRF9UeXBlRGVmICpVQ1BEeCwgdWludDMyX3QgVHhQYXlTaXplKQoreworICBXUklURV9SRUcoVUNQRHgtPlRYX1BBWVNaLCBUeFBheVNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGRhdGEKKyAgKiBAcm10b2xsIFRYRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfVUNQRF9Xcml0ZURhdGEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGEgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lLgorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVUNQRF9Xcml0ZURhdGEoVUNQRF9UeXBlRGVmICpVQ1BEeCwgdWludDhfdCBEYXRhKQoreworICBXUklURV9SRUcoVUNQRHgtPlRYRFIsIERhdGEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIHJlYWQgUlggdGhlIG9yZGVyc2V0CisgICogQHJtdG9sbCBSWF9PUkRTRVQgICAgICAgICAgIFJYT1JEU0VUICAgICAgICAgICAgTExfVUNQRF9SZWFkUnhPcmRlclNldAorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgUnhPcmRlclNldCBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUlhPUkRTRVRfU09QCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9SWE9SRFNFVF9TT1AxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9SWE9SRFNFVF9TT1AyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9SWE9SRFNFVF9TT1AxX0RFQlVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9SWE9SRFNFVF9TT1AyX0RFQlVHCisgICogICAgICAgICBAYXJnIEByZWYgTExfVUNQRF9SWE9SRFNFVF9DQUJMRV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUlhPUkRTRVRfU09QRVhUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VDUERfUlhPUkRTRVRfU09QRVhUMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfUmVhZFJ4T3JkZXJTZXQoVUNQRF9UeXBlRGVmIGNvbnN0ICogY29uc3QgVUNQRHgpCit7CisgIHJldHVybiBSRUFEX0JJVChVQ1BEeC0+UlhfT1JEU0VULCBVQ1BEX1JYX09SRFNFVF9SWE9SRFNFVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCB0aGUgUnggcGF5c2l6ZQorICAqIEBybXRvbGwgVFhfUEFZU1ogICAgICAgICAgVFhQQVlTWiAgICAgICAgICAgIExMX1VDUERfUmVhZFJ4UGF5U2l6ZQorICAqIEBwYXJhbSAgVUNQRHggVUNQRCBJbnN0YW5jZQorICAqIEByZXR2YWwgUlhQYXlzaXplLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VDUERfUmVhZFJ4UGF5U2l6ZShVQ1BEX1R5cGVEZWYgY29uc3QgKiBjb25zdCBVQ1BEeCkKK3sKKyAgcmV0dXJuIFJFQURfQklUKFVDUER4LT5UWF9QQVlTWiwgVUNQRF9SWF9QQVlTWl9SWFBBWVNaKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIGRhdGEKKyAgKiBAcm10b2xsIFRYRFIgICAgICAgICAgIFJYREFUQSAgICAgICAgICAgIExMX1VDUERfUmVhZERhdGEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VQ1BEX1JlYWREYXRhKFVDUERfVHlwZURlZiBjb25zdCAqIGNvbnN0IFVDUER4KQoreworICByZXR1cm4gUkVBRF9SRUcoVUNQRHgtPlJYRFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSeCBPcmRlclNldCBFeHQxCisgICogQHJtdG9sbCBSWF9PUkRFWFQxICAgICAgICAgICBSWFNPUFgxICAgICAgICAgICAgTExfVUNQRF9TZXRSeE9yZEV4dDEKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNPUEV4dCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfU2V0UnhPcmRFeHQxKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IFNPUEV4dCkKK3sKKyAgV1JJVEVfUkVHKFVDUER4LT5SWF9PUkRFWFQxLCBTT1BFeHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSeCBPcmRlclNldCBFeHQyCisgICogQHJtdG9sbCBSWF9PUkRFWFQyICAgICAgICAgICBSWFNPUFgyICAgICAgICAgICAgTExfVUNQRF9TZXRSeE9yZEV4dDIKKyAgKiBAcGFyYW0gIFVDUER4IFVDUEQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNPUEV4dCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VDUERfU2V0UnhPcmRFeHQyKFVDUERfVHlwZURlZiAqVUNQRHgsIHVpbnQzMl90IFNPUEV4dCkKK3sKKyAgV1JJVEVfUkVHKFVDUER4LT5SWF9PUkRFWFQyLCBTT1BFeHQpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVDUERfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfVUNQRF9EZUluaXQoVUNQRF9UeXBlRGVmICpVQ1BEeCk7CitFcnJvclN0YXR1cyBMTF9VQ1BEX0luaXQoVUNQRF9UeXBlRGVmICpVQ1BEeCwgTExfVUNQRF9Jbml0VHlwZURlZiAqVUNQRF9Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VDUERfU3RydWN0SW5pdChMTF9VQ1BEX0luaXRUeXBlRGVmICpVQ1BEX0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoVUNQRDEpIHx8IGRlZmluZWQgKFVDUEQyKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX1VDUERfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF91c2FydC5oIGIvSW5jL3N0bTMyZzB4eF9sbF91c2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjVmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX3VzYXJ0LmgKQEAgLTAsMCArMSw0Mzc3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3VzYXJ0LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVTQVJUIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfVVNBUlRfSAorI2RlZmluZSBTVE0zMkcweHhfTExfVVNBUlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkgfHwgZGVmaW5lZCAoVVNBUlQyKSB8fCBkZWZpbmVkIChVU0FSVDMpIHx8IGRlZmluZWQgKFVTQVJUNCkKKworLyoqIEBkZWZncm91cCBVU0FSVF9MTCBVU0FSVAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBVU0FSVCBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisvKiBBcnJheSB1c2VkIHRvIGdldCB0aGUgVVNBUlQgcHJlc2NhbGVyIGRpdmlzaW9uIGRlY2ltYWwgdmFsdWVzIHZlcnN1cyBAcmVmIFVTQVJUX0xMX0VDX1BSRVNDQUxFUiB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBVU0FSVF9QUkVTQ0FMRVJfVEFCW10gPQoreworICAodWludDE2X3QpMSwKKyAgKHVpbnQxNl90KTIsCisgICh1aW50MTZfdCk0LAorICAodWludDE2X3QpNiwKKyAgKHVpbnQxNl90KTgsCisgICh1aW50MTZfdCkxMCwKKyAgKHVpbnQxNl90KTEyLAorICAodWludDE2X3QpMTYsCisgICh1aW50MTZfdCkzMiwKKyAgKHVpbnQxNl90KTY0LAorICAodWludDE2X3QpMTI4LAorICAodWludDE2X3QpMjU2Cit9OworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMgVVNBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9NYWNyb3MgVVNBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VTX0lOSVQgVVNBUlQgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExMIFVTQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgdG8gY29tcHV0ZSB0aGUgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIGZpZWxkIGRlZmluZXMgZXhwZWN0ZWQgVXNhcnQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfREFUQVdJRFRILgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovCisKKyAgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbDsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBVU0FSVCBvdmVyc2FtcGxpbmcgbW9kZSBpcyAxNiBvciA4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcoKS4qLworCit9IExMX1VTQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgTEwgVVNBUlQgQ2xvY2sgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tPdXRwdXQ7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0NMT0NLLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIG9yIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUGhhc2U7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfUEhBU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworfSBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9ORUNGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9UWEZFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVFhGRUNGICAgICAgICAgICAgICAvKiE8IFRYIEZJRk8gRW1wdHkgQ2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENCR1RDRiAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQkdUQ0YgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGVkIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0xCRENGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgICAgIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAvKiE8IENUUyBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9SVE9DRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfRU9CQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgICAgICAgICAgICAgLyohPCBFbmQgb2YgYmxvY2sgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVURSQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1VEUkNGICAgICAgICAgICAgICAgLyohPCBTUEkgU2xhdmUgVW5kZXJydW4gQ2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0NNQ0YgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVVNBUlRfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9QRSAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9GRSAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRkUgICAgICAgICAgICAgICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9PUkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfSURMRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0lETEUgICAgICAgICAgICAgICAgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhORV9SWEZORSAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgICAgICAgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgb3IgUlggRklGTyBub3QgZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhFX1RYRk5GICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IG9yIFRYIEZJRk8gTm90IEZ1bGwgZmxhZyovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9MQkRGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTEJERiAgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ1RTSUYgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUU0lGICAgICAgICAgICAgICAgLyohPCBDVFMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFMgICAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JUT0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SVE9GICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9FT0JGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRU9CRiAgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiBibG9jayBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9VRFIgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVURSICAgICAgICAgICAgICAgICAvKiE8IFNQSSBTbGF2ZSB1bmRlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9BQlJFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRSAgICAgICAgICAgICAgICAvKiE8IEF1dG8gYmF1ZCByYXRlIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0FCUkYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJGICAgICAgICAgICAgICAgIC8qITwgQXV0byBiYXVkIHJhdGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DTUYgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgIC8qITwgU2VuZCBicmVhayBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SV1UgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUldVICAgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHdha2V1cCBmcm9tIE11dGUgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfV1VGICAgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RYRkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEZFICAgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SWEZGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVENCR1QgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JYRlQgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWEZUICAgICAgICAgICAgICAgIC8qITwgUlggRklGTyB0aHJlc2hvbGQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhGVCAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRlQgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgYW5kICBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfSURMRUlFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgLyohPCBJRExFIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFICAgICAgICAgICAgIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIGFuZCBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RDSUUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBhbmQgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9QRUlFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUEVJRSAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfQ01JRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfUlRPSUUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JUT0lFICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB0aW1lb3V0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX0VPQklFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9FT0JJRSAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIEJsb2NrIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RYRkVJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEZFSUUgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9SWEZGSUUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUlhGRklFICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMl9MQkRJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJESUUgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19UWEZUSUUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVElFICAgICAgICAgICAgICAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1RDQkdUSUUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19UQ0JHVElFICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1JYRlRJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SWEZUSUUgICAgICAgICAgICAgIC8qITwgUlggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19GSUZPVEhSRVNIT0xEIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzggICAgICAgICAgICAgIDB4MDAwMDAwMDBVIC8qITwgRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgRklGTyByZWFjaGVzIDEvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQgICAgICAgICAgICAgIDB4MDAwMDAwMDNVIC8qITwgRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzggICAgICAgICAgICAgIDB4MDAwMDAwMDRVIC8qITwgRklGTyByZWFjaGVzIDcvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzggICAgICAgICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRklGTyBiZWNvbWVzIGVtcHR5IGZvciBUWCBhbmQgZnVsbCBmb3IgUlggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfRElSRUNUSU9OIENvbW11bmljYXRpb24gRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX05PTkUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9SWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX1RYICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBpcyBlbmFibGVkIGFuZCBSZWNlaXZlciBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlggICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QQVJJVFkgUGFyaXR5IENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBjb250cm9sIGVuYWJsZWQgYW5kIEV2ZW4gUGFyaXR5IGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1VTQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgICAgLyohPCBQYXJpdHkgY29udHJvbCBlbmFibGVkIGFuZCBPZGQgUGFyaXR5IGlzIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUCBXYWtldXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfSURMRUxJTkUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgIFVTQVJUIHdha2UgdXAgZnJvbSBNdXRlIG1vZGUgb24gSWRsZSBMaW5lICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSyAgICAgICAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgLyohPCAgVVNBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBBZGRyZXNzIE1hcmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF83QiAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAgICAgICAgICAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF84QiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX09WRVJTQU1QTElORyBPdmVyc2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX09WRVI4ICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0NMT0NLIENsb2NrIFNpZ25hbAorICAqIEB7CisgICovCisKKyNkZWZpbmUgTExfVVNBUlRfQ0xPQ0tfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBDbG9jayBzaWduYWwgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIExMX1VTQVJUX0NMT0NLX0VOQUJMRSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gICAgICAgIC8qITwgQ2xvY2sgc2lnbmFsIHByb3ZpZGVkICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UgTGFzdCBDbG9jayBQdWxzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgbm90IG91dHB1dCB0byB0aGUgU0NMSyBwaW4gKi8KKyNkZWZpbmUgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVCAgICAgICAgICAgIFVTQVJUX0NSMl9MQkNMICAgICAgICAvKiE8IFRoZSBjbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBpcyBvdXRwdXQgdG8gdGhlIFNDTEsgcGluICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1BIQVNFIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRoZSBmaXJzdCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSAqLworI2RlZmluZSBMTF9VU0FSVF9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgICAgICAgIC8qITwgVGhlIHNlY29uZCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBTdGVhZHkgbG93IHZhbHVlIG9uIFNDTEsgcGluIG91dHNpZGUgdHJhbnNtaXNzaW9uIHdpbmRvdyovCisjZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BPTCAgICAgICAgLyohPCBTdGVhZHkgaGlnaCB2YWx1ZSBvbiBTQ0xLIHBpbiBvdXRzaWRlIHRyYW5zbWlzc2lvbiB3aW5kb3cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUFJFU0NBTEVSIENsb2NrIFNvdXJjZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBub3QgZGV2aWRlZCAgICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMiAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSA0ICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNiAgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDYgICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgOCAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNiAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjggICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMTI4ICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwLjUgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkgICAgICAvKiE8IDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9TVE9QXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDIgc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1RYUlggVFggUlggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TVEFOREFSRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TV0FQUEVEICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1dBUCkgICAgICAvKiE8IFRYIGFuZCBSWCBwaW5zIGZ1bmN0aW9ucyBhcmUgc3dhcHBlZC4gICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUlggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1JYSU5WKSAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9UWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1RYSU5WKSAgICAgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMuICgxPUgsIDA9TCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgICAgICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAvKiE8IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMuICgxPUwsIDA9SCkuIFRoZSBwYXJpdHkgYml0IGlzIGFsc28gaW52ZXJ0ZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19BVVRPQkFVRF9ERVRFQ1RfT04gQXV0b2JhdWQgRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNZWFzdXJlbWVudCBvZiB0aGUgc3RhcnQgYml0IGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFIFVTQVJUX0NSMl9BQlJNT0RFXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGYWxsaW5nIGVkZ2UgdG8gZmFsbGluZyBlZGdlIG1lYXN1cmVtZW50LiBSZWNlaXZlZCBmcmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBzaW5nbGUgYml0ID0gMSAtPiBGcmFtZSA9IFN0YXJ0MTB4eHh4eHggKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FICAgIFVTQVJUX0NSMl9BQlJNT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAweDdGIGZyYW1lIGRldGVjdGlvbiAqLworI2RlZmluZSBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fNTVfRlJBTUUgICAgKFVTQVJUX0NSMl9BQlJNT0RFXzEgfCBVU0FSVF9DUjJfQUJSTU9ERV8wKSAvKiE8IDB4NTUgZnJhbWUgZGV0ZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0FERFJFU1NfREVURUNUIEFkZHJlc3MgTGVuZ3RoIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCA0LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgICAgICAgIFVTQVJUX0NSMl9BRERNNyAgICAgICAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19IV0NPTlRST0wgSGFyZHdhcmUgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUUyAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJUUyBvdXRwdXQgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHJlcXVlc3RlZCB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ1RTIG1vZGUgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHRyYW5zbWl0dGVkIHdoZW4gdGhlIG5DVFMgaW5wdXQgaXMgYXNzZXJ0ZWQgKHRpZWQgdG8gMCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMgICAgICAgICAgICAgIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAgICAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUF9PTiBXYWtldXAgQWN0aXZhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBSWE5FICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lSREFfUE9XRVIgSXJEQSBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBJckRBIG5vcm1hbCBwb3dlciBtb2RlICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfSVJMUCAgICAgICAgLyohPCBJckRBIGxvdyBwb3dlciBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0xJTkJSRUFLX0RFVEVDVCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCICAgICAgICAgICAgVVNBUlRfQ1IyX0xCREwgICAgICAgIC8qITwgMTEtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9NYWNyb3MgVVNBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1VTQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVVNBUlQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9VU0FSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9FeHBvcnRlZF9NYWNyb3NfSGVscGVyIEV4cG9ydGVkX01hY3Jvc19IZWxwZXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gOCBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YgVVNBUlRESVYgaXMgcmV0dXJuZWQpCisgICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFVTQVJUIGluc3RhbmNlCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIFVTQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nIGluIE92ZXJTYW1wbGluZ184IGNhc2UKKyAgKi8KKyNkZWZpbmUgX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KF9fUEVSSVBIQ0xLX18sIF9fUFJFU0NBTEVSX18sIF9fQkFVRFJBVEVfXykgKCgoKChfX1BFUklQSENMS19fKS8odWludDMyX3QpKFVTQVJUX1BSRVNDQUxFUl9UQUJbKF9fUFJFU0NBTEVSX18pXSkpKjJVKSArICgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gMTYgYml0cyBzYW1wbGluZyBtb2RlICgzMiBiaXRzIHZhbHVlIG9mIFVTQVJURElWIGlzIHJldHVybmVkKQorICAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfMTYgY2FzZQorICAqLworI2RlZmluZSBfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KF9fUEVSSVBIQ0xLX18sIF9fUFJFU0NBTEVSX18sIF9fQkFVRFJBVEVfXykgKCgoKF9fUEVSSVBIQ0xLX18pLyh1aW50MzJfdCkoVVNBUlRfUFJFU0NBTEVSX1RBQlsoX19QUkVTQ0FMRVJfXyldKSkgKyAoKF9fQkFVRFJBVEVfXykvMlUpKS8oX19CQVVEUkFURV9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIERpc2FibGUgKGFsbCBVU0FSVCBwcmVzY2FsZXJzIGFuZCBvdXRwdXRzIGFyZSBkaXNhYmxlZCkKKyAgKiBAbm90ZSAgIFdoZW4gVVNBUlQgaXMgZGlzYWJsZWQsIFVTQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQgaW1tZWRpYXRlbHksCisgICogICAgICAgICBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBVU0FSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMKKyAgKiAgICAgICAgIGZsYWdzLCBpbiB0aGUgVVNBUlR4X0lTUiBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRW5hYmxlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBGSUZPRU4gICAgICAgIExMX1VTQVJUX0VuYWJsZUZJRk8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRklGTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZJRk8gTW9kZSBEaXNhYmxlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBGSUZPRU4gICAgICAgIExMX1VTQVJUX0Rpc2FibGVGSUZPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVGSUZPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBGSUZPIE1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRGSUZPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRGSUZPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pID09IChVU0FSVF9DUjFfRklGT0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBGSUZPIFRocmVzaG9sZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9VU0FSVF9TZXRUWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHLCBUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gVFggRklGTyBUaHJlc2hvbGQgQ29uZmlndXJhdGlvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9VU0FSVF9HZXRUWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcpID4+IFVTQVJUX0NSM19UWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFJYIEZJRk8gVGhyZXNob2xkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX1VTQVJUX1NldFJYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX1VTQVJUX0dldFJYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRykgPj4gVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFggYW5kIFJYIEZJRk9zIFRocmVzaG9sZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVENGRyAgICAgICBMTF9VU0FSVF9Db25maWdGSUZPc1RocmVzaG9sZFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9VU0FSVF9Db25maWdGSUZPc1RocmVzaG9sZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUWFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEBwYXJhbSAgUlhUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVFhUaHJlc2hvbGQsIHVpbnQzMl90IFJYVGhyZXNob2xkKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLCAoVFhUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSB8IChSWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBlbmFibGVkIGluIFNUT1AgTW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBVU0FSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZSwgcHJvdmlkZWQgdGhhdAorICAqICAgICAgICAgVVNBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJblN0b3BNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgZGlzYWJsZWQgaW4gU1RPUCBNb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBVU0FSVCBpcyBub3QgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBTdG9wIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZSAoYWJsZSB0byB3YWtlIHVwIE1DVSBmcm9tIFN0b3AgbW9kZSBvciBub3QpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pID09IChVU0FSVF9DUjFfVUVTTSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlciBFbmFibGUgKFJlY2VpdmVyIGlzIGVuYWJsZWQgYW5kIGJlZ2lucyBzZWFyY2hpbmcgZm9yIGEgc3RhcnQgYml0KQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVyIERpc2FibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZXMKKyAgKiAgICAgICAgIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFLCBUcmFuc2ZlckRpcmVjdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQYXJpdHkgKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIGhhcmR3YXJlIHBhcml0eSBjb250cm9sIChnZW5lcmF0aW9uIGFuZCBkZXRlY3Rpb24pIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICBXaGVuIHRoZSBwYXJpdHkgY29udHJvbCBpcyBlbmFibGVkIChPZGQgb3IgRXZlbiksIGNvbXB1dGVkIHBhcml0eSBiaXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIE1TQiBwb3NpdGlvbgorICAqICAgICAgICAgKDl0aCBvciA4dGggYml0IGRlcGVuZGluZyBvbiBkYXRhIHdpZHRoKSBhbmQgcGFyaXR5IGlzIGNoZWNrZWQgb24gdGhlIHJlY2VpdmVkIGRhdGEuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9TZXRQYXJpdHlcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfR2V0UGFyaXR5XG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0dldFBhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBNZXRob2QpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9TZXREYXRhV2lkdGhcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF85QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTSwgRGF0YVdpZHRoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gV29yZCBsZW5ndGggKGkuZS4gbmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNMCAgICAgICAgICAgIExMX1VTQVJUX0dldERhdGFXaWR0aFxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTTEgICAgICAgICAgICBMTF9VU0FSVF9HZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX00pKTsKK30KKworLyoqCisgICogQGJyaWVmICBBbGxvdyBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByZXZlbnQgTXV0ZSBNb2RlIHVzZS4gU2V0IFJlY2VpdmVyIGluIGFjdGl2ZSBtb2RlIHBlcm1hbmVudGx5LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZU11dGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZSBpcyBhbGxvd2VkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSkgPT0gKFVTQVJUX0NSMV9NTUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE92ZXJzYW1wbGluZyB0byA4LWJpdCBvciAxNi1iaXQgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9WRVI4ICAgICAgICAgTExfVVNBUlRfU2V0T3ZlclNhbXBsaW5nCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE92ZXJTYW1wbGluZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR184CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBPdmVyU2FtcGxpbmcpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9PVkVSOCwgT3ZlclNhbXBsaW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gT3ZlcnNhbXBsaW5nIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX0dldE92ZXJTYW1wbGluZworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX09WRVJTQU1QTElOR184CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0T3ZlclNhbXBsaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9PVkVSOCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBpZiBDbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBpcyBvdXRwdXQgdG8gdGhlIFNDTEsgcGluIG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIExhc3RCaXRDbG9ja1B1bHNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IExhc3RCaXRDbG9ja1B1bHNlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJDTCwgTGFzdEJpdENsb2NrUHVsc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIENsb2NrIHB1bHNlIG9mIHRoZSBsYXN0IGRhdGEgYml0IG91dHB1dCBjb25maWd1cmF0aW9uCisgICogICAgICAgICAoTGFzdCBiaXQgQ2xvY2sgcHVsc2Ugb3V0cHV0IHRvIHRoZSBTQ0xLIHBpbiBvciBub3QpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJDTCAgICAgICAgICBMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldExhc3RDbGtQdWxzZU91dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJDTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcGhhc2Ugb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BoYXNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMUVER0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8yRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IENsb2NrUGhhc2UpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBLCBDbG9ja1BoYXNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gcGhhc2Ugb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQaGFzZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRDbG9ja1BoYXNlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IHRoZSBwb2xhcml0eSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9VU0FSVF9TZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRDbG9ja1BvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQ2xvY2tQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQT0wsIENsb2NrUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBwb2xhcml0eSBvZiB0aGUgY2xvY2sgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9VU0FSVF9HZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldENsb2NrUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQ2xvY2sgc2lnbmFsIGZvcm1hdCAoUGhhc2UgUG9sYXJpdHkgYW5kIGNob2ljZSBhYm91dCBvdXRwdXQgb2YgbGFzdCBiaXQgY2xvY2sgcHVsc2UpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsb2NrIFBoYXNlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRDbG9ja1BoYXNlKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xvY2sgUG9sYXJpdHkgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBPdXRwdXQgb2YgTGFzdCBiaXQgQ2xvY2sgcHVsc2UgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dCgpIGZ1bmN0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ1BIQSAgICAgICAgICBMTF9VU0FSVF9Db25maWdDbG9ja1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9VU0FSVF9Db25maWdDbG9ja1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgTEJDTCAgICAgICAgICBMTF9VU0FSVF9Db25maWdDbG9jaworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICAqIEBwYXJhbSAgTEJDUE91dHB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdDbG9jayhVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBoYXNlLCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgTEJDUE91dHB1dCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NQSEEgfCBVU0FSVF9DUjJfQ1BPTCB8IFVTQVJUX0NSMl9MQkNMLCBQaGFzZSB8IFBvbGFyaXR5IHwgTEJDUE91dHB1dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQgb3ZlcnNhbXBsaW5nCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIFBSRVNDICAgICAgICBQUkVTQ0FMRVIgICAgIExMX1VTQVJUX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBDbG9jayBzb3VyY2UgcHJlc2NhbGVyIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IgYW5kIG92ZXJzYW1wbGluZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9VU0FSVF9HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFN5bmNocm9ub3VzIG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBDbG9jayBvdXRwdXQgb24gU0NMSyBwaW4gaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU0NMS091dHB1dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pID09IChVU0FSVF9DUjJfQ0xLRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18wXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdG9wIGJpdHMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0dldFN0b3BCaXRzTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzFfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDaGFyYWN0ZXIgZnJhbWUgZm9ybWF0IChEYXRhd2lkdGgsIFBhcml0eSBjb250cm9sLCBTdG9wIEJpdHMpCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIERhdGEgV2lkdGggY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldERhdGFXaWR0aCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFBhcml0eSBDb250cm9sIGFuZCBtb2RlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRQYXJpdHkoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTdG9wIGJpdHMgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0wICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBNMSAgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREFUQVdJRFRIXzlCCisgICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9FVkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX09ERAorICAqIEBwYXJhbSAgU3RvcEJpdHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18wXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoLCB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RvcEJpdHMpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfTSwgUGFyaXR5IHwgRGF0YVdpZHRoKTsKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfVVNBUlRfU2V0VFhSWFN3YXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFJYX1NXQVBQRUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgU3dhcENvbmZpZykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIFN3YXBDb25maWcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYL1JYIHBpbnMgc3dhcHBpbmcgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTV0FQICAgICAgICAgIExMX1VTQVJUX0dldFRYUlhTd2FwCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1dBUFBFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TV0FQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWElOViAgICAgICAgIExMX1VTQVJUX1NldFJYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UlhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBpbkludk1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfVVNBUlRfR2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1JYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9SWElOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9VU0FSVF9TZXRUWFBpbkxldmVsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQaW5JbnZNZXRob2QpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOViwgUGluSW52TWV0aG9kKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBUWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX1VTQVJUX0dldFRYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuCisgICogQG5vdGUgICBBbGxvdyB0byBkZWZpbmUgaG93IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIDoKKyAgKiAgICAgICAgIGVpdGhlciBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMgKDE9SCwgMD1MKSBvciBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljICgxPUwsIDA9SCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhTG9naWMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IERhdGFMb2dpYykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIERhdGFMb2dpYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgQmluYXJ5IGRhdGEgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfVVNBUlRfR2V0QmluYXJ5RGF0YUxvZ2ljCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklOQVJZX0xPR0lDX1BPU0lUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQml0T3JkZXIpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgQml0T3JkZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0cmFuc2ZlciBiaXQgb3JkZXIgKGVpdGhlciBMZXNzIG9yIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0KQorICAqIEBub3RlICAgTVNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiAgICAgICAgIExTQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTVNCRklSU1QgICAgICBMTF9VU0FSVF9HZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9NU0JGSVJTVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfRW5hYmxlQXV0b0JhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVBdXRvQmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUF1dG9CYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBBdXRvIEJhdWQtUmF0ZSBEZXRlY3Rpb24gbWVjaGFuaXNtIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfQVVUT0JBVURSQVRFX0RFVEVDVElPTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBBdXRvIEJhdWQgUmF0ZSBkZXRlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBQlJFTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRBdXRvQmF1ZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pID09IChVU0FSVF9DUjJfQUJSRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEF1dG8gQmF1ZC1SYXRlIG1vZGUgYml0cworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUk1PREUgICAgICAgTExfVVNBUlRfU2V0QXV0b0JhdWRSYXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBdXRvQmF1ZFJhdGVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRBdXRvQmF1ZFJhdGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQXV0b0JhdWRSYXRlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIEF1dG9CYXVkUmF0ZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBBdXRvIEJhdWQtUmF0ZSBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSTU9ERSAgICAgICBMTF9VU0FSVF9HZXRBdXRvQmF1ZFJhdGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QXV0b0JhdWRSYXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSTU9ERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSZWNlaXZlciBUaW1lb3V0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlRPRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJlY2VpdmVyIFRpbWVvdXQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBSZWNlaXZlciBUaW1lb3V0IGZlYXR1cmUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJUT0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkUnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSA9PSAoVVNBUlRfQ1IyX1JUT0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLgorICAqIEBub3RlICAgVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yIGNvbW11bmljYXRpb24gZHVyaW5nIE11dGUgbW9kZSBvciBTdG9wIG1vZGUsCisgICogICAgICAgICBmb3Igd2FrZSB1cCB3aXRoIGFkZHJlc3MgbWFyayBkZXRlY3Rpb24uCisgICogQG5vdGUgICA0Yml0cyBhZGRyZXNzIG5vZGUgaXMgdXNlZCB3aGVuIDQtYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LgorICAqICAgICAgICAgKGI3LWI0IHNob3VsZCBiZSBzZXQgdG8gMCkKKyAgKiAgICAgICAgIDhiaXRzIGFkZHJlc3Mgbm9kZSBpcyB1c2VkIHdoZW4gNy1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcuCisgICogICAgICAgICAoVGhpcyBpcyB1c2VkIGluIG11bHRpcHJvY2Vzc29yIGNvbW11bmljYXRpb24gZHVyaW5nIE11dGUgbW9kZSBvciBTdG9wIG1vZGUsCisgICogICAgICAgICBmb3Igd2FrZSB1cCB3aXRoIDctYml0IGFkZHJlc3MgbWFyayBkZXRlY3Rpb24uCisgICogICAgICAgICBUaGUgTVNCIG9mIHRoZSBjaGFyYWN0ZXIgc2VudCBieSB0aGUgdHJhbnNtaXR0ZXIgc2hvdWxkIGJlIGVxdWFsIHRvIDEuCisgICogICAgICAgICBJdCBtYXkgYWxzbyBiZSB1c2VkIGZvciBjaGFyYWN0ZXIgZGV0ZWN0aW9uIGR1cmluZyBub3JtYWwgcmVjZXB0aW9uLAorICAqICAgICAgICAgTXV0ZSBtb2RlIGluYWN0aXZlIChmb3IgZXhhbXBsZSwgZW5kIG9mIGJsb2NrIGRldGVjdGlvbiBpbiBNb2RCdXMgcHJvdG9jb2wpLgorICAqICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgd2hvbGUgcmVjZWl2ZWQgY2hhcmFjdGVyICg4LWJpdCkgaXMgY29tcGFyZWQgdG8gdGhlIEFERFs3OjBdCisgICogICAgICAgICB2YWx1ZSBhbmQgQ01GIGZsYWcgaXMgc2V0IG9uIG1hdGNoKQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3NcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEFERE03ICAgICAgICAgTExfVVNBUlRfQ29uZmlnTm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQWRkcmVzc0xlbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IKKyAgKiBAcGFyYW0gIE5vZGVBZGRyZXNzIDQgb3IgNyBiaXQgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQWRkcmVzc0xlbiwgdWludDMyX3QgTm9kZUFkZHJlc3MpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BREQgfCBVU0FSVF9DUjJfQURETTcsCisgICAgICAgICAgICAgKHVpbnQzMl90KShBZGRyZXNzTGVuIHwgKE5vZGVBZGRyZXNzIDw8IFVTQVJUX0NSMl9BRERfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiA4IGJpdCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlIGFzIHNldCBpbiBBREQgZmllbGQgb2YgQ1IyLgorICAqIEBub3RlICAgSWYgNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsCisgICogICAgICAgICBvbmx5IDRiaXRzIChiMy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjQgYXJlIG5vdCByZWxldmFudCkKKyAgKiAgICAgICAgIElmIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICAqICAgICAgICAgb25seSA4Yml0cyAoYjctYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI4IGFyZSBub3QgcmVsZXZhbnQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9VU0FSVF9HZXROb2RlQWRkcmVzcworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBBZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlIChWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXROb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUREKSA+PiBVU0FSVF9DUjJfQUREX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExlbmd0aCBvZiBOb2RlIEFkZHJlc3MgdXNlZCBpbiBBZGRyZXNzIERldGVjdGlvbiBtb2RlICg3LWJpdCBvciA0LWJpdCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX1VTQVJUX0dldE5vZGVBZGRyZXNzTGVuCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfNEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF83QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE5vZGVBZGRyZXNzTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfRW5hYmxlUlRTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRTIEhXIEZsb3cgQ29udHJvbAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVDVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSFcgRmxvdyBDb250cm9sIG1vZGUgKGJvdGggQ1RTIGFuZCBSVFMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhhcmR3YXJlRmxvd0NvbnRyb2wgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEhXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLCBIYXJkd2FyZUZsb3dDb250cm9sKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJUU0UgICAgICAgICAgTExfVVNBUlRfR2V0SFdGbG93Q3RybFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9VU0FSVF9HZXRIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX0NUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0SFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9FbmFibGVPbmVCaXRTYW1wCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZU9uZUJpdFNhbXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT05FQklUICAgICAgICBMTF9VU0FSVF9EaXNhYmxlT25lQml0U2FtcAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgT25lIGJpdCBzYW1wbGluZyBtZXRob2QgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9ORUJJVCAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkT25lQml0U2FtcAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkT25lQml0U2FtcChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT05FQklUKSA9PSAoVVNBUlRfQ1IzX09ORUJJVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgT3ZlcnJ1biBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX1VTQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBPdmVycnVuIGRldGVjdGlvbiBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpICE9IFVTQVJUX0NSM19PVlJESVMpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfU2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVHlwZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX1VTQVJUX0dldFdLVVBUeXBlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fUlhORQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVVNBUlQgQlJSIHJlZ2lzdGVyIGZvciBhY2hpZXZpbmcgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlLgorICAqIEBub3RlICAgQ29tcHV0ZSBhbmQgc2V0IFVTQVJURElWIHZhbHVlIGluIEJSUiBSZWdpc3RlciAoZnVsbCBCUlIgY29udGVudCkKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2ssIE92ZXJzYW1wbGluZyBtb2RlLCBhbmQgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlcworICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBhbmQgQmF1ZCByYXRlIHZhbHVlcyBwcm92aWRlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB2YWxpZAorICAqICAgICAgICAgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKQorICAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX1NldEJhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIEJhdWQgUmF0ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLCB1aW50MzJfdCBPdmVyU2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdXNhcnRkaXY7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJycnRlbXA7CisKKyAgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzgoUGVyaXBoQ2xrLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUsIEJhdWRSYXRlKSk7CisgICAgYnJydGVtcCA9IHVzYXJ0ZGl2ICYgMHhGRkYwVTsKKyAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICBVU0FSVHgtPkJSUiA9IGJycnRlbXA7CisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBUlR4LT5CUlIgPSAodWludDE2X3QpKF9fTExfVVNBUlRfRElWX1NBTVBMSU5HMTYoUGVyaXBoQ2xrLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUsIEJhdWRSYXRlKSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBCYXVkIFJhdGUgdmFsdWUsIGFjY29yZGluZyB0byBVU0FSVERJViBwcmVzZW50IGluIEJSUiByZWdpc3RlcgorICAqICAgICAgICAgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBPdmVyc2FtcGxpbmcgbW9kZSB2YWx1ZXMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwgdmFsdWUgMCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX0dldEJhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcmV0dmFsIEJhdWQgUmF0ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSwgdWludDMyX3QgT3ZlclNhbXBsaW5nKQoreworICByZWdpc3RlciB1aW50MzJfdCB1c2FydGRpdjsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYnJycmVzdWx0ID0gMHgwVTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgcGVyaXBoY2xrcHJlc2MgPSAodWludDMyX3QpKFBlcmlwaENsayAvICh1aW50MzJfdCkoVVNBUlRfUFJFU0NBTEVSX1RBQlsodWludDE2X3QpUHJlc2NhbGVyVmFsdWVdKSk7CisKKyAgdXNhcnRkaXYgPSBVU0FSVHgtPkJSUjsKKworICBpZiAodXNhcnRkaXYgPT0gMFUpCisgIHsKKyAgICAvKiBEbyBub3QgcGVyZm9ybSBhIGRpdmlzaW9uIGJ5IDAgKi8KKyAgfQorICBlbHNlIGlmIChPdmVyU2FtcGxpbmcgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpCisgIHsKKyAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgMHhGRkYwVSkgfCAoKHVzYXJ0ZGl2ICYgMHgwMDA3VSkgPDwgMVUpKSA7CisgICAgaWYgKHVzYXJ0ZGl2ICE9IDBVKQorICAgIHsKKyAgICAgIGJycnJlc3VsdCA9IChwZXJpcGhjbGtwcmVzYyAqIDJVKSAvIHVzYXJ0ZGl2OworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoKHVzYXJ0ZGl2ICYgMHhGRkZGVSkgIT0gMFUpCisgICAgeworICAgICAgYnJycmVzdWx0ID0gcGVyaXBoY2xrcHJlc2MgLyB1c2FydGRpdjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChicnJyZXN1bHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSZWNlaXZlciBUaW1lIE91dCBWYWx1ZSAoZXhwcmVzc2VkIGluIG5iIG9mIGJpdHMgZHVyYXRpb24pCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgUlRPICAgICAgICAgICBMTF9VU0FSVF9TZXRSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZW91dCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTywgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlY2VpdmVyIFRpbWUgT3V0IFZhbHVlIChleHByZXNzZWQgaW4gbmIgb2YgYml0cyBkdXJhdGlvbikKKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBSVE8gICAgICAgICAgIExMX1VTQVJUX0dldFJ4VGltZW91dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MDBGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPlJUT1IsIFVTQVJUX1JUT1JfUlRPKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBCTEVOICAgICAgICAgIExMX1VTQVJUX1NldEJsb2NrTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJsb2NrTGVuZ3RoIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmxvY2tMZW5ndGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBCbG9ja0xlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPlJUT1IsIFVTQVJUX1JUT1JfQkxFTiwgQmxvY2tMZW5ndGggPDwgVVNBUlRfUlRPUl9CTEVOX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEJsb2NrIExlbmd0aCB2YWx1ZSBpbiByZWNlcHRpb24KKyAgKiBAcm10b2xsIFJUT1IgICAgICAgICBCTEVOICAgICAgICAgIExMX1VTQVJUX0dldEJsb2NrTGVuZ3RoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEJsb2NrTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4pID4+IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fSVJEQSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIElyZGEgZmVhdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIElyREEgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlyZGEKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIElyREEgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgSXJEQSBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJcmRhKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkVOKSA9PSAoVVNBUlRfQ1IzX0lSRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIElyREEgUG93ZXIgTW9kZSAoTm9ybWFsIG9yIExvdyBQb3dlcikKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJMUCAgICAgICAgICBMTF9VU0FSVF9TZXRJcmRhUG93ZXJNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSVJEQV9QT1dFUl9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldElyZGFQb3dlck1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQb3dlck1vZGUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkxQLCBQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIElyREEgUG93ZXIgTW9kZSBjb25maWd1cmF0aW9uIChOb3JtYWwgb3IgTG93IFBvd2VyKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkxQICAgICAgICAgIExMX1VTQVJUX0dldElyZGFQb3dlck1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0SXJkYVBvd2VyTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJMUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBJcmRhIHByZXNjYWxlciB2YWx1ZSwgdXNlZCBmb3IgZGl2aWRpbmcgdGhlIFVTQVJUIGNsb2NrIHNvdXJjZQorICAqICAgICAgICAgdG8gYWNoaWV2ZSB0aGUgSXJkYSBMb3cgUG93ZXIgZnJlcXVlbmN5ICg4IGJpdHMgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0SXJkYVByZXNjYWxlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldElyZGFQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkdUUFIsICh1aW50MTZfdClVU0FSVF9HVFBSX1BTQywgKHVpbnQxNl90KVByZXNjYWxlclZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSXJkYSBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIHRvIGFjaGlldmUgdGhlIElyZGEgTG93IFBvd2VyIGZyZXF1ZW5jeSAoOCBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBQU0MgICAgICAgICAgIExMX1VTQVJUX0dldElyZGFQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgSXJkYSBwcmVzY2FsZXIgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRikKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRJcmRhUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fU21hcnRjYXJkIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gU21hcnRjYXJkIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgTkFDSyB0cmFuc21pc3Npb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkTkFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBOQUNLICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmROQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmROQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkTkFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkTkFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfTkFDSykgPT0gKFVTQVJUX0NSM19OQUNLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU21hcnRjYXJkIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU21hcnRjYXJkIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTbWFydGNhcmQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTikgPT0gKFVTQVJUX0NSM19TQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoU0NBUkNOVFsyOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0LWZpZWxkIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgaW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUsIGluIFNtYXJ0Y2FyZCBtb2RlLgorICAqICAgICAgICAgSW4gdHJhbnNtaXNzaW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiByZXRyaWVzLCBiZWZvcmUKKyAgKiAgICAgICAgIGdlbmVyYXRpbmcgYSB0cmFuc21pc3Npb24gZXJyb3IgKEZFIGJpdCBzZXQpLgorICAqICAgICAgICAgSW4gcmVjZXB0aW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9yIGVycm9uZW91cyByZWNlcHRpb24gdHJpYWxzLCBiZWZvcmUgZ2VuZXJhdGluZyBhCisgICogICAgICAgICByZWNlcHRpb24gZXJyb3IgKFJYTkUgYW5kIFBFIGJpdHMgc2V0KQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDQVJDTlQgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JldHJ5Q291bnQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEF1dG9SZXRyeUNvdW50KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NBUkNOVCwgQXV0b1JldHJ5Q291bnQgPDwgVVNBUlRfQ1IzX1NDQVJDTlRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFNDQVJDTlRbMjowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NBUkNOVCAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0FSQ05UKSA+PiBVU0FSVF9DUjNfU0NBUkNOVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sKKyAgKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFNtYXJ0Y2FyZFByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgKHVpbnQxNl90KVVTQVJUX0dUUFJfUFNDLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sKKyAgKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfR2V0U21hcnRjYXJkUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0U21hcnRjYXJkUHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX1BTQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSwgZXhwcmVzc2VkIGluIG5iIG9mIGJhdWQgY2xvY2tzIHBlcmlvZHMKKyAgKiAgICAgICAgIChHVFs3OjBdIGJpdHMgOiBHdWFyZCB0aW1lIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgR1QgICAgICAgICAgICBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgR3VhcmRUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0U21hcnRjYXJkR3VhcmRUaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgR3VhcmRUaW1lKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgKHVpbnQxNl90KVVTQVJUX0dUUFJfR1QsICh1aW50MTZfdCkoR3VhcmRUaW1lIDw8IFVTQVJUX0dUUFJfR1RfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MgcGVyaW9kcworICAqICAgICAgICAgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBHVCAgICAgICAgICAgIExMX1VTQVJUX0dldFNtYXJ0Y2FyZEd1YXJkVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFNtYXJ0Y2FyZEd1YXJkVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9HVCkgPj4gVVNBUlRfR1RQUl9HVF9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fSGFsZkR1cGxleCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIEhhbGYgRHVwbGV4IGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRIYWxmRHVwbGV4KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCkgPT0gKFVTQVJUX0NSM19IRFNFTCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX1NQSV9TTEFWRSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIFNQSSBTbGF2ZSBmZWF0dXJlCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNQSSBTeW5jaHJvbm91cyBTbGF2ZSBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TTFZFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTUEkgU3luY2hyb25vdXMgU2xhdmUgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTUEkgU2xhdmUgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNMVkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiAgU1BJIFN5bmNocm9ub3VzIFNsYXZlIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTUEkgU2xhdmUgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNMVkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkU1BJU2xhdmUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TTFZFTikgPT0gKFVTQVJUX0NSMl9TTFZFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1BJIFNsYXZlIFNlbGVjdGlvbiB1c2luZyBOU1MgaW5wdXQgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBTUEkgU2xhdmUgU2VsZWN0aW9uIGRlcGVuZHMgb24gTlNTIGlucHV0IHBpbgorICAqICAgICAgICAgKFRoZSBzbGF2ZSBpcyBzZWxlY3RlZCB3aGVuIE5TUyBpcyBsb3cgYW5kIGRlc2VsZWN0ZWQgd2hlbiBOU1MgaXMgaGlnaCkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRElTX05TUyAgICAgICBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZVNlbGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RJU19OU1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1BJIFNsYXZlIFNlbGVjdGlvbiB1c2luZyBOU1MgaW5wdXQgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBTUEkgU2xhdmUgd2lsbCBiZSBhbHdheXMgc2VsZWN0ZWQgYW5kIE5TUyBpbnB1dCBwaW4gd2lsbCBiZSBpZ25vcmVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERJU19OU1MgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlU2VsZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9ESVNfTlNTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiAgU1BJIFNsYXZlIFNlbGVjdGlvbiBkZXBlbmRzIG9uIE5TUyBpbnB1dCBwaW4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBESVNfTlNTICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlU2VsZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfRElTX05TUykgIT0gKFVTQVJUX0NSMl9ESVNfTlNTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fTElOIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gTElOIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRMICAgICAgICAgIExMX1VTQVJUX1NldExJTkJya0RldGVjdGlvbkxlbgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBMSU5CRExlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMSU5CcmtEZXRlY3Rpb25MZW4oVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBMSU5CRExlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCREwsIExJTkJETGVuZ3RoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9HZXRMSU5CcmtEZXRlY3Rpb25MZW4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldExJTkJya0RldGVjdGlvbkxlbihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJETCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBMSU4gbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZUxJTgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTElOIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlTElOCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVMSU4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgTElOIG1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZExJTgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkTElOKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MSU5FTikgPT0gKFVTQVJUX0NSMl9MSU5FTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0RFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gRHJpdmVyIEVuYWJsZSBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgREVEVCAoRHJpdmVyIEVuYWJsZSBEZS1Bc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVEVCAgICAgICAgICBMTF9VU0FSVF9TZXRERURlYXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gREVEVCAoRHJpdmVyIEVuYWJsZSBEZS1Bc3NlcnRpb24gVGltZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX1VTQVJUX0dldERFRGVhc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFRFQpID4+IFVTQVJUX0NSMV9ERURUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERFQVQgKERyaXZlciBFbmFibGUgQXNzZXJ0aW9uIFRpbWUpLCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfVVNBUlRfU2V0REVBc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQsIFRpbWUgPDwgVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERUFUICAgICAgICAgIExMX1VTQVJUX0dldERFQXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBUaW1lIHZhbHVlIGV4cHJlc3NlZCBvbiA1IGJpdHMgKFs0OjBdIGJpdHMpIDogVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldERFQXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCkgPj4gVVNBUlRfQ1IxX0RFQVRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURFTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlREVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVERU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIERyaXZlciBFbmFibGUgKERFKSBNb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERFTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkREVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pID09IChVU0FSVF9DUjNfREVNKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBEcml2ZXIgRW5hYmxlIFBvbGFyaXR5CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9VU0FSVF9TZXRERVNpZ25hbFBvbGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX1VTQVJUX0dldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQWR2YW5jZWRDb25maWd1cmF0aW9uIEFkdmFuY2VkIENvbmZpZ3VyYXRpb25zIHNlcnZpY2VzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBBc3luY2hyb25vdXMgTW9kZSAoVUFSVCkKKyAgKiBAbm90ZSAgIEluIFVBUlQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEFzeW5jaHJvbm91cyBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gQXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFN5bmNocm9ub3VzIE1vZGUKKyAgKiBAbm90ZSAgIEluIFN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVVNBUlQgaW4gU3luY2hyb25vdXMgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIFN5bmNocm9ub3VzIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIENsb2NrIFBvbGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gU3luY2hyb25vdXMgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIExJTiBNb2RlCisgICogQG5vdGUgICBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0IHRoZSBVQVJUL1VTQVJUIGluIExJTiBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTVE9QIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZUxJTigpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBMSU4gTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOLCBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ1IyX1NUT1ApKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBTZXQgdGhlIFVBUlQvVVNBUlQgaW4gTElOIG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBIYWxmIER1cGxleCBNb2RlCisgICogQG5vdGUgICBJbiBIYWxmIER1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdGhlIFVBUlQvVVNBUlQgaW4gSGFsZiBEdXBsZXggbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIEhhbGYgRHVwbGV4IG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBTbWFydGNhcmQgTW9kZQorICAqIEBub3RlICAgSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNvbmZpZ3VyZXMgU3RvcCBiaXRzIHRvIDEuNSBiaXRzIGFuZAorICAqICAgICAgICAgc2V0cyB0aGUgVVNBUlQgaW4gU21hcnRjYXJkIG1vZGUgKFNDRU4gYml0KS4KKyAgKiAgICAgICAgIENsb2NrIE91dHB1dCBpcyBhbHNvIGVuYWJsZWQgKENMS0VOKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ29uZmlndXJlIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBTbWFydGNhcmQgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIFNtYXJ0Y2FyZCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBDb25maWd1cmUgU3RvcCBiaXRzIHRvIDEuNSBiaXRzICovCisgIC8qIFN5bmNocm9ub3VzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTbWFydGNhcmQgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gSXJkYSBNb2RlCisgICogQG5vdGUgICBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVQVJUL1VTQVJUIGluIElSREEgbW9kZSAoSVJFTiBiaXQpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gSXJkYSBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUG93ZXIgbW9kZSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdJcmRhTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9TVE9QKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIE11bHRpIHByb2Nlc3NvciBNb2RlCisgICogICAgICAgICAoc2V2ZXJhbCBVU0FSVHMgY29ubmVjdGVkIGluIGEgbmV0d29yaywgb25lIG9mIHRoZSBVU0FSVHMgY2FuIGJlIHRoZSBtYXN0ZXIsCisgICogICAgICAgICBpdHMgVFggb3V0cHV0IGNvbm5lY3RlZCB0byB0aGUgUlggaW5wdXRzIG9mIHRoZSBvdGhlciBzbGF2ZXMgVVNBUlRzKS4KKyAgKiBAbm90ZSAgIEluIE11bHRpUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBNdWx0aSBwcm9jZXNzb3IgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV2FrZSBVcCBNZXRob2QsIE5vZGUgYWRkcmVzcywgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIE11bHRpIFByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOLCBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFBFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1BFKSA9PSAoVVNBUlRfSVNSX1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBGcmFtaW5nIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0ZFKSA9PSAoVVNBUlRfSVNSX0ZFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBOb2lzZSBlcnJvciBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBORSAgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19ORQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX05FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9ORSkgPT0gKFVTQVJUX0lTUl9ORSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgT3ZlclJ1biBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBPUkUgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIElETEUgbGluZSBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJRExFICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfSURMRSkgPT0gKFVTQVJUX0lTUl9JRExFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWFkIERhdGEgUmVnaXN0ZXIgb3IgVVNBUlQgUlggRklGTyBOb3QgRW1wdHkgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWE5FX1JYRk5FICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhORV9SWEZORSkgPT0gKFVTQVJUX0lTUl9SWE5FX1JYRk5FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRSAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IG9yIFVTQVJUIFRYIEZJRk8gTm90IEZ1bGwgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEVfVFhGTkYgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgPT0gKFVTQVJUX0lTUl9UWEVfVFhGTkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIExJTiBCcmVhayBEZXRlY3Rpb24gRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIExCREYgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfTEJERikgPT0gKFVTQVJUX0lTUl9MQkRGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgaW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFNJRiAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19uQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTSUYpID09IChVU0FSVF9JU1JfQ1RTSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENUUyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9DVFMpID09IChVU0FSVF9JU1JfQ1RTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlciBUaW1lIE91dCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSVE9GICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SVE8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JUT0YpID09IChVU0FSVF9JU1JfUlRPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRU9CRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9FT0JGKSA9PSAoVVNBUlRfSVNSX0VPQkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNQSSBTbGF2ZSBVbmRlcnJ1biBlcnJvciBmbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBVRFIgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19VRFIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19VRFIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1VEUikgPT0gKFVTQVJUX0lTUl9VRFIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEF1dG8tQmF1ZCBSYXRlIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFCUkUgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19BQlJFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9BQlJFKSA9PSAoVVNBUlRfSVNSX0FCUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEF1dG8tQmF1ZCBSYXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFCUkYgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQUJSRikgPT0gKFVTQVJUX0lTUl9BQlJGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBCdXN5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEJVU1kgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0JVU1kKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19CVVNZKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9CVVNZKSA9PSAoVVNBUlRfSVNSX0JVU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTUYgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9DTUYpID09IChVU0FSVF9JU1JfQ01GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBTZW5kIEJyZWFrIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFNCS0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfU0JLRikgPT0gKFVTQVJUX0lTUl9TQktGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlIFdha2UgVXAgZnJvbSBtdXRlIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUldVICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUldVCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUldVKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SV1UpID09IChVU0FSVF9JU1JfUldVKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VGICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1dVRikgPT0gKFVTQVJUX0lTUl9XVUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWl0IEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUFDSyAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19URUFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZSBFbmFibGUgQWNrbm93bGVkZ2UgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUkVBQ0sgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUkVBQ0spID09IChVU0FSVF9JU1JfUkVBQ0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRYIEZJRk8gRW1wdHkgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWEZFICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhGRSkgPT0gKFVTQVJUX0lTUl9UWEZFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIEZ1bGwgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWEZGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZGCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGRikgPT0gKFVTQVJUX0lTUl9SWEZGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDQkdUICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RDQkdUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RDQkdUKSA9PSAoVVNBUlRfSVNSX1RDQkdUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRlQgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRlQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZUKSA9PSAoVVNBUlRfSVNSX1RYRlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGVCAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JYRlQpID09IChVU0FSVF9JU1JfUlhGVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBQYXJpdHkgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1BFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEZyYW1pbmcgRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEZFQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0ZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0ZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vaXNlIEVycm9yIGRldGVjdGVkIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBORUNGICAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX05FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfTkVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgT3ZlclJ1biBFcnJvciBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgT1JFQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfT1JFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9PUkVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgSURMRSBsaW5lIGRldGVjdGVkIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBJRExFQ0YgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfSURMRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUWCBGSUZPIEVtcHR5IEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRYRkVDRiAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1RYRkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1RYRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UWEZFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVENDRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVENCR1RDRiAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENCR1RDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIExCRENGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfTEJEQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENUUyBJbnRlcnJ1cHQgRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19uQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ1RTQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBSVE9DRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19SVE8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1JUT0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBFbmQgT2YgQmxvY2sgRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRU9CQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9FT0JDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU1BJIFNsYXZlIFVuZGVycnVuIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBVRFJDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19VRFIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1VEUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1VEUkNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFyYWN0ZXIgTWF0Y2ggRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIENNQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NNQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1dVQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIElETEUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9VU0FSVF9FbmFibGVJVF9SWE5FICBMTF9VU0FSVF9FbmFibGVJVF9SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0VuYWJsZUlUX1RYRSAgTExfVVNBUlRfRW5hYmxlSVRfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICBUWEVJRV9UWEZORklFICBMTF9VU0FSVF9FbmFibGVJVF9UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfQ00KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJlY2VpdmVyIFRpbWVvdXQgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlRPSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9SVE8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JUT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRW5kIE9mIEJsb2NrIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9FT0IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0VPQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVFhGRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JYRkYKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9MQkQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGEgZnJhbWluZworICAqICAgICAgICAgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyKS4KKyAgKiAgICAgICAgICAgMDogSW50ZXJydXB0IGlzIGluaGliaXRlZAorICAqICAgICAgICAgICAxOiBBbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW4gRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBVU0FSVHhfSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1RTIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0NUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfVFhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUQ0JHVElFICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RDQkdUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RDQkdUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUlhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0Rpc2FibGVJVF9SWE5FICBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlggTm90IEVtcHR5IGFuZCBSWCBGSUZPIE5vdCBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfRGlzYWJsZUlUX1RYRSAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRW1wdHkgYW5kIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRV9UWEZORgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfQ00KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlRPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRW5kIE9mIEJsb2NrIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRU9CSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9SWEZGCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExJTiBCcmVhayBEZXRlY3Rpb24gSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCRElFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXJyb3IgSW50ZXJydXB0CisgICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBhIGZyYW1pbmcKKyAgKiAgICAgICAgIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3RlcikuCisgICogICAgICAgICAgIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQKKyAgKiAgICAgICAgICAgMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9FUlJPUgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEZUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUQ0JHVElFICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9UQ0JHVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVElFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIElETEUgSW50ZXJydXB0ICBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0lETEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSkgPT0gKFVTQVJUX0NSMV9JRExFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORSAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBOb3QgRW1wdHkgYW5kIFVTQVJUIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgPT0gKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSA9PSAoVVNBUlRfQ1IxX1RDSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRW1wdHkgYW5kIFVTQVJUIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpID09IChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1BFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QRUlFKSA9PSAoVVNBUlRfQ1IxX1BFSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSkgPT0gKFVTQVJUX0NSMV9DTUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JUT0lFKSA9PSAoVVNBUlRfQ1IxX1JUT0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBFbmQgT2YgQmxvY2sgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFT0JJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0VPQgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSkgPT0gKFVTQVJUX0NSMV9FT0JJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpID09IChVU0FSVF9DUjFfVFhGRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhGRgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKSA9PSAoVVNBUlRfQ1IxX1JYRkZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTElOIEJyZWFrIERldGVjdGlvbiBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJESUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTEJESUUpID09IChVU0FSVF9DUjJfTEJESUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpID09IChVU0FSVF9DUjNfRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKSA9PSAoVVNBUlRfQ1IzX0NUU0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSkgPT0gKFVTQVJUX0NSM19XVUZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpID09IChVU0FSVF9DUjNfVFhGVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UQ0JHVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfVENCR1QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RDQkdUSUUpID09IChVU0FSVF9DUjNfVENCR1RJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVElFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpID09IChVU0FSVF9DUjNfUlhGVElFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpID09IChVU0FSVF9DUjNfRE1BUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9UWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpID09IChVU0FSVF9DUjNfRE1BVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvcgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKSA9PSAoVVNBUlRfQ1IzX0REUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBkYXRhIHJlZ2lzdGVyIGFkZHJlc3MgdXNlZCBmb3IgRE1BIHRyYW5zZmVyCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkclxuCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfUkVDRUlWRQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGRhdGFfcmVnX2FkZHI7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQpCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBURFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChVU0FSVHgtPlREUik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoVVNBUlR4LT5SRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDggYml0cykKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1VTQVJUX1JlY2VpdmVEYXRhOChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpICYgMHhGRlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA5IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9SZWNlaXZlRGF0YTkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX1VTQVJUX1JlY2VpdmVEYXRhOShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOCBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1RyYW5zbWl0RGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50OF90IFZhbHVlKQoreworICBVU0FSVHgtPlREUiA9IFZhbHVlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX1VTQVJUX1RyYW5zbWl0RGF0YTkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfVHJhbnNtaXREYXRhOShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQxNl90IFZhbHVlKQoreworICBVU0FSVHgtPlREUiA9ICh1aW50MTZfdCkoVmFsdWUgJiAweDFGRlVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9FeGVjdXRpb24gRXhlY3V0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IGFuIEF1dG9tYXRpYyBCYXVkIFJhdGUgbWVhc3VyZW1lbnQgb24gbmV4dCByZWNlaXZlZCBkYXRhIGZyYW1lCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgQUJSUlEgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0QXV0b0JhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RBdXRvQmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX0FCUlJRKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IEJyZWFrIHNlbmRpbmcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBTQktSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RCcmVha1NlbmRpbmcKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfU0JLUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFB1dCBVU0FSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBNTVJRICAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RFbnRlck11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPlJRUiwgKHVpbnQxNl90KVVTQVJUX1JRUl9NTVJRKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IGEgUmVjZWl2ZSBEYXRhIGFuZCBGSUZPIGZsdXNoCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQgYW4gb3ZlcnJ1bgorICAqICAgICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsICh1aW50MTZfdClVU0FSVF9SUVJfUlhGUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgYSBUcmFuc21pdCBkYXRhIGFuZCBGSUZPIGZsdXNoCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBUWEZSUSAgICAgICAgIExMX1VTQVJUX1JlcXVlc3RUeERhdGFGbHVzaAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0VHhEYXRhRmx1c2goVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+UlFSLCAodWludDE2X3QpVVNBUlRfUlFSX1RYRlJRKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCk7CitFcnJvclN0YXR1cyBMTF9VU0FSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfVVNBUlRfU3RydWN0SW5pdChMTF9VU0FSVF9Jbml0VHlwZURlZiAqVVNBUlRfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9VU0FSVF9DbG9ja0luaXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KExMX1VTQVJUX0Nsb2NrSW5pdFR5cGVEZWYgKlVTQVJUX0Nsb2NrSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNBUlQxIHx8IFVTQVJUMiB8fCBVU0FSVDMgfHwgVVNBUlQ0ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMkcweHhfTExfVVNBUlRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZzB4eF9sbF91dGlscy5oIGIvSW5jL3N0bTMyZzB4eF9sbF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWM3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX3V0aWxzLmgKQEAgLTAsMCArMSwyOTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfdXRpbHMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVRJTFMgTEwgbW9kdWxlLgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgTEwgVVRJTFMgZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBEZXZpY2UgZWxlY3Ryb25pYyBzaWduYXR1cmUKKyAgICAgICgrKSBUaW1pbmcgZnVuY3Rpb25zCisgICAgICAoKykgUExMIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkcweHhfTExfVVRJTFNfSAorI2RlZmluZSBTVE0zMkcweHhfTExfVVRJTFNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19MTCBVVElMUworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0NvbnN0YW50cyBVVElMUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIE1heCBkZWxheSBjYW4gYmUgdXNlZCBpbiBMTF9tRGVsYXkgKi8KKyNkZWZpbmUgTExfTUFYX0RFTEFZICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRlUKKworLyoqCisgKiBAYnJpZWYgVW5pcXVlIGRldmljZSBJRCByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqLworI2RlZmluZSBVSURfQkFTRV9BRERSRVNTICAgICAgICAgICAgICBVSURfQkFTRQorCisvKioKKyAqIEBicmllZiBGbGFzaCBzaXplIGRhdGEgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgRkxBU0hTSVpFX0JBU0VfQUREUkVTUyAgICAgICAgRkxBU0hTSVpFX0JBU0UKKworLyoqCisgKiBAYnJpZWYgUGFja2FnZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIFBBQ0tBR0VfQkFTRV9BRERSRVNTICAgICAgICAgIFBBQ0tBR0VfQkFTRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX01hY3JvcyBVVElMUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRVNfSU5JVCBVVElMUyBFeHBvcnRlZCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgVVRJTFMgUExMIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQTExNOyAgIC8qITwgRGl2aXNpb24gZmFjdG9yIGZvciBQTEwgVkNPIGlucHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfUExMTV9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKCkuICovCisKKyAgdWludDMyX3QgUExMTjsgICAvKiE8IE11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgUExMIFZDTyBvdXRwdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworCisgIHVpbnQzMl90IFBMTFI7ICAgLyohPCBEaXZpc2lvbiBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfUExMUl9ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKCkuICovCit9IExMX1VUSUxTX1BMTEluaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVUSUxTIFN5c3RlbSwgQUhCIGFuZCBBUEIgYnVzZXMgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQUhCQ0xLRGl2aWRlcjsgICAgICAgICAvKiE8IFRoZSBBSEIgY2xvY2sgKEhDTEspIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19TWVNDTEtfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBBUEIxQ0xLRGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFQQjEgY2xvY2sgKFBDTEsxKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX0FQQjFfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyKCkuICovCit9IExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9FeHBvcnRlZF9Db25zdGFudHMgVVRJTFMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19FQ19IU0VfQllQQVNTIEhTRSBCeXBhc3MgYWN0aXZhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VUSUxTX0hTRUJZUEFTU19PRkYgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgSFNFIEJ5cGFzcyBpcyBub3QgZW5hYmxlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19IU0VCWVBBU1NfT04gICAgICAgICAweDAwMDAwMDAxVSAgICAgICAvKiE8IEhTRSBCeXBhc3MgaXMgZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUNfUEFDS0FHRVRZUEUgUEFDS0FHRSBUWVBFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZOMjhfR1AgICAgICAgMHgwMDAwMDAwMFUgLyohPCBVRlFGUE4yOCBnZW5lcmFsIHB1cnBvc2UgKEdQKSBwYWNrYWdlIHR5cGUgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZOMjhfUEQgICAgICAgMHgwMDAwMDAwMVUgLyohPCBVRlFGUE4yOCBQb3dlciBEZWxpdmVyeSAoUEQpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZOMzJfR1AgICAgICAgMHgwMDAwMDAwNFUgLyohPCBVRlFGUE4zMiAvIExRRlAzMiBnZW5lcmFsIHB1cnBvc2UgKEdQKSBwYWNrYWdlIHR5cGUgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZOMzJfUEQgICAgICAgMHgwMDAwMDAwNVUgLyohPCBVRlFGUE4zMiAvIExRRlAzMiBQb3dlciBEZWxpdmVyeSAoUEQpIHBhY2thZ2UgdHlwZSAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZONDggICAgICAgICAgMHgwMDAwMDAwOFUgLyohPCBVRlFGUE40OCAvIExRRlA0ODggcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZQNjQgICAgICAgICAgMHgwMDAwMDAwQ1UgLyohPCBMUVBGNjQ4IHBhY2thZ2UgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBVVElMUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VGX0RFVklDRV9FTEVDVFJPTklDX1NJR05BVFVSRSBERVZJQ0UgRUxFQ1RST05JQyBTSUdOQVRVUkUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBXb3JkMCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIFVJRFszMTowXTogWCBhbmQgWSBjb29yZGluYXRlcyBvbiB0aGUgd2FmZXIgZXhwcmVzc2VkIGluIEJDRCBmb3JtYXQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRVSURfV29yZDAodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKilVSURfQkFTRV9BRERSRVNTKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXb3JkMSBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIFVJRFs2MzozMl06IFdhZmVyIG51bWJlciAoVUlEWzM5OjMyXSkgJiBMT1RfTlVNWzIzOjBdIChVSURbNjM6NDBdKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFVJRF9Xb3JkMSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRV9BRERSRVNTICsgNFUpKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXb3JkMiBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIFVJRFs5NTo2NF06IExvdCBudW1iZXIgKEFTQ0lJIGVuY29kZWQpIC0gTE9UX05VTVs1NToyNF0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRVSURfV29yZDIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKikoVUlEX0JBU0VfQUREUkVTUyArIDhVKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRmxhc2ggbWVtb3J5IHNpemUKKyAgKiBAbm90ZSAgIFRoaXMgYml0ZmllbGQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UgRmxhc2ggbWVtb3J5IGV4cHJlc3NlZCBpbgorICAqICAgICAgICAgS2J5dGVzLiBBcyBhbiBleGFtcGxlLCAweDA0MCBjb3JyZXNwb25kcyB0byA2NCBLYnl0ZXMuCisgICogQHJldHZhbCBGTEFTSF9TSVpFWzE1OjBdOiBGbGFzaCBtZW1vcnkgc2l6ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldEZsYXNoU2l6ZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKUZMQVNIU0laRV9CQVNFX0FERFJFU1MpKSAmIDB4MDAwMEZGRkZVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBhY2thZ2UgdHlwZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9RRk4yOF9HUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjI4X1BECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZOMzJfR1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9RRk4zMl9QRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZQNjQKKyAgKgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dldFBhY2thZ2VUeXBlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopUEFDS0FHRV9CQVNFX0FERFJFU1MpKSAmIDB4RlUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0VGX0RFTEFZIERFTEFZCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIG9mIHRoZSB0aW1lIGJhc2UuCisgICogQHBhcmFtICBIQ0xLRnJlcXVlbmN5IEhDTEsgZnJlcXVlbmN5IGluIEh6IChjYW4gYmUgY2FsY3VsYXRlZCB0aGFua3MgdG8gUkNDIGhlbHBlciBtYWNybykKKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBTeXNUaWNrCisgICogICAgICAgICBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZm9yIGEgZGVsYXkgdXNlIHJhdGhlciBvc0RlbGF5IFJUT1Mgc2VydmljZS4KKyAgKiBAcGFyYW0gIFRpY2tzIE51bWJlciBvZiB0aWNrcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSW5pdFRpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSwgdWludDMyX3QgVGlja3MpCit7CisgIC8qIENvbmZpZ3VyZSB0aGUgU3lzVGljayB0byBoYXZlIGludGVycnVwdCBpbiAxbXMgdGltZSBiYXNlICovCisgIFN5c1RpY2stPkxPQUQgID0gKHVpbnQzMl90KSgoSENMS0ZyZXF1ZW5jeSAvIFRpY2tzKSAtIDFVTCk7ICAvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovCisgIFN5c1RpY2stPlZBTCAgID0gMFVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLworICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwKKyAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBTeXN0aWNrIFRpbWVyICovCit9CisKK3ZvaWQgICAgICAgIExMX0luaXQxbXNUaWNrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOwordm9pZCAgICAgICAgTExfbURlbGF5KHVpbnQzMl90IERlbGF5KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19FRl9TWVNURU0gU1lTVEVNCisgICogQHsKKyAgKi8KKwordm9pZCAgICAgICAgTExfU2V0U3lzdGVtQ29yZUNsb2NrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpOworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTSShMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTRSh1aW50MzJfdCBIU0VGcmVxdWVuY3ksIHVpbnQzMl90IEhTRUJ5cGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyRzB4eF9MTF9VVElMU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJnMHh4X2xsX3d3ZGcuaCBiL0luYy9zdG0zMmcweHhfbGxfd3dkZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTU4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJnMHh4X2xsX3d3ZGcuaApAQCAtMCwwICsxLDMzMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF93d2RnLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFdXREcgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRzB4eF9MTF9XV0RHX0gKKyNkZWZpbmUgU1RNMzJHMHh4X0xMX1dXREdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFdXREcpCisvKiogQGRlZmdyb3VwIFdXREdfTEwgV1dERworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FeHBvcnRlZF9Db25zdGFudHMgV1dERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfV1dER19SZWFkUmVnIGFuZCAgTExfV1dER19Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9XV0RHX0NGUl9FV0kgICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9FV0kKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FQ19QUkVTQ0FMRVIgIFBSRVNDQUxFUgorKiBAeworKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMiAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzIgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfNCAgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzQgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfOCAgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzAgfCBXV0RHX0NGUl9XREdUQl8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzggKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMTYgICAgICAgICAgICAgICAgV1dER19DRlJfV0RHVEJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzE2ICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgIChXV0RHX0NGUl9XREdUQl8yIHwgV1dER19DRlJfV0RHVEJfMCkgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8zMiAqLworI2RlZmluZSBMTF9XV0RHX1BSRVNDQUxFUl82NCAgICAgICAgICAgICAgICAoV1dER19DRlJfV0RHVEJfMiB8IFdXREdfQ0ZSX1dER1RCXzEpICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvNjQgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfMTI4ICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzIgfCBXV0RHX0NGUl9XREdUQl8xIHwgV1dER19DRlJfV0RHVEJfMCkgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FeHBvcnRlZF9NYWNyb3MgV1dERyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBtYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFdXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9XV0RHX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gV1dERyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfV1dER19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdpbmRvdyBXYXRjaGRvZy4gVGhlIHdhdGNoZG9nIGlzIGFsd2F5cyBkaXNhYmxlZCBhZnRlciBhIHJlc2V0LgorICAqIEBub3RlICAgSXQgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZSBXREdBIGJpdCBpbiB0aGUgV1dER19DUiByZWdpc3RlciwKKyAgKiAgICAgICAgIHRoZW4gaXQgY2Fubm90IGJlIGRpc2FibGVkIGFnYWluIGV4Y2VwdCBieSBhIHJlc2V0LgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgc2V0IGJ5IHNvZnR3YXJlIGFuZCBvbmx5IGNsZWFyZWQgYnkgaGFyZHdhcmUgYWZ0ZXIgYSByZXNldC4KKyAgKiAgICAgICAgIFdoZW4gV0RHQSA9IDEsIHRoZSB3YXRjaGRvZyBjYW4gZ2VuZXJhdGUgYSByZXNldC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXREdBICAgICAgICAgIExMX1dXREdfRW5hYmxlCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0VuYWJsZShXV0RHX1R5cGVEZWYgKldXREd4KQoreworICBTRVRfQklUKFdXREd4LT5DUiwgV1dER19DUl9XREdBKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgV2luZG93IFdhdGNoZG9nIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXREdBICAgICAgICAgIExMX1dXREdfSXNFbmFibGVkCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfV1dER19Jc0VuYWJsZWQoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoV1dER3gtPkNSLCBXV0RHX0NSX1dER0EpID09IChXV0RHX0NSX1dER0EpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBXYXRjaGRvZyBjb3VudGVyIHZhbHVlIHRvIHByb3ZpZGVkIHZhbHVlICg3LWJpdHMgVFs2OjBdKQorICAqIEBub3RlICAgV2hlbiB3cml0aW5nIHRvIHRoZSBXV0RHX0NSIHJlZ2lzdGVyLCBhbHdheXMgd3JpdGUgMSBpbiB0aGUgTVNCIGI2IHRvIGF2b2lkIGdlbmVyYXRpbmcgYW4gaW1tZWRpYXRlIHJlc2V0CisgICogICAgICAgICBUaGlzIGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQgZXZlcnkgKDQwOTYgeCAyZXhwV0RHVEIpIFBDTEsgY3ljbGVzCisgICogICAgICAgICBBIHJlc2V0IGlzIHByb2R1Y2VkIHdoZW4gaXQgcm9sbHMgb3ZlciBmcm9tIDB4NDAgdG8gMHgzRiAoYml0IFQ2IGJlY29tZXMgY2xlYXJlZCkKKyAgKiAgICAgICAgIFNldHRpbmcgdGhlIGNvdW50ZXIgbG93ZXIgdGhlbiAweDQwIGNhdXNlcyBhbiBpbW1lZGlhdGUgcmVzZXQgKGlmIFdXREcgZW5hYmxlZCkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUICAgICAgICAgICAgIExMX1dXREdfU2V0Q291bnRlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlciAwLi4weDdGICg3IGJpdCBjb3VudGVyIHZhbHVlKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19TZXRDb3VudGVyKFdXREdfVHlwZURlZiAqV1dER3gsIHVpbnQzMl90IENvdW50ZXIpCit7CisgIE1PRElGWV9SRUcoV1dER3gtPkNSLCBXV0RHX0NSX1QsIENvdW50ZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIENvdW50ZXIgVmFsdWUgKDcgYml0cyBjb3VudGVyIHZhbHVlKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFQgICAgICAgICAgICAgTExfV1dER19HZXRDb3VudGVyCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCA3IGJpdCBXYXRjaGRvZyBDb3VudGVyIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfV1dER19HZXRDb3VudGVyKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNSLCBXV0RHX0NSX1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRpbWUgYmFzZSBvZiB0aGUgcHJlc2NhbGVyIChXREdUQikuCisgICogQG5vdGUgICBQcmVzY2FsZXIgaXMgdXNlZCB0byBhcHBseSByYXRpbyBvbiBQQ0xLIGNsb2NrLCBzbyB0aGF0IFdhdGNoZG9nIGNvdW50ZXIKKyAgKiAgICAgICAgIGlzIGRlY3JlbWVudGVkIGV2ZXJ5ICg0MDk2IHggMmV4cFdER1RCKSBQQ0xLIGN5Y2xlcworICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFdER1RCICAgICAgICAgTExfV1dER19TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8xMjgKKyogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX1NldFByZXNjYWxlcihXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoV1dER3gtPkNGUiwgV1dER19DRlJfV0RHVEIsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgV2F0Y2hkb2cgUHJlc2NhbGVyIFZhbHVlCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgV0RHVEIgICAgICAgICBMTF9XV0RHX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMTI4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfV1dER19HZXRQcmVzY2FsZXIoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9XREdUQikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2F0Y2hkb2cgV2luZG93IHZhbHVlIHRvIGJlIGNvbXBhcmVkIHRvIHRoZSBkb3duY291bnRlciAoNy1iaXRzIFdbNjowXSkuCisgICogQG5vdGUgICBUaGlzIHdpbmRvdyB2YWx1ZSBkZWZpbmVzIHdoZW4gd3JpdGUgaW4gdGhlIFdXREdfQ1IgcmVnaXN0ZXIKKyAgKiAgICAgICAgIHRvIHByb2dyYW0gV2F0Y2hkb2cgY291bnRlciBpcyBhbGxvd2VkLgorICAqICAgICAgICAgV2F0Y2hkb2cgY291bnRlciB2YWx1ZSB1cGRhdGUgbXVzdCBvY2N1ciBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgdmFsdWUKKyAgKiAgICAgICAgIGlzIGxvd2VyIHRoYW4gdGhlIFdhdGNoZG9nIHdpbmRvdyByZWdpc3RlciB2YWx1ZS4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgYSBNQ1UgcmVzZXQgaXMgZ2VuZXJhdGVkIGlmIHRoZSA3LWJpdCBXYXRjaGRvZyBjb3VudGVyIHZhbHVlCisgICogICAgICAgICAoaW4gdGhlIGNvbnRyb2wgcmVnaXN0ZXIpIGlzIHJlZnJlc2hlZCBiZWZvcmUgdGhlIGRvd25jb3VudGVyIGhhcyByZWFjaGVkCisgICogICAgICAgICB0aGUgd2F0Y2hkb2cgd2luZG93IHJlZ2lzdGVyIHZhbHVlLgorICAqICAgICAgICAgUGh5c2ljYWxseSBpcyBwb3NzaWJsZSB0byBzZXQgdGhlIFdpbmRvdyBsb3dlciB0aGVuIDB4NDAgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgKiAgICAgICAgIFRvIGdlbmVyYXRlIGFuIGltbWVkaWF0ZSByZXNldCwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSBDb3VudGVyIGxvd2VyIHRoYW4gMHg0MC4KKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBXICAgICAgICAgICAgIExMX1dXREdfU2V0V2luZG93CisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBXaW5kb3cgMHgwMC4uMHg3RiAoNyBiaXQgV2luZG93IHZhbHVlKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19TZXRXaW5kb3coV1dER19UeXBlRGVmICpXV0RHeCwgdWludDMyX3QgV2luZG93KQoreworICBNT0RJRllfUkVHKFdXREd4LT5DRlIsIFdXREdfQ0ZSX1csIFdpbmRvdyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgV2F0Y2hkb2cgV2luZG93IFZhbHVlICg3IGJpdHMgdmFsdWUpCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgVyAgICAgICAgICAgICBMTF9XV0RHX0dldFdpbmRvdworICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgNyBiaXQgV2F0Y2hkb2cgV2luZG93IHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfV1dER19HZXRXaW5kb3coV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9XKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIGlmIHRoZSBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBub3RlICAgVGhpcyBiaXQgaXMgc2V0IGJ5IGhhcmR3YXJlIHdoZW4gdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlIHZhbHVlIDB4NDAuCisgICogICAgICAgICBJdCBtdXN0IGJlIGNsZWFyZWQgYnkgc29mdHdhcmUgYnkgd3JpdGluZyAwLgorICAqICAgICAgICAgQSB3cml0ZSBvZiAxIGhhcyBubyBlZmZlY3QuIFRoaXMgYml0IGlzIGFsc28gc2V0IGlmIHRoZSBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRVdJRiAgICAgICAgICBMTF9XV0RHX0lzQWN0aXZlRmxhZ19FV0tVUAorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfSXNBY3RpdmVGbGFnX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFdXREd4LT5TUiwgV1dER19TUl9FV0lGKSA9PSAoV1dER19TUl9FV0lGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBGbGFnIChFV0lGKQorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEVXSUYgICAgICAgICAgTExfV1dER19DbGVhckZsYWdfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfQ2xlYXJGbGFnX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIFdSSVRFX1JFRyhXV0RHeC0+U1IsIH5XV0RHX1NSX0VXSUYpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBFYXJseSBXYWtldXAgSW50ZXJydXB0LgorICAqIEBub3RlICAgV2hlbiBzZXQsIGFuIGludGVycnVwdCBvY2N1cnMgd2hlbmV2ZXIgdGhlIGNvdW50ZXIgcmVhY2hlcyB2YWx1ZSAweDQwLgorICAqICAgICAgICAgVGhpcyBpbnRlcnJ1cHQgaXMgb25seSBjbGVhcmVkIGJ5IGhhcmR3YXJlIGFmdGVyIGEgcmVzZXQKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBFV0kgICAgICAgICAgIExMX1dXREdfRW5hYmxlSVRfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfRW5hYmxlSVRfRVdLVVAoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgU0VUX0JJVChXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9FV0kpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIEVXSSAgICAgICAgICAgTExfV1dER19Jc0VuYWJsZWRJVF9FV0tVUAorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfSXNFbmFibGVkSVRfRVdLVVAoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfRVdJKSA9PSAoV1dER19DRlJfRVdJKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogV1dERyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJHMHh4X0xMX1dXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvTGljZW5zZS5tZCBiL0xpY2Vuc2UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmYjM2YwotLS0gL2Rldi9udWxsCisrKyBiL0xpY2Vuc2UubWQKQEAgLTAsMCArMSwzIEBACisjIENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MKKworVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIHVuZGVyIHRoZSAqKkJTRCAzLUNsYXVzZSoqIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UpLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IDA2NjI3YjEuLjk2YmJmN2UgMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTEsMiArMSw0NSBAQAotIyBzdG0zMmcweHhfaGFsX2RyaXZlcgotUHJvdmlkZXMgdGhlIFNUTTMyQ3ViZSBNQ1UgQ29tcG9uZW50ICJoYWxfZHJpdmVyIiBvZiB0aGUgU1RNMzJHMCBzZXJpZXMuCisjIFNUTTMyQ3ViZUcwIEhBTCBEcml2ZXIgTUNVIENvbXBvbmVudAorCisjIyBPdmVydmlldworCisqKlNUTTMyQ3ViZSoqIGlzIGFuIFNUTWljcm9lbGVjdHJvbmljcyBvcmlnaW5hbCBpbml0aWF0aXZlIHRvIGVhc2UgdGhlIGRldmVsb3BlcnMgbGlmZSBieSByZWR1Y2luZyBlZmZvcnRzLCB0aW1lIGFuZCBjb3N0LgorCisqKlNUTTMyQ3ViZSoqIGNvdmVycyB0aGUgb3ZlcmFsbCBTVE0zMiBwcm9kdWN0cyBwb3J0Zm9saW8uIEl0IGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBlbWJlZGRlZCBzb2Z0d2FyZSBwbGF0Zm9ybSwgZGVsaXZlcmVkIGZvciBlYWNoIFNUTTMyIHNlcmllcy4KKyAgICogVGhlIENNU0lTIG1vZHVsZXMgKGNvcmUgYW5kIGRldmljZSkgY29ycmVzcG9uZGluZyB0byB0aGUgQVJNKHRtKSBjb3JlIGltcGxlbWVudGVkIGluIHRoaXMgU1RNMzIgcHJvZHVjdAorICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpbworICAgKiBUaGUgQlNQIERyaXZlcnMgb2YgZWFjaCBldmFsdWF0aW9uIG9yIGRlbW9uc3RyYXRpb24gYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKKyAgICogQSBjb25zaXN0ZW50IHNldCBvZiBtaWRkbGV3YXJlcyBjb21wb25lbnRzIHN1Y2ggYXMgUlRPUywgVVNCLCBGYXRGUywgR3JhcGhpY3MsIFNUTTMyX1RvdWNoU2Vuc2luZ19MaWJyYXJ5IC4uLgorICAgKiBBIGZ1bGwgc2V0IG9mIHNvZnR3YXJlIHByb2plY3RzIChiYXNpYyBleGFtcGxlcywgYXBwbGljYXRpb25zIG9yIGRlbW9uc3RyYXRpb25zKSBmb3IgZWFjaCBib2FyZCBwcm92aWRlZCBieSB0aGlzIFNUTTMyIHNlcmllcworCitUd28gbW9kZWxzIG9mIHB1YmxpY2F0aW9uIGFyZSBwcm9wb3NlZCBmb3IgdGhlIFNUTTMyQ3ViZSBlbWJlZGRlZCBzb2Z0d2FyZToKKyAgICogVGhlIG1vbm9saXRoaWMgKipNQ1UgUGFja2FnZSoqIDogYWxsIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGVzIG9mIG9uZSBTVE0zMiBzZXJpZXMgYXJlIHByZXNlbnQgKERyaXZlcnMsIE1pZGRsZXdhcmVzLCBQcm9qZWN0cywgVXRpbGl0aWVzKSBpbiB0aGUgcmVwbyAodXN1YWwgbmFtZSAqKlNUTTMyQ3ViZXh4KiosIHh4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNUTTMyIHNlcmllcykKKyAgICogVGhlICoqTUNVIGNvbXBvbmVudCoqIDogcHJvZ3Jlc3NpdmVseSBmcm9tIE5vdmVtYmVyIDIwMTksIGVhY2ggU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZSBiZWluZyBwYXJ0IG9mIHRoZSBTVE0zMkN1YmUgTUNVIFBhY2thZ2UsIHdpbGwgYmUgZGVsaXZlcmVkIGFzIGFuIGluZGl2aWR1YWwgcmVwbywgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IGFuZCBnZXQgb25seSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgZnVuY3Rpb25zLgorCisjIyBEZXNjcmlwdGlvbgorCitUaGlzICoqc3RtMzJnMHh4X2hhbF9kcml2ZXIqKiBNQ1UgY29tcG9uZW50IHJlcG8gaXMgb25lIGVsZW1lbnQgb2YgdGhlIFNUTTMyQ3ViZUcwIE1DVSBlbWJlZGRlZCBzb2Z0d2FyZSBwYWNrYWdlLCBwcm92aWRpbmcgdGhlICoqSEFMLUxMIERyaXZlcnMqKiBwYXJ0LgorCisjIyBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisKK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UpLgorCisjIyBDb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uCisKK0luIHRoaXMgdGFibGUsIHlvdSBjYW4gZmluZCB0aGUgc3VjY2Vzc2l2ZSB2ZXJzaW9ucyBvZiB0aGlzIEhBTC1MTCBEcml2ZXIgY29tcG9uZW50LCBpbiBsaW5lIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbnMgb2YgdGhlIGZ1bGwgTUNVIHBhY2thZ2U6CisKK0l0IGlzICoqY3J1Y2lhbCoqIHRoYXQgeW91IHVzZSBhIGNvbnNpc3RlbnQgc2V0IG9mIHZlcnNpb25zIGZvciB0aGUgQ01TSVMgQ29yZSAtIENNU0lTIERldmljZSAtIEhBTCwgYXMgbWVudGlvbmVkIGluIHRoaXMgdGFibGUuCisKK0hBTCBEcml2ZXIgRzAgfCBDTVNJUyBEZXZpY2UgRzAgfCBDTVNJUyBDb3JlIHwgV2FzIGRlbGl2ZXJlZCBpbiB0aGUgZnVsbCBNQ1UgcGFja2FnZQorLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUYWcgdjEuMi4wIHwgVGFnIHYxLjIuMCB8IFRhZyB2NC41X2NtMCB8IFRhZyB2MS4yLjAgKGFuZCBmb2xsb3dpbmcsIGlmIGFueSwgdGlsbCBuZXh0IG5ldyB0YWcpCisKK1RoZSBmdWxsICoqU1RNMzJDdWJlRzAqKiBNQ1UgcGFja2FnZSBpcyBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3MvU1RNMzJDdWJlRzApLgorCisjIyBUcm91Ymxlc2hvb3RpbmcKKworSWYgeW91IGhhdmUgYW55IGlzc3VlIHdpdGggdGhlICoqU29mdHdhcmUgY29udGVudCoqIG9mIHRoaXMgcmVwbywgeW91IGNhbiBbZmlsZSBhbiBpc3N1ZSBvbiBHaXRodWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJnMHh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldykuCisKK0ZvciBhbnkgb3RoZXIgcXVlc3Rpb24gcmVsYXRlZCB0byB0aGUgcHJvZHVjdCwgdGhlIHRvb2xzLCB0aGUgZW52aXJvbm1lbnQsIHlvdSBjYW4gc3VibWl0IGEgdG9waWMgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgpkaWZmIC0tZ2l0IGEvUmVsZWFzZV9Ob3Rlcy5odG1sIGIvUmVsZWFzZV9Ob3Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWI4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9SZWxlYXNlX05vdGVzLmh0bWwKQEAgLTAsMCArMSwyOTMgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgorICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9InBhbmRvYyIgLz4KKyAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9eWVzIiAvPgorICA8dGl0bGU+UmVsZWFzZSBOb3RlcyBmb3IgU1RNMzJHMHh4IEhBTCBEcml2ZXJzIFBhY2thZ2U8L3RpdGxlPgorICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgY29kZXt3aGl0ZS1zcGFjZTogcHJlLXdyYXA7fQorICAgICAgc3Bhbi5zbWFsbGNhcHN7Zm9udC12YXJpYW50OiBzbWFsbC1jYXBzO30KKyAgICAgIHNwYW4udW5kZXJsaW5le3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30KKyAgICAgIGRpdi5jb2x1bW57ZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB3aWR0aDogNTAlO30KKyAgPC9zdHlsZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJfaHRtcmVzYy9taW5pLXN0LmNzcyIgLz4KKyAgPCEtLVtpZiBsdCBJRSA5XT4KKyAgICA8c2NyaXB0IHNyYz0iLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaHRtbDVzaGl2LzMuNy4zL2h0bWw1c2hpdi1wcmludHNoaXYubWluLmpzIj48L3NjcmlwdD4KKyAgPCFbZW5kaWZdLS0+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgY2xhc3M9InJvdyI+Cis8ZGl2IGNsYXNzPSJjb2wtc20tMTIgY29sLWxnLTQiPgorPGRpdiBjbGFzcz0iY2FyZCBmbHVpZCI+Cis8ZGl2IGNsYXNzPSJzZWN0aW9uZSBkYXJrIj4KKzxjZW50ZXI+Cis8aDEgaWQ9InJlbGVhc2Utbm90ZXMtZm9yc3RtMzJnMHh4LWhhbC1kcml2ZXJzIj48c21hbGw+UmVsZWFzZSBOb3RlcyBmb3I8L3NtYWxsPjxtYXJrPlNUTTMyRzB4eCBIQUwgRHJpdmVyczwvbWFyaz48L2gxPgorPHA+Q29weXJpZ2h0IMKpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzPC9wPgorPGEgaHJlZj0iaHR0cHM6Ly93d3cuc3QuY29tIiBjbGFzcz0ibG9nbyI+PGltZyBzcmM9Il9odG1yZXNjL3N0X2xvZ28ucG5nIiBhbHQ9IlNUIGxvZ28iIC8+PC9hPgorPC9jZW50ZXI+Cis8L2Rpdj4KKzwvZGl2PgorPGgxIGlkPSJsaWNlbnNlIj5MaWNlbnNlPC9oMT4KKzxwPlRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCB0aGUg4oCcTGljZW5zZeKAnTsgWW91IG1heSBub3QgdXNlIHRoaXMgY29tcG9uZW50IGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDo8L3A+Cis8cD48YSBocmVmPSJodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZSI+aHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2U8L2E+PC9wPgorPGgxIGlkPSJwdXJwb3NlIj5QdXJwb3NlPC9oMT4KKzxwPlRoZSBTVE0zMkN1YmUgSEFMIGFuZCBMTCwgYW4gU1RNMzIgYWJzdHJhY3Rpb24gbGF5ZXIgZW1iZWRkZWQgc29mdHdhcmUsIGVuc3VyZSBtYXhpbWl6ZWQgcG9ydGFiaWxpdHkgYWNyb3NzIFNUTTMyIHBvcnRmb2xpby48L3A+Cis8cD5UaGUgUG9ydGFibGUgQVBJcyBsYXllciBwcm92aWRlcyBhIGdlbmVyaWMsIG11bHRpIGluc3RhbmNlZCBhbmQgc2ltcGxlIHNldCBvZiBBUElzIHRvIGludGVyYWN0IHdpdGggdGhlIHVwcGVyIGxheWVyIChhcHBsaWNhdGlvbiwgbGlicmFyaWVzIGFuZCBzdGFja3MpLiBJdCBpcyBjb21wb3NlZCBvZiBuYXRpdmUgYW5kIGV4dGVuZGVkIEFQSXMgc2V0LiBJdCBpcyBkaXJlY3RseSBidWlsdCBhcm91bmQgYSBnZW5lcmljIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIHRoZSBidWlsZC11cG9uIGxheWVycywgbGlrZSB0aGUgbWlkZGxld2FyZSBsYXllciwgdG8gaW1wbGVtZW50IGl0cyBmdW5jdGlvbnMgd2l0aG91dCBrbm93aW5nIGluLWRlcHRoIHRoZSB1c2VkIFNUTTMyIGRldmljZS4gVGhpcyBpbXByb3ZlcyB0aGUgbGlicmFyeSBjb2RlIHJldXNhYmlsaXR5IGFuZCBndWFyYW50ZWVzIGFuIGVhc3kgcG9ydGFiaWxpdHkgb24gb3RoZXIgZGV2aWNlcyBhbmQgU1RNMzIgZmFtaWxpZXMuPC9wPgorPHA+VGhlIExvdyBMYXllciAoTEwpIGRyaXZlcnMgYXJlIHBhcnQgb2YgdGhlIFNUTTMyQ3ViZSBmaXJtd2FyZSBIQUwgdGhhdCBwcm92aWRlIGJhc2ljIHNldCBvZiBvcHRpbWl6ZWQgYW5kIG9uZSBzaG90IHNlcnZpY2VzLiBUaGUgTG93IGxheWVyIGRyaXZlcnMsIGNvbnRyYXJ5IHRvIHRoZSBIQUwgb25lcyBhcmUgbm90IEZ1bGx5IFBvcnRhYmxlIGFjcm9zcyB0aGUgU1RNMzIgZmFtaWxpZXM7IHRoZSBhdmFpbGFiaWxpdHkgb2Ygc29tZSBmdW5jdGlvbnMgZGVwZW5kIG9uIHRoZSBwaHlzaWNhbCBhdmFpbGFiaWxpdHkgb2YgdGhlIHJlbGF0aXZlIGZlYXR1cmVzIG9uIHRoZSBwcm9kdWN0LiBUaGUgTG93IExheWVyIChMTCkgZHJpdmVycyBhcmUgZGVzaWduZWQgdG8gb2ZmZXIgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L3A+Cis8dWw+Cis8bGk+TmV3IHNldCBvZiBpbmxpbmUgZnVuY3Rpb24gZm9yIGRpcmVjdCBhbmQgYXRvbWljIHJlZ2lzdGVyIGFjY2VzczwvbGk+Cis8bGk+T25lLXNob3Qgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBIQUwgZHJpdmVycyBvciBmcm9tIGFwcGxpY2F0aW9uIGxldmVsLjwvbGk+Cis8bGk+RnVsbHkgSW5kZXBlbmRhbnQgZnJvbSBIQUwgYW5kIGNhbiBiZSB1c2VkIGluIHN0YW5kYWxvbmUgdXNhZ2UgKHdpdGhvdXQgSEFMIGRyaXZlcnMpPC9saT4KKzxsaT5GdWxsIGZlYXR1cmVzIGNvdmVyYWdlIG9mIHRoZSBhbGwgdGhlIHN1cHBvcnRlZCBwZXJpcGhlcmFscy48L2xpPgorPC91bD4KKzwvZGl2PgorPGRpdiBjbGFzcz0iY29sLXNtLTEyIGNvbC1sZy04Ij4KKzxoMSBpZD0idXBkYXRlLWhpc3RvcnkiPlVwZGF0ZSBIaXN0b3J5PC9oMT4KKzxkaXYgY2xhc3M9ImNvbGxhcHNlIj4KKzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNvbGxhcHNlLXNlY3Rpb24zIiBjaGVja2VkIGFyaWEtaGlkZGVuPSJ0cnVlIj4gPGxhYmVsIGZvcj0iY29sbGFwc2Utc2VjdGlvbjMiIGFyaWEtaGlkZGVuPSJ0cnVlIj5WMS4yLjAgLyAwNS1BcHJpbC0yMDE5PC9sYWJlbD4KKzxkaXY+Cis8aDIgaWQ9Im1haW4tY2hhbmdlcyI+TWFpbiBDaGFuZ2VzPC9oMj4KKzxoMyBpZD0ibWFpbnRlbmFuY2UtcmVsZWFzZS1hbmQtcHJvZHVjdC11cGRhdGUiPk1haW50ZW5hbmNlIHJlbGVhc2UgYW5kIHByb2R1Y3QgdXBkYXRlPC9oMz4KKzxwPkZpcnN0IHJlbGVhc2Ugb2YgSEFMIGFuZCBMb3cgbGF5ZXJzIGRyaXZlcnMgdG8gaW50cm9kdWNlIHN1cHBvcnQgb2YgPHN0cm9uZz5TVE0zMkcwNDF4eC9TVE0zMkcwMzF4eC9TVE0zMkcwMzB4eCBkZXZpY2VzPC9zdHJvbmc+LjwvcD4KKzxwPk1haW50ZW5hbmNlIHJlbGVhc2Ugb2YgSEFMIGFuZCBMb3cgbGF5ZXJzIGRyaXZlcnMgc3VwcG9ydGluZyBTVE0zMkcwODF4eC9TVE0zMkcwNzF4eC9TVE0zMkcwNzB4eCBkZXZpY2VzLjwvcD4KKzx0YWJsZT4KKzxjYXB0aW9uPkFkZGl0aW9uYWwgZmVhdHVyZXM8YnIgLz4KKzwvY2FwdGlvbj4KKzx0aGVhZD4KKzx0ciBjbGFzcz0iaGVhZGVyIj4KKzx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPkhlYWRsaW5lPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+SEFMLCBMTCBEcml2ZXJzIHVwZGF0ZSB0byBzdXBwb3J0IFNUTTMyRzA0MXh4LCBTVE0zMkcwMzF4eCwgU1RNMzJHMDMweHg8L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPHRhYmxlPgorPGNhcHRpb24+Rml4ZWQgYnVncyBsaXN0PC9jYXB0aW9uPgorPHRoZWFkPgorPHRyIGNsYXNzPSJoZWFkZXIiPgorPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+SGVhZGxpbmU8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMXSBDb3JyZWN0IHBvc3NpYmxlIGlzc3VlIHdpdGhpbiBIQUxfU2V0VGlja0ZyZXEoKWZ1bmN0aW9uPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBSQ0NdIFVzZSB2YXJpYWJsZSB1d1RpY2tQcmlvIGluc3RlYWQgVElDS19JTlRfUFJJT1JJVFkgdG8gbm90IG92ZXJ3cml0ZSBUaWNrIHByaW9yaXR5PC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMIFJDQ10gVXNlIExMIG1hY3JvIF9fTExfUkNDX0NBTENfUENMSzFfRlJFUSgpIGluIEhBTF9SQ0NfR2V0UENMSzFGcmVxKCkgdG8gc29sdmUgbWlzcmEgYyAyMDEyIGlzc3VlczwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBBRENdIExMIGZ1bmN0aW9uIExMX0FEQ19TZXRDb21tb25GcmVxdWVuY3lNb2RlKCkgaXMgdXNlbGVzcyBpbiBTVE0zMkcwLCBrZXB0IGZvciBsZWdhY3kgcHVycG9zZS48L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgREFDXSBSZW5hbWUgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRC9IQUxfREFDX01TUF9ERUlOSVRfQ0JfSUQgaW4gSEFMX0RBQ19NU1BJTklUX0NCX0lEL0hBTF9EQUNfTVNQREVJTklUX0NCX0lEPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBEQUNdIEludGVybmFsIGZ1bmN0aW9uIERBQ19ETUFDb252Q3BsdENoMSgpLCBEQUNfRE1BRXJyb3JDaDEoKSwgREFDX0RNQUhhbGZDb252Q3BsdENoMSgpIG1vdmVkIHRvIGhhbF9kYWNfZXguYzwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBEQUNdIFVzZSBEQUMgZHJpdmVyIGRlZmluZSBpbnN0ZWFkIG9mIENNU0lTIGJpdCB0byBjaGVjayBpZiBzb2Z0d2FyZSB0cmlnZ2VyIGVuYWJsZWQgaW4gSEFMX0RBQ19TdGFydCgpPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBGTEFTSF0gSEFMIGZsYXNoIGRyaXZlciBpbXByb3ZlbWVudCA6IHR5cG8sIGNvbW1lbnRzIGNvcnJlY3Rpb24sIGFkZCBVIHN1ZmZpeCwgdXNlZCBDTVNJUyBkZWZpbmUgaW5zdGVhZCBvZiBoYXJjb2RlZCB2YWx1ZSwgdXNlIEhBTCBtYWNybyBpbnN0ZWFkIG9mIGRpcmVjdCByZWdpc3RlciBhY2Nlc3M8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgRkxBU0hdIENsZWFyIEZMQVNIX0lUX0VDQ0MgZmxhZyB3aGVuIGRpc2FibGluZyBFbmQgb2YgT3BlcmF0aW9uIGFuZCBFcnJvciBpbnRlcnJ1cHRzIGluIEhBTF9GTEFTSF9JUlFIYW5kbGVyKCk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMIEdQSU9dIENvcnJlY3QgY29tcGlsYXRpb24gd2FybmluZyB3aXRoIG5ldyBJQVIgOC4zMC4xIGluIElTX0dQSU9fUElOKCkgbWFjcm88L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgR1BJT10gRW5oYW5jZSByZWVudHJhbmN5IHJvYnVzdG5lc3MgZm9yIEhBTF9HUElPX1RvZ2dsZVBpbigpIEFQSTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBQV1JdIENvcnJlY3QgZGVmaW5pdGlvbiBvZiBMTF9QV1JfTU9ERV9TVE9QMCBhbmQgTExfUFdSX01PREVfU1RPUDE8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBQV1JdIENvcnJlY3QgZGVmaW5pdGlvbiBvZiByZWdpc3RlcnMgYWRkcmVzcy1iYXNlZCBhY2Nlc3Nlcywgd2hpY2ggTVVTVCBiZSB2b2xhdGlsZTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgUlRDXSBBZGQgbWFuYWdlbWVudCBvZiBJTklURiBmbGFnIHJpc2luZyBvY2N1cnJlbmNlIHRvbyBlYXJseSB3aGVuIGVudGVyaW5nIGluaXQgbW9kZTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBSVENdIENvcnJlY3QgV1VUV0YgZmxhZyBtYW5hZ2VtZW50IGluIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpIEFQSTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgUlRDXSBSZW5hbWUgUlRDX0lUX01BU0sgaW50byBSVENfRkxBR19NQVNLPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMIFJUQ10gUmVwbGFjZSBoYXJkY29kZWQgdmFsdWVzIGJ5IENNU0lTIF9Qb3MgZGVmaW5pdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgVElNXSBBbGlnbiBETUEgQnVyc3QgZGVmaW5lcyB3aXRoIHRoZSByZWZlcmVuY2UgbWFudWFsOiBBZGQgVElNX0RNQUJBU0VfVElTRUwgZGVmaW5pdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0xMIFRJTV0gUmVtb3ZlIHBhcmVudGhlc2lzIG9uIFJFRyBwYXJhbWV0ZXIgaW4gTExfTFBUSU1fV3JpdGVSZWcoKSBhbmQgTExfTFBUSU1fUmVhZFJlZygpIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGZhaWx1cmUgYWZ0ZXIgTUlTUkEgY29ycmVjdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgRE1BXSBBZGQgY2xlYW4gb2YgQ2FsbGJhY2tzIGluIEhBTF9ETUFfRGVJbml0KCkgYW5kIHJlbW92ZSBpdCBmcm9tIEhBTF9ETUFfSW5pdCgpPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzxwPjxiciAvPgorPC9wPgorPGgyIGlkPSJkZXZlbG9wbWVudC10b29sY2hhaW5zLWFuZC1jb21waWxlcnMiPkRldmVsb3BtZW50IFRvb2xjaGFpbnMgYW5kIENvbXBpbGVyczwvaDI+Cis8dWw+Cis8bGk+SUFSIEVtYmVkZGVkIFdvcmtiZW5jaCBmb3IgQVJNIChFV0FSTSkgdG9vbGNoYWluIFY4LjIwLjI8L2xpPgorPGxpPlJlYWxWaWV3IE1pY3JvY29udHJvbGxlciBEZXZlbG9wbWVudCBLaXQgKE1ESy1BUk0pIHRvb2xjaGFpbiBWNS4yNTwvbGk+Cis8bGk+U3lzdGVtIFdvcmtiZW5jaCBTVE0zMiAoU1c0U1RNMzIpIHRvb2xjaGFpbiBWMi43LjI8L2xpPgorPC91bD4KKzxoMiBpZD0ic3VwcG9ydGVkLWRldmljZXMtYW5kLWJvYXJkcyI+U3VwcG9ydGVkIERldmljZXMgYW5kIGJvYXJkczwvaDI+Cis8cD5TdXBwb3J0ZWQgRGV2aWNlczo8L3A+Cis8dWw+Cis8bGk+U1RNMzJHMDgxeHgsIFNUTTMyRzA3MXh4LCBTVE0zMkcwNzB4eDwvbGk+Cis8bGk+PHN0cm9uZz5TVE0zMkcwNDF4eCwgU1RNMzJHMDMxeHgsIFNUTTMyRzAzMHh4PC9zdHJvbmc+PC9saT4KKzwvdWw+Cis8aDIgaWQ9ImJhY2t3YXJkLWNvbXBhdGliaWxpdHkiPkJhY2t3YXJkIENvbXBhdGliaWxpdHk8L2gyPgorPHA+VGhpcyByZWxlYXNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbnMuPC9wPgorPGgyIGlkPSJkZXBlbmRlbmNpZXMiPkRlcGVuZGVuY2llczwvaDI+Cis8cD5UaGlzIHNvZnR3YXJlIHJlbGVhc2UgaXMgY29tcGF0aWJsZSB3aXRoOjwvcD4KKzxwPlNUTTMyQ3ViZU1YIFY1LjIuMDwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb2xsYXBzZSI+Cis8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjb2xsYXBzZS1zZWN0aW9uMiIgYXJpYS1oaWRkZW49InRydWUiPiA8bGFiZWwgZm9yPSJjb2xsYXBzZS1zZWN0aW9uMiIgYXJpYS1oaWRkZW49InRydWUiPlYxLjEuMCAvIDA2LUZlYnJ1YXJ5LTIwMTk8L2xhYmVsPgorPGRpdj4KKzxoMiBpZD0ibWFpbi1jaGFuZ2VzLTEiPk1haW4gQ2hhbmdlczwvaDI+Cis8aDMgaWQ9Im1haW50ZW5hbmNlLXJlbGVhc2UtYW5kLXByb2R1Y3QtdXBkYXRlLTEiPk1haW50ZW5hbmNlIHJlbGVhc2UgYW5kIHByb2R1Y3QgdXBkYXRlPC9oMz4KKzxwPk1haW50ZW5hbmNlIHJlbGVhc2Ugb2YgSEFMIGFuZCBMb3cgbGF5ZXJzIGRyaXZlcnMgdG8gc3VwcG9ydCBTVE0zMkcwNzF4eC9TVE0zMkcwODF4eC9TVE0zMkcwNzB4eCBkZXZpY2VzLjwvcD4KKzx0YWJsZT4KKzxjYXB0aW9uPkFkZGl0aW9uYWwgZmVhdHVyZXM8YnIgLz4KKzwvY2FwdGlvbj4KKzx0aGVhZD4KKzx0ciBjbGFzcz0iaGVhZGVyIj4KKzx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPkhlYWRsaW5lPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+TUlTUkFDMjAxMiBpbXBsZW1lbnRhdGlvbiBpbiBDRUMvQ1JZUC9XV0RHL1JORy9JMlMvU1BJL1VUSUxTL0lXREcvVVNBUlQvVUFSVC9JMkM8L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPHRhYmxlPgorPGNhcHRpb24+Rml4ZWQgYnVncyBsaXN0PC9jYXB0aW9uPgorPHRoZWFkPgorPHRyIGNsYXNzPSJoZWFkZXIiPgorPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+SGVhZGxpbmU8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgQURDXSBjb21waWxhdGlvbiB3YXJuaW5nIGluIHN0bTMyZzB4eF9sbF9hZGMuaCB3aXRoIE1ESy1BUk08L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgQURDXSBXcm9uZyBjb21tZW50YXJ5IGluIHN0bTMyZzB4eF9sbF9hZGMuaDwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0xMIEFEQ10gbWlzc2luZyB0byBmaWxsIEFEQ19DRkdSMl9DS01PREUgaW4gTExfQURDX0luaXQgKCk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgQURDXSByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXJzIGFkZHJlc3MgTVVTVCBiZSB2b2xhdGlsZSAoX0lPKTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0xMIEFEQ10gUG90ZW50aWFsIGluZmluaXRlIHdhaXQgaW4gd2hpbGUgbG9vcCBvZiBMTF9BRENfRGVJbml0KCk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bQURDXSBFbWJlZGRlZCBTVyBjb2RlIGNvbW1lbnRzIG9yIGRvY3VtZW50IG11c3QgdXNlIOKAmOKAmVBlcmlwaGVyYWzigJnigJkgcmF0aGVyIHRoYW4g4oCY4oCZSVDigJnigJk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBDT01QXSByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXJzIGFkZHJlc3MgTVVTVCBiZSB2b2xhdGlsZSAoX0lPKTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgQ1lSUF0gU3VwcG9ydCBzZXZlcmFsIGNhbGwgdG8gZGVjcnlwdCBBUEkgd2l0aG91dCBpbml0aWFsaXplIEtleSBhbmQgSVZSIC0gPHN0cm9uZz5BUEkgdXBkYXRlPC9zdHJvbmc+PC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMIENSWVBdIEFkZCBwb3NzaWJpbGl0eSB0byBub3Qgc2V0IGtleSBpbiBIQUwgQ1JZUCBpbnRlcmZhY2U8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgRE1BXSBJU19MTF9ETUFfUEVSSVBIUkVRVUVTVCBtYWNybyBpcyBub3QgYWxpZ25lZCB3aXRoIHRoZSBtYXggbnVtYmVyIG9mIHJlcXVlc3Q8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltGTEFTSF1bTUlTUkFDMjAxMi1SdWxlLTguNV9iXSBNdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgZXh0ZXJuYWxseS1saW5rZWQgb2JqZWN0PC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0ZMQVNIXVByb2dyYW0gRG91YmxlV29yZCBmYWlscyAoUEdBRVJSKSB3aGVuIHVzaW5nIFNUUkQgYXNzZW1ibHkgaW5zdHJ1Y3Rpb248L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltJMkNdW01JU1JBQzIwMTJdIE1JU1JBQzIwMTItUnVsZS0yLjJjIGFuZCAxNy44IHdoZW4gSVRGbGFncyBpcyBtb2RpZmllZDwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgSTJDXSBJc3N1ZSB1c2luZyBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEsIFNUT1BGIGFycml2ZXMgdG9vIGVhcmx5IHZlcnN1cyBETUEgY3BsdCBtZXNzYWdlPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgUkNDXSBDb3JyZWN0IEVYVEVSTkFMX0NMT0NLX1ZBTFVFPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+W0hBTCBSQ0NdW0NvZGVTb25hcl0gSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEgLSBVc2VsZXNzIEFzc2lnbm1lbnQ8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltIQUwgUkNDXSBNQ1UgaGFuZ3MgYWZ0ZXIgc29tZSBzdG9wL3dha2V1cCBjeWNsZXM8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iZXZlbiI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bSEFMIFJDQ10gX19IQUxfUkNDX1BMTHh4X0NPTkZJRygpIG1hY3JvcyBzaGFsbCBwcmVzZXJ2ZSBvdXRwdXQgY2xvY2socykgZW5hYmxlIHN0YXRlPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9Im9kZCI+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5bTEwgVUFSVF1bQ29kZVNvbmFyXSBDYXN0IGFsdGVyIHZhbHVlIChMTF9MUFVBUlRfUmVjZWl2ZURhdGE4KTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBVQVJUXVtDb2RlU29uYXJdIFVuaW5pdGlhbGl6ZWQgVmFyaWFibGUgKExMX0xQVUFSVF9HZXRCYXVkUmF0ZSk8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPltMTCBVU0FSVF1bQ29kZVNvbmFyXSBDYXN0IGFsdGVyIHZhbHVlIChMTF9VU0FSVF9SZWNlaXZlRGF0YTgpPC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzxwPjxiciAvPgorPC9wPgorPGgyIGlkPSJzdXBwb3J0ZWQtZGV2aWNlcy1hbmQtYm9hcmRzLTEiPlN1cHBvcnRlZCBEZXZpY2VzIGFuZCBib2FyZHM8L2gyPgorPHA+U3VwcG9ydGVkIERldmljZXM6PC9wPgorPHVsPgorPGxpPlNUTTMyRzA8c3Ryb25nPjgxPC9zdHJvbmc+eHg8L2xpPgorPGxpPlNUTTMyRzA8c3Ryb25nPjcxPC9zdHJvbmc+eHg8L2xpPgorPGxpPlNUTTMyRzA8c3Ryb25nPjcwPC9zdHJvbmc+eHg8L2xpPgorPC91bD4KKzxoMiBpZD0iYmFja3dhcmQtY29tcGF0aWJpbGl0eS0xIj5CYWNrd2FyZCBDb21wYXRpYmlsaXR5PC9oMj4KKzxwPlRoaXMgcmVsZWFzZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHZlcnNpb25zLjwvcD4KKzxoMiBpZD0iZGVwZW5kZW5jaWVzLTEiPkRlcGVuZGVuY2llczwvaDI+Cis8cD5UaGlzIHNvZnR3YXJlIHJlbGVhc2UgaXMgY29tcGF0aWJsZSB3aXRoOjwvcD4KKzxwPlNUTTMyQ3ViZU1YIFY1LjEuMDwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb2xsYXBzZSI+Cis8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjb2xsYXBzZS1zZWN0aW9uMSIgYXJpYS1oaWRkZW49InRydWUiPiA8bGFiZWwgZm9yPSJjb2xsYXBzZS1zZWN0aW9uMSIgYXJpYS1oaWRkZW49InRydWUiPlYxLjAuMCAvIDI2LU9jdG9iZXItMjAxODwvbGFiZWw+Cis8ZGl2PgorPGgyIGlkPSJtYWluLWNoYW5nZXMtMiI+TWFpbiBDaGFuZ2VzPC9oMj4KKzxoMyBpZD0iZmlyc3QtcmVsZWFzZSI+Rmlyc3QgcmVsZWFzZTwvaDM+Cis8cD5GaXJzdCBvZmZpY2lhbCByZWxlYXNlIG9mIEhBTCBhbmQgTG93IGxheWVycyBkcml2ZXJzIHRvIHN1cHBvcnQgU1RNMzJHMDcxeHgvU1RNMzJHMDgxeHgvU1RNMzJHMDcweHg8L3A+Cis8aDIgaWQ9InN1cHBvcnRlZC1kZXZpY2VzLWFuZC1ib2FyZHMtMiI+U3VwcG9ydGVkIERldmljZXMgYW5kIGJvYXJkczwvaDI+Cis8cD5TdXBwb3J0ZWQgRGV2aWNlczo8L3A+Cis8dWw+Cis8bGk+U1RNMzJHMDxzdHJvbmc+ODE8L3N0cm9uZz54eDwvbGk+Cis8bGk+U1RNMzJHMDxzdHJvbmc+NzE8L3N0cm9uZz54eDwvbGk+Cis8bGk+U1RNMzJHMDxzdHJvbmc+NzA8L3N0cm9uZz54eDwvbGk+Cis8L3VsPgorPGgyIGlkPSJkZXBlbmRlbmNpZXMtMiI+RGVwZW5kZW5jaWVzPC9oMj4KKzxwPlRoaXMgc29mdHdhcmUgcmVsZWFzZSBpcyBjb21wYXRpYmxlIHdpdGg6PC9wPgorPHA+U1RNMzJDdWJlTVggVjUuMC4wPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8Zm9vdGVyIGNsYXNzPSJzdGlja3kiPgorPHA+Rm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gPHN0cm9uZz5TVE0zMiBNaWNyb2NvbnRyb2xsZXJzPC9zdHJvbmc+LCB2aXNpdDogPGEgaHJlZj0iaHR0cDovL3d3dy5zdC5jb20vU1RNMzIiPmh0dHA6Ly93d3cuc3QuY29tL1NUTTMyPC9hPjwvcD4KKzxwPlRoaXMgcmVsZWFzZSBub3RlIHVzZXMgdXAgdG8gZGF0ZSB3ZWIgc3RhbmRhcmRzIGFuZCwgZm9yIHRoaXMgcmVhc29uLCBzaG91bGQgbm90IGJlIG9wZW5lZCB3aXRoIEludGVybmV0IEV4cGxvcmVyIGJ1dCBwcmVmZXJhYmx5IHdpdGggcG9wdWxhciBicm93c2VycyBzdWNoIGFzIEdvb2dsZSBDaHJvbWUsIE1vemlsbGEgRmlyZWZveCwgT3BlcmEgb3IgTWljcm9zb2Z0IEVkZ2UuPC9wPgorPC9mb290ZXI+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbC5jIGIvU3JjL3N0bTMyZzB4eF9oYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExZTRmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWwuYwpAQCAtMCwwICsxLDc0NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWwuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBpcyB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIEhBTCBpbml0aWFsaXphdGlvbgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBjb21tb24gSEFMIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIGFuZCBjb21tb24gQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdGhlIFBQUCBwZXJpcGhlcmFsIGRyaXZlcnMgYW5kIHRoZSB1c2VyIHRvIHN0YXJ0IHVzaW5nIHRoZSBIQUwuCisgICAgWy4uXQorICAgIFRoZSBIQUwgY29udGFpbnMgdHdvIEFQSXMgY2F0ZWdvcmllczoKKyAgICAgICAgICgrKSBDb21tb24gSEFMIEFQSXMKKyAgICAgICAgICgrKSBTZXJ2aWNlcyBIQUwgQVBJcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUwKKyAgKiBAYnJpZWYgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9Qcml2YXRlX0NvbnN0YW50cyBIQUwgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgKiBAYnJpZWYgU1RNMzJHMHh4IEhBTCBEcml2ZXIgdmVyc2lvbiBudW1iZXIKKyAgICovCisjZGVmaW5lIF9fU1RNMzJHMHh4X0hBTF9WRVJTSU9OX01BSU4gICAoMHgwMVUpIC8qITwgWzMxOjI0XSBtYWluIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkcweHhfSEFMX1ZFUlNJT05fU1VCMSAgICgweDAyVSkgLyohPCBbMjM6MTZdIHN1YjEgdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTl9TVUIyICAgKDB4MDBVKSAvKiE8IFsxNTo4XSAgc3ViMiB2ZXJzaW9uICovCisjZGVmaW5lIF9fU1RNMzJHMHh4X0hBTF9WRVJTSU9OX1JDICAgICAoMHgwMFUpIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovCisjZGVmaW5lIF9fU1RNMzJHMHh4X0hBTF9WRVJTSU9OICAgICAgICAgKChfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTl9NQUlOIDw8IDI0VSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTl9TVUIxIDw8IDE2VSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTl9TVUIyIDw8IDhVIClcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTl9SQykpCisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisjZGVmaW5lIFZSRUZCVUZfVElNRU9VVF9WQUxVRSAgICAgMTBVICAgLyohPCAgMTAgbXMgKi8KKyNlbmRpZiAvKiBWUkVGQlVGICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX1ZhcmlhYmxlcyBIQUwgRXhwb3J0ZWQgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK19fSU8gdWludDMyX3QgdXdUaWNrOwordWludDMyX3QgdXdUaWNrUHJpbyA9ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUyk7IC8qIEludmFsaWQgUFJJTyAqLwordWludDMyX3QgdXdUaWNrRnJlcSA9IEhBTF9USUNLX0ZSRVFfREVGQVVMVDsgIC8qIDFLSHogKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBIQUwgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBIQUwgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgRmxhc2ggaW50ZXJmYWNlIHRoZSBOVklDIGFsbG9jYXRpb24gYW5kIGluaXRpYWwgdGltZSBiYXNlCisgICAgICAgICAgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAgICAgICgrKSBEZS1pbml0aWFsaXplIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwuCisgICAgICAoKykgQ29uZmlndXJlIHRoZSB0aW1lIGJhc2Ugc291cmNlIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkCisgICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICgrKykgU3lzVGljayB0aW1lciBpcyB1c2VkIGJ5IGRlZmF1bHQgYXMgc291cmNlIG9mIHRpbWUgYmFzZSwgYnV0IHVzZXIKKyAgICAgICAgICAgICBjYW4gZXZlbnR1YWxseSBpbXBsZW1lbnQgaGlzIHByb3BlciB0aW1lIGJhc2Ugc291cmNlIChhIGdlbmVyYWwgcHVycG9zZQorICAgICAgICAgICAgIHRpbWVyIGZvciBleGFtcGxlIG9yIG90aGVyIHRpbWUgc291cmNlKSwga2VlcGluZyBpbiBtaW5kIHRoYXQgVGltZSBiYXNlCisgICAgICAgICAgICAgZHVyYXRpb24gc2hvdWxkIGJlIGtlcHQgMW1zIHNpbmNlIFBQUF9USU1FT1VUX1ZBTFVFcyBhcmUgZGVmaW5lZCBhbmQKKyAgICAgICAgICAgICBoYW5kbGVkIGluIG1pbGxpc2Vjb25kcyBiYXNpcy4KKyAgICAgICAgKCsrKSBUaW1lIGJhc2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoSEFMX0luaXRUaWNrICgpKSBpcyBjYWxsZWQgYXV0b21hdGljYWxseQorICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gYWZ0ZXIgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZQorICAgICAgICAgICAgIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgorICAgICAgICAoKyspIFNvdXJjZSBvZiB0aW1lIGJhc2UgaXMgY29uZmlndXJlZCAgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyCisgICAgICAgICAgICAgdGltZSBpbnRlcnZhbHMuIENhcmUgbXVzdCBiZSB0YWtlbiBpZiBIQUxfRGVsYXkoKSBpcyBjYWxsZWQgZnJvbSBhCisgICAgICAgICAgICAgcGVyaXBoZXJhbCBJU1IgcHJvY2VzcywgdGhlIFRpY2sgaW50ZXJydXB0IGxpbmUgbXVzdCBoYXZlIGhpZ2hlciBwcmlvcml0eQorICAgICAgICAgICAgKG51bWVyaWNhbGx5IGxvd2VyKSB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICAgICAgICAgIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4KKyAgICAgICAoKyspIGZ1bmN0aW9ucyBhZmZlY3RpbmcgdGltZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBkZWNsYXJlZCBhcyBfX3dlYWsKKyAgICAgICAgICAgICB0byBtYWtlICBvdmVycmlkZSBwb3NzaWJsZSAgaW4gY2FzZSBvZiBvdGhlciAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBGbGFzaCBwcmVmZXRjaCBhbmQgdGhlIEluc3RydWN0aW9uIGNhY2hlLAorICAqICAgICAgICAgdGhlIHRpbWUgYmFzZSBzb3VyY2UsIE5WSUMgYW5kIGFueSByZXF1aXJlZCBnbG9iYWwgbG93IGxldmVsIGhhcmR3YXJlCisgICogICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfTXNwSW5pdCgpIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIG9wdGlvbmFsbHkgZGVmaW5lZCBpbiB1c2VyIGZpbGUKKyAgKiAgICAgICAgIHN0bTMyZzB4eF9oYWxfbXNwLmMuCisgICoKKyAgKiBAbm90ZSAgIEhBTF9Jbml0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlciByZXNldCBhbmQgYmVmb3JlCisgICogICAgICAgICB0aGUgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAgKgorICAqIEBub3RlICAgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGhlIFN5c3RlbSBUaW1lciAoU3lzdGljaykgaXMgdXNlZCBhcyBzb3VyY2Ugb2YgdGltZSBiYXNlLgorICAqICAgICAgICAgVGhlIFN5c3RpY2sgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiBIU0kgY2xvY2ssIGFzIEhTSSBpcyB0aGUgY2xvY2sKKyAgKiAgICAgICAgIHVzZWQgYWZ0ZXIgYSBzeXN0ZW0gUmVzZXQuCisgICogICAgICAgICBPbmNlIGRvbmUsIHRpbWUgYmFzZSB0aWNrIHN0YXJ0cyBpbmNyZW1lbnRpbmc6IHRoZSB0aWNrIHZhcmlhYmxlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQKKyAgKiAgICAgICAgIGVhY2ggMW1zIGluIHRoZSBTeXNUaWNrX0hhbmRsZXIoKSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXQodm9pZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDb25maWd1cmUgRmxhc2ggcHJlZmV0Y2gsIEluc3RydWN0aW9uIGNhY2hlICAgICAgICAgICAgICovCisgIC8qIERlZmF1bHQgY29uZmlndXJhdGlvbiBhdCByZXNldCBpczogICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBQcmVmZXRjaCBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEluc3RydWN0aW9uIGNhY2hlIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFID09IDBVKQorICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9ESVNBQkxFKCk7CisjZW5kaWYgLyogSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFICovCisKKyNpZiAoUFJFRkVUQ0hfRU5BQkxFICE9IDBVKQorICBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFKCk7CisjZW5kaWYgLyogUFJFRkVUQ0hfRU5BQkxFICovCisKKyAgLyogVXNlIFN5c1RpY2sgYXMgdGltZSBiYXNlIHNvdXJjZSBhbmQgY29uZmlndXJlIDFtcyB0aWNrIChkZWZhdWx0IGNsb2NrIGFmdGVyIFJlc2V0IGlzIEhTSSkgKi8KKyAgaWYgKEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSkgIT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX01zcEluaXQoKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGRlLUluaXRpYWxpemVzIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgYW5kIHN0b3BzIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EZUluaXQodm9pZCkKK3sKKyAgLyogUmVzZXQgb2YgYWxsIHBlcmlwaGVyYWxzICovCisgIF9fSEFMX1JDQ19BUEIxX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BUEIxX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FIQl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQUhCX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfSU9QX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19JT1BfUkVMRUFTRV9SRVNFVCgpOworCisgIC8qIERlLUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfTXNwRGVJbml0KCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9Nc3BJbml0KHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgc291cmNlIG9mIHRoZSB0aW1lIGJhc2U6CisgICogICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICAqICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgcmVjb25maWd1cmVkICBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuCisgICogICAgICAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuCisgICogICAgICAgQ2FyZSBtdXN0IGJlIHRha2VuIGlmIEhBTF9EZWxheSgpIGlzIGNhbGxlZCBmcm9tIGEgcGVyaXBoZXJhbCBJU1IgcHJvY2VzcywKKyAgKiAgICAgICBUaGUgU3lzVGljayBpbnRlcnJ1cHQgbXVzdCBoYXZlIGhpZ2hlciBwcmlvcml0eSAobnVtZXJpY2FsbHkgbG93ZXIpCisgICogICAgICAgdGhhbiB0aGUgcGVyaXBoZXJhbCBpbnRlcnJ1cHQuIE90aGVyd2lzZSB0aGUgY2FsbGVyIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4KKyAgKiAgICAgICBUaGUgZnVuY3Rpb24gaXMgZGVjbGFyZWQgYXMgX193ZWFrICB0byBiZSBvdmVyd3JpdHRlbiAgaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9uICBpbiB1c2VyIGZpbGUuCisgICogQHBhcmFtIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOworCisgIGlmICh1d1RpY2tGcmVxICE9IDBVKQorICB7CisgICAgLypDb25maWd1cmUgdGhlIFN5c1RpY2sgdG8gaGF2ZSBpbnRlcnJ1cHQgaW4gMW1zIHRpbWUgYmFzaXMqLworICAgIGlmIChIQUxfU1lTVElDS19Db25maWcoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDBVIC91d1RpY2tGcmVxKSkgPT0gMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSAqLworICAgICAgaWYgKFRpY2tQcmlvcml0eSA8ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykpCisgICAgICB7CisgICAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFN5c1RpY2tfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CisgICAgICAgIHV3VGlja1ByaW8gPSBUaWNrUHJpb3JpdHk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICAgSEFMIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFByb3ZpZGUgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgUHJvdmlkZSBhIGJsb2NraW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgU3VzcGVuZCB0aGUgdGltZSBiYXNlIHNvdXJjZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBSZXN1bWUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgaW50ZXJydXB0CisgICAgICAoKykgR2V0IHRoZSBIQUwgQVBJIGRyaXZlciB2ZXJzaW9uCisgICAgICAoKykgR2V0IHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICAgICAgKCspIEdldCB0aGUgZGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluY3JlbWVudCAgYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIKKyAgKiAgICAgICAgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHRoaXMgdmFyaWFibGUgaXMgaW5jcmVtZW50ZWQgZWFjaCAxbXMKKyAgKiAgICAgICBpbiBTeXNUaWNrIElTUi4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdXNlciBmaWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0luY1RpY2sodm9pZCkKK3sKKyAgdXdUaWNrICs9IHV3VGlja0ZyZXE7Cit9CisKKy8qKgorICAqIEBicmllZiBQcm92aWRlcyBhIHRpY2sgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCB0aWNrIHZhbHVlCisgICovCitfX3dlYWsgdWludDMyX3QgSEFMX0dldFRpY2sodm9pZCkKK3sKKyAgcmV0dXJuIHV3VGljazsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHRpY2sgcHJpb3JpdHkuCisgICogQHJldHZhbCB0aWNrIHByaW9yaXR5CisgICovCit1aW50MzJfdCBIQUxfR2V0VGlja1ByaW8odm9pZCkKK3sKKyAgcmV0dXJuIHV3VGlja1ByaW87Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgbmV3IHRpY2sgRnJlcS4KKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NldFRpY2tGcmVxKHVpbnQzMl90IEZyZXEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyAgPSBIQUxfT0s7CisgIGFzc2VydF9wYXJhbShJU19USUNLRlJFUShGcmVxKSk7CisKKyAgaWYgKHV3VGlja0ZyZXEgIT0gRnJlcSkKKyAgeworICAgIC8qIEFwcGx5IHRoZSBuZXcgdGljayBGcmVxICAqLworICAgIHN0YXR1cyA9IEhBTF9Jbml0VGljayh1d1RpY2tQcmlvKTsKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICB1d1RpY2tGcmVxID0gRnJlcTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgcmV0dXJuIHRpY2sgZnJlcXVlbmN5LgorICAqIEByZXR2YWwgdGljayBwZXJpb2QgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRUaWNrRnJlcSh2b2lkKQoreworICByZXR1cm4gdXdUaWNrRnJlcTsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgbWluaW11bSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZAorICAqICAgICAgICBvbiB2YXJpYWJsZSBpbmNyZW1lbnRlZC4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuCisgICogICAgICAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMgd2hlcmUgdXdUaWNrCisgICogICAgICAgaXMgaW5jcmVtZW50ZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHBhcmFtIERlbGF5ICBzcGVjaWZpZXMgdGhlIGRlbGF5IHRpbWUgbGVuZ3RoLCBpbiBtaWxsaXNlY29uZHMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRGVsYXkodWludDMyX3QgRGVsYXkpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIHVpbnQzMl90IHdhaXQgPSBEZWxheTsKKworICAvKiBBZGQgYSBmcmVxIHRvIGd1YXJhbnRlZSBtaW5pbXVtIHdhaXQgKi8KKyAgaWYgKHdhaXQgPCBIQUxfTUFYX0RFTEFZKQorICB7CisgICAgd2FpdCArPSAodWludDMyX3QpKHV3VGlja0ZyZXEpOworICB9CisKKyAgd2hpbGUgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA8IHdhaXQpCisgIHsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAsIFN5c1RpY2sgdGltZXIgaXMgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UuIEl0IGlzCisgICogICAgICAgdXNlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGF0IHJlZ3VsYXIgdGltZSBpbnRlcnZhbHMuIE9uY2UgSEFMX1N1c3BlbmRUaWNrKCkKKyAgKiAgICAgICBpcyBjYWxsZWQsIHRoZSBTeXNUaWNrIGludGVycnVwdCB3aWxsIGJlIGRpc2FibGVkIGFuZCBzbyBUaWNrIGluY3JlbWVudAorICAqICAgICAgIGlzIHN1c3BlbmRlZC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIFN5c1RpY2sgSW50ZXJydXB0ICovCisgIENMRUFSX0JJVChTeXNUaWNrLT5DVFJMLFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWUgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlLiBJdCBpcworICAqICAgICAgIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyIHRpbWUgaW50ZXJ2YWxzLiBPbmNlIEhBTF9SZXN1bWVUaWNrKCkKKyAgKiAgICAgICBpcyBjYWxsZWQsIHRoZSBTeXNUaWNrIGludGVycnVwdCB3aWxsIGJlIGVuYWJsZWQgYW5kIHNvIFRpY2sgaW5jcmVtZW50CisgICogICAgICAgaXMgcmVzdW1lZC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCit7CisgIC8qIEVuYWJsZSBTeXNUaWNrIEludGVycnVwdCAqLworICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgSEFMIHJldmlzaW9uCisgICogQHJldHZhbCB2ZXJzaW9uIDogMHhYWVpSICg4Yml0cyBmb3IgZWFjaCBkZWNpbWFsLCBSIGZvciBSQykKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpCit7CisgIHJldHVybiBfX1NUTTMyRzB4eF9IQUxfVkVSU0lPTjsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllci4KKyAgKiBAcmV0dmFsIERldmljZSByZXZpc2lvbiBpZGVudGlmaWVyCisgICovCit1aW50MzJfdCBIQUxfR2V0UkVWSUQodm9pZCkKK3sKKyAgcmV0dXJuICgoREJHLT5JRENPREUgJiBEQkdfSURDT0RFX1JFVl9JRCkgPj4gMTZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBkZXZpY2UgaWRlbnRpZmllci4KKyAgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgICovCit1aW50MzJfdCBIQUxfR2V0REVWSUQodm9pZCkKK3sKKyAgcmV0dXJuICgoREJHLT5JRENPREUpICYgREJHX0lEQ09ERV9ERVZfSUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgZmlyc3Qgd29yZCBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgKiBAcmV0dmFsIERldmljZSBpZGVudGlmaWVyCisgICovCit1aW50MzJfdCBIQUxfR2V0VUlEdzAodm9pZCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgc2Vjb25kIHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcxKHZvaWQpCit7CisgIHJldHVybiAoUkVBRF9SRUcoKigodWludDMyX3QgKikoVUlEX0JBU0UgKyA0VSkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGlyZCB3b3JkIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRVSUR3Mih2b2lkKQoreworICByZXR1cm4gKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFICsgOFUpKSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICAgSEFMIERlYnVnIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgRGVidWcgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBEZWJ1ZyBtb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBTRVRfQklUKERCRy0+Q1IsIERCR19DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCRy0+Q1IsIERCR19DUl9EQkdfU1RPUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHLT5DUiwgREJHX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHLT5DUiwgREJHX0NSX0RCR19TVEFOREJZKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0CisgKiAgQGJyaWVmICAgIFNZU0NGRyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIQUwgU1lTQ0ZHIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgUGluIHJlbWFwCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXIKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlcgorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIGRlYWQgYmF0dGVyeSBiZWhhdmlvcigqKQorICAgICAgKCspIENvbmZpZ3VyZSBDbGFtcGluZyBEaW9kZSBvbiBzcGVjaWZpYyBwaW5zKCopCisgICAoKikgRmVhdHVyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIHZvbHRhZ2Ugc2NhbGUuCisgICogQHBhcmFtICBWb2x0YWdlU2NhbGluZyBzcGVjaWZpZXMgdGhlIG91dHB1dCB2b2x0YWdlIHRvIGFjaGlldmUKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX1ZSRUZCVUZfVm9sdGFnZVNjYWxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGluZ0NvbmZpZyh1aW50MzJfdCBWb2x0YWdlU2NhbGluZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUoVm9sdGFnZVNjYWxpbmcpKTsKKworICBNT0RJRllfUkVHKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfVlJTLCBWb2x0YWdlU2NhbGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciBoaWdoIGltcGVkYW5jZSBtb2RlLgorICAqIEBwYXJhbSAgTW9kZSBzcGVjaWZpZXMgdGhlIGhpZ2ggaW1wZWRhbmNlIG1vZGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfVlJFRkJVRl9IaWdoSW1wZWRhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9IaWdoSW1wZWRhbmNlQ29uZmlnKHVpbnQzMl90IE1vZGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRShNb2RlKSk7CisKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0hJWiwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHVuZSB0aGUgSW50ZXJuYWwgVm9sdGFnZSBSZWZlcmVuY2UgYnVmZmVyIChWUkVGQlVGKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX1RyaW1taW5nQ29uZmlnKHVpbnQzMl90IFRyaW1taW5nVmFsdWUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9UUklNTUlORyhUcmltbWluZ1ZhbHVlKSk7CisKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DQ1IsIFZSRUZCVUZfQ0NSX1RSSU0sIFRyaW1taW5nVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSW50ZXJuYWwgVm9sdGFnZSBSZWZlcmVuY2UgYnVmZmVyIChWUkVGQlVGKS4KKyAgKiBAcmV0dmFsIEhBTF9PSy9IQUxfVElNRU9VVAorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NZU0NGR19FbmFibGVWUkVGQlVGKHZvaWQpCit7CisgIHVpbnQzMl90ICB0aWNrc3RhcnQ7CisKKyAgU0VUX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0VOVlIpOworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IGZvciBWUlIgYml0ICAqLworICB3aGlsZSAoUkVBRF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9WUlIpID09IDB4MDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFZSRUZCVUZfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLgorICAqCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZCVUYodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfRU5WUik7Cit9CisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9CT09TVEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHJlbWFwIG9uIFBBMTFfUEExMgorICAqIEBwYXJhbSAgUGluUmVtYXAgc3BlY2lmaWVzIHdoaWNoIHBpbnMgaGF2ZSB0byBiZSByZW1hcHBlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfUkVNQVBfUEExMQorICAqICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19SRU1BUF9QQTEyCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRW5hYmxlUmVtYXAodWludDMyX3QgUGluUmVtYXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hBTF9SRU1BUF9QSU4oUGluUmVtYXApKTsKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBQaW5SZW1hcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgcmVtYXAgb24gUEExMV9QQTEyCisgICogQHBhcmFtICBQaW5SZW1hcCBzcGVjaWZpZXMgd2hpY2ggcGlucyB3aWxsIGJlaGF2ZSBub3JtYWxseQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfUkVNQVBfUEExMQorICAqICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19SRU1BUF9QQTEyCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVJlbWFwKHVpbnQzMl90IFBpblJlbWFwKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19IQUxfUkVNQVBfUElOKFBpblJlbWFwKSk7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IxLCBQaW5SZW1hcCk7Cit9CisKKyNpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQorLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xhbXBpbmcgRGlvZGUgb24gc3BlY2lmaWVkIElPCisgICogQHBhcmFtICBQaW5Db25maWcgc3BlY2lmaWVzIG9uIHdoaWNoIHBpbnMgY2xhbXBpbmcgRGlvZGUgaGFzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0NsYW1waW5nRGlvZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVDbGFtcGluZ0Rpb2RlKHVpbnQzMl90IFBpbkNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0NMQU1QSU5HRElPREUoUGluQ29uZmlnKSk7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMiwgUGluQ29uZmlnKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENsYW1waW5nIERpb2RlIG9uIHNwZWNpZmllZCBJTworICAqIEBwYXJhbSAgUGluQ29uZmlnIHNwZWNpZmllcyBvbiB3aGljaCBwaW5zIGNsYW1waW5nIERpb2RlIGhhcyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfQ2xhbXBpbmdEaW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVDbGFtcGluZ0Rpb2RlKHVpbnQzMl90IFBpbkNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0NMQU1QSU5HRElPREUoUGluQ29uZmlnKSk7CisgIENMRUFSX0JJVChTWVNDRkctPkNGR1IyLCBQaW5Db25maWcpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChTWVNDRkdfQ0ZHUjFfVUNQRDFfU1RST0JFKSB8fCBkZWZpbmVkIChTWVNDRkdfQ0ZHUjFfVUNQRDJfU1RST0JFKQorLyoqCisgICogQGJyaWVmICBTdHJvYmUgY29uZmlndXJhdGlvbiBvZiBHUElPIGRlcGVuZGluZyBvbiBVQ1BEeCBkZWFkIGJhdHRlcnkgc2V0dGluZ3MKKyAgKiBAcGFyYW0gIENvbmZpZ0RlYWRCYXR0ZXJ5IHNwZWNpZmllcyBvbiB3aGljaCBwaW5zIHRvIG1ha2UgZWZmZWN0aXZlIG9yIG5vdCBEZWFkIEJhdHRlcnkgc3cgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfVUNQRDFfU1RST0JFCisgICogICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX1VDUEQyX1NUUk9CRQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX1N0cm9iZURCYXR0cGluc0NvbmZpZyh1aW50MzJfdCBDb25maWdEZWFkQmF0dGVyeSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19EQkFUVF9DT05GSUcoQ29uZmlnRGVhZEJhdHRlcnkpKTsKKworICAvKiBDaGFuZ2Ugc3Ryb2JlIGNvbmZpZ3VyYXRpb24gb2YgR1BJTyBkZXBlbmRpbmcgb24gVUNQRHggZGVhZCBiYXR0ZXJ5IHNldHRpbmdzICovCisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMSwgKFNZU0NGR19DRkdSMV9VQ1BEMV9TVFJPQkUgfCBTWVNDRkdfQ0ZHUjFfVUNQRDJfU1RST0JFKSwgQ29uZmlnRGVhZEJhdHRlcnkpOworfQorI2VuZGlmIC8qIFNZU0NGR19DRkdSMV9VQ1BEMV9TVFJPQkUgfHwgU1lTQ0ZHX0NGR1IxX1VDUEQyX1NUUk9CRSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2FkYy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NThmNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2FkYy5jCkBAIC0wLDAgKzEsMjk3MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfYWRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0b3IgKEFEQykKKyAgKiAgICAgICAgICBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBvZiBBREMKKyAgKiAgICAgICAgICAgKyBPcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgU3RhcnQsIHN0b3AsIGdldCByZXN1bHQgb2YgY29udmVyc2lvbnMgb2YgcmVndWxhcgorICAqICAgICAgICAgICAgICAgIGdyb3VwLCB1c2luZyAzIHBvc3NpYmxlIG1vZGVzOiBwb2xsaW5nLCBpbnRlcnJ1cHRpb24gb3IgRE1BLgorICAqICAgICAgICAgICArIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgQ2hhbm5lbHMgY29uZmlndXJhdGlvbiBvbiByZWd1bGFyIGdyb3VwCisgICogICAgICAgICAgICAgKysgQW5hbG9nIFdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBBREMgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgICAgKysgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZXh0ZW5kZWQgZnVuY3Rpb25zKSBhcmUgYXZhaWxhYmxlIGluIGZpbGUgCisgICogICAgICAgICAgInN0bTMyZzB4eF9oYWxfYWRjX2V4LmMiLgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEFEQyBwZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICgrKSAxMi1iaXQsIDEwLWJpdCwgOC1iaXQgb3IgNi1iaXQgY29uZmlndXJhYmxlIHJlc29sdXRpb24uCisKKyAgKCspIEludGVycnVwdCBnZW5lcmF0aW9uIGF0IHRoZSBlbmQgb2YgcmVndWxhciBjb252ZXJzaW9uIGFuZCBpbiBjYXNlIG9mIAorICAgICAgYW5hbG9nIHdhdGNoZG9nIG9yIG92ZXJydW4gZXZlbnRzLgorICAKKyAgKCspIFNpbmdsZSBhbmQgY29udGludW91cyBjb252ZXJzaW9uIG1vZGVzLgorICAKKyAgKCspIFNjYW4gbW9kZSBmb3IgY29udmVyc2lvbiBvZiBzZXZlcmFsIGNoYW5uZWxzIHNlcXVlbnRpYWxseS4KKyAgCisgICgrKSBEYXRhIGFsaWdubWVudCB3aXRoIGluLWJ1aWx0IGRhdGEgY29oZXJlbmN5LgorICAKKyAgKCspIFByb2dyYW1tYWJsZSBzYW1wbGluZyB0aW1lIChjb21tb24gdG8gZ3JvdXAgb2YgY2hhbm5lbHMpCisgIAorICAoKykgRXh0ZXJuYWwgdHJpZ2dlciAodGltZXIgb3IgRVhUSSkgd2l0aCBjb25maWd1cmFibGUgcG9sYXJpdHkKKyAgCisgICgrKSBETUEgcmVxdWVzdCBnZW5lcmF0aW9uIGZvciB0cmFuc2ZlciBvZiBjb252ZXJzaW9ucyBkYXRhIG9mIHJlZ3VsYXIgZ3JvdXAuCisgIAorICAoKykgQURDIGNhbGlicmF0aW9uCisgIAorICAoKykgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgCisgICgrKSBBREMgc3VwcGx5IHJlcXVpcmVtZW50czogMS42MiBWIHRvIDMuNiBWLgorICAKKyAgKCspIEFEQyBpbnB1dCByYW5nZTogZnJvbSBWcmVmLSAoY29ubmVjdGVkIHRvIFZzc2EpIHRvIFZyZWYrIChjb25uZWN0ZWQgdG8gCisgICAgICBWZGRhIG9yIHRvIGFuIGV4dGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlKS4KKworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKworICAgICAqKiogQ29uZmlndXJhdGlvbiBvZiB0b3AgbGV2ZWwgcGFyYW1ldGVycyByZWxhdGVkIHRvIEFEQyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKworICAgICgjKSBFbmFibGUgdGhlIEFEQyBpbnRlcmZhY2UKKyAgICAgICAgKCsrKSBBcyBwcmVyZXF1aXNpdGUsIEFEQyBjbG9jayBtdXN0IGJlIGNvbmZpZ3VyZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgICAgICBDYXV0aW9uOiBPbiBTVE0zMkcwLCBBREMgY2xvY2sgZnJlcXVlbmN5IG1heCBpcyAzNU1IeiAocmVmZXIKKyAgICAgICAgICAgICAgICAgICAgICB0byBkZXZpY2UgZGF0YXNoZWV0KS4KKyAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIEFEQyBjbG9jayBzb3VyY2UgZnJvbSBSQ0MgYW5kIEFEQyBjbG9jayAKKyAgICAgICAgICAgICAgICAgICAgICBwcmVzY2FsZXIgbXVzdCBiZSBjb25maWd1cmVkIHRvIHJlbWFpbiBiZWxvdworICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWF4aW11bSBmcmVxdWVuY3kuCisKKyAgICAgICAgKCsrKSBUd28gY2xvY2sgc2V0dGluZ3MgYXJlIG1hbmRhdG9yeTogCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb3JlIGNsb2NrLCBhbHNvIHBvc3NpYmx5IGNvbnZlcnNpb24gY2xvY2spLgorCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb252ZXJzaW9ucyBjbG9jaykuCisgICAgICAgICAgICAgICAgICAgRm91ciBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBzeW5jaHJvbm91cyBjbG9jayBmcm9tIEFQQiBjbG9jayAoc2FtZSBhcyBBREMgY29yZSBjbG9jaykKKyAgICAgICAgICAgICAgICAgICBvciBhc3luY2hyb25vdXMgY2xvY2sgZnJvbSBSQ0MgbGV2ZWw6IFNZU0NMSywgSFNJMTYsIFBMTFBDTEsuCisKKyAgICAgICAgICAgICAoKysrKSBFeGFtcGxlOgorICAgICAgICAgICAgICAgICAgIEludG8gSEFMX0FEQ19Nc3BJbml0KCkgKHJlY29tbWVuZGVkIGNvZGUgbG9jYXRpb24pIG9yIHdpdGgKKyAgICAgICAgICAgICAgICAgICBvdGhlciBkZXZpY2UgY2xvY2sgcGFyYW1ldGVycyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAgKCsrKykgX19IQUxfUkNDX0FEQ19DTEtfRU5BQkxFKCk7ICAgICAgICAgICAgICAgICAgKG1hbmRhdG9yeTogY29yZSBjbG9jaykKKworICAgICAgICAoKyspIEFEQyBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIHByZXNjYWxlciBhcmUgY29uZmlndXJlZCBhdCBBREMgbGV2ZWwgd2l0aAorICAgICAgICAgICAgIHBhcmFtZXRlciAiQ2xvY2tQcmVzY2FsZXIiIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpLgorCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIEFEQyBHUElPcworICAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpCisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGVzZSBBREMgcGlucyBpbiBhbmFsb2cgbW9kZQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfR1BJT19Jbml0KCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgTlZJQyBmb3IgQURDCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShBREN4X0lSUW4pCisgICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpIAorICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcnJ1cHRpb24gdmVjdG9yIAorICAgICAgICAgICAgICBBREN4X0lSUUhhbmRsZXIoKS4KKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIERNQToKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBETUEgKERNQSBjaGFubmVsLCBtb2RlIG5vcm1hbCBvciBjaXJjdWxhciwgLi4uKQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBOVklDIGZvciBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikKKyAgICAgICAgICgrKykgSW5zZXJ0IHRoZSBBREMgaW50ZXJydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gSEFMX0FEQ19JUlFIYW5kbGVyKCkgCisgICAgICAgICAgICAgIGludG8gdGhlIGZ1bmN0aW9uIG9mIGNvcnJlc3BvbmRpbmcgRE1BIGludGVycnVwdGlvbiB2ZWN0b3IgCisgICAgICAgICAgICAgIERNQXhfQ2hhbm5lbHhfSVJRSGFuZGxlcigpLgorCisgICAgICoqKiBDb25maWd1cmF0aW9uIG9mIEFEQywgZ3JvdXAgcmVndWxhciwgY2hhbm5lbHMgcGFyYW1ldGVycyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBBREMgcGFyYW1ldGVycyAocmVzb2x1dGlvbiwgZGF0YSBhbGlnbm1lbnQsIC4uLikKKyAgICAgICAgYW5kIHJlZ3VsYXIgZ3JvdXAgcGFyYW1ldGVycyAoY29udmVyc2lvbiB0cmlnZ2VyLCBzZXF1ZW5jZXIsIC4uLikKKyAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBjaGFubmVscyBmb3IgcmVndWxhciBncm91cCBwYXJhbWV0ZXJzIChjaGFubmVsIG51bWJlciwgCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIHJlZ3VsYXIgZ3JvdXApCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLgorCisgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nIHBhcmFtZXRlcnMgKGNoYW5uZWxzCisgICAgICAgIG1vbml0b3JlZCwgdGhyZXNob2xkcywgLi4uKQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpLgorCisgICAgICoqKiBFeGVjdXRpb24gb2YgQURDIGNvbnZlcnNpb25zICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorCisgICAgKCMpIE9wdGlvbmFsbHksIHBlcmZvcm0gYW4gYXV0b21hdGljIEFEQyBjYWxpYnJhdGlvbiB0byBpbXByb3ZlIHRoZQorICAgICAgICBjb252ZXJzaW9uIGFjY3VyYWN5CisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpLgorCisgICAgKCMpIEFEQyBkcml2ZXIgY2FuIGJlIHVzZWQgYW1vbmcgdGhyZWUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbiwKKyAgICAgICAgdHJhbnNmZXIgYnkgRE1BLgorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgcG9sbGluZzoKKyAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydCgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKCkKKyAgICAgICAgICAoKysrKSBSZXRyaWV2ZSBjb252ZXJzaW9uIHJlc3VsdHMgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3AoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgaW50ZXJydXB0aW9uOiAKKyAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydF9JVCgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBieSBjYWxsIG9mIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhpcyBmdW5jdGlvbiBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbSkKKyAgICAgICAgICAoKysrKSBSZXRyaWV2ZSBjb252ZXJzaW9uIHJlc3VsdHMgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfSVQoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gd2l0aCB0cmFuc2ZlciBieSBETUE6CisgICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnRfRE1BKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSBvciBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICgrKyspIENvbnZlcnNpb24gcmVzdWx0cyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2ZlcnJlZCBieSBETUEgaW50bworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGFkZHJlc3MuCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfRE1BKCkKKworICAgICBbLi5dCisKKyAgICAoQCkgQ2FsbGJhY2sgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtOgorICAgICAgKCtAKSBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCtAKSBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjaygpIChjYWxsYmFjayBvZiBhbmFsb2cgd2F0Y2hkb2cpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2sKKworICAgICAqKiogRGVpbml0aWFsaXphdGlvbiBvZiBBREMgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgRGlzYWJsZSB0aGUgQURDIGludGVyZmFjZQorICAgICAgKCsrKSBBREMgY2xvY2sgY2FuIGJlIGhhcmQgcmVzZXQgYW5kIGRpc2FibGVkIGF0IFJDQyB0b3AgbGV2ZWwuCisgICAgICAgICgrKykgSGFyZCByZXNldCBvZiBBREMgcGVyaXBoZXJhbHMKKyAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0FEQ3hfRk9SQ0VfUkVTRVQoKSwgX19BREN4X1JFTEVBU0VfUkVTRVQoKS4KKyAgICAgICAgKCsrKSBBREMgY2xvY2sgZGlzYWJsZQorICAgICAgICAgICAgIHVzaW5nIHRoZSBlcXVpdmFsZW50IG1hY3JvL2Z1bmN0aW9ucyBhcyBjb25maWd1cmF0aW9uIHN0ZXAuCisgICAgICAgICAgICAgKCsrKykgRXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwRGVJbml0KCkgKHJlY29tbWVuZGVkIGNvZGUgbG9jYXRpb24pIG9yIHdpdGgKKyAgICAgICAgICAgICAgICAgICBvdGhlciBkZXZpY2UgY2xvY2sgcGFyYW1ldGVycyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAgKCsrKykgUkNDX09zY0luaXRTdHJ1Y3R1cmUuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJMTQ7CisgICAgICAgICAgICAgICAoKysrKSBSQ0NfT3NjSW5pdFN0cnVjdHVyZS5IU0kxNFN0YXRlID0gUkNDX0hTSTE0X09GRjsgKGlmIG5vdCB1c2VkIGZvciBzeXN0ZW0gY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3R1cmUpOworCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MKKyAgICAgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfUkNDX0dQSU94X0NMS19ESVNBQkxFKCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIERpc2FibGUgdGhlIE5WSUMgZm9yIEFEQworICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoQURDeF9JUlFuKQorCisgICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgRE1BOgorICAgICAgICAgKCsrKSBEZWluaXRpYWxpemUgdGhlIERNQQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgTlZJQyBmb3IgRE1BCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShETUF4X0NoYW5uZWx4X0lSUW4pCisKKyAgICBbLi5dCisgICAgCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTLCB3aGVuIHNldCB0byAxLAorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sKKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgIDogQURDIGVycm9yIGNhbGxiYWNrCisgICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sKKyAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaworICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgOiBBREMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogQURDIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIEByZWYgSEFMX0FEQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sKKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgIDogQURDIGVycm9yIGNhbGxiYWNrCisgICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sKKyAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaworICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgOiBBREMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogQURDIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgWy4uXQorCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBAcmVmIEhBTF9BRENfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlcyBAcmVmIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9BRENfRXJyb3JDYWxsYmFjaygpLgorICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpLyBAcmVmIEhBTF9BRENfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgWy4uXQorCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0FEQ19Jbml0KCkvIEByZWYgSEFMX0FEQ19EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICAgWy4uXQorCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfQURDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICBpbiBAcmVmIEhBTF9BRENfU1RBVEVfUkVBRFkgb3IgQHJlZiBIQUxfQURDX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgIFsuLl0KKworICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQURDX0RlSW5pdCgpCisgICAgIG9yIEByZWYgSEFMX0FEQ19Jbml0KCkgZnVuY3Rpb24uCisgICAgIFsuLl0KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKyAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDIEFEQworICAqIEBicmllZiBBREMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9Db25zdGFudHMgQURDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRml4ZWQgdGltZW91dCB2YWx1ZXMgZm9yIEFEQyBjYWxpYnJhdGlvbiwgZW5hYmxlIHNldHRsaW5nIHRpbWUsIGRpc2FibGUgICovCisvKiBzZXR0bGluZyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBsb3cgY2xvY2sgZnJlcXVlbmN5LCAgICAgICAqLworLyogbWF4aW11bSBwcmVzY2FsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBFeCBvZiBwcm9maWxlIGxvdyBmcmVxdWVuY3kgOiBDbG9jayBzb3VyY2UgYXQgMC4xIE1IeiwgQURDIGNsb2NrICAgICAgICAgKi8KKy8qIHByZXNjYWxlciA0LCBzYW1wbGluZyB0aW1lIDcuNSBBREMgY2xvY2sgY3ljbGVzLCByZXNvbHV0aW9uIDEyIGJpdHMuICAgICAqLworLyogVW5pdDogbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19FTkFCTEVfVElNRU9VVCAgICAgICAgICAgICAgKDJVTCkKKyNkZWZpbmUgQURDX0RJU0FCTEVfVElNRU9VVCAgICAgICAgICAgICAoMlVMKQorI2RlZmluZSBBRENfU1RPUF9DT05WRVJTSU9OX1RJTUVPVVQgICAgICgyVUwpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0NPTkZfUkRZX1RJTUVPVVQgICAgKDFVTCkKKworLyogUmVnaXN0ZXIgQ0hTRUxSIGJpdHMgY29ycmVzcG9uZGluZyB0byByYW5rcyAyIHRvIDggLiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSFNFTFJfU1EyX1RPX1NROCAgICAgICAgICAgKEFEQ19DSFNFTFJfU1EyIHwgQURDX0NIU0VMUl9TUTMgfCBBRENfQ0hTRUxSX1NRNCB8IEFEQ19DSFNFTFJfU1E1IHwgQURDX0NIU0VMUl9TUTYgfCBBRENfQ0hTRUxSX1NRNyB8IEFEQ19DSFNFTFJfU1E4KQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0Z1bmN0aW9ucyBBREMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEFEQ19ETUFIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnMgQURDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBBREMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbSAgICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIEFEQy4gCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgQURDLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBBREMgcGVyaXBoZXJhbCBhbmQgcmVndWxhciBncm91cCBhY2NvcmRpbmcgdG8gIAorICAqICAgICAgICAgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gc3RydWN0dXJlICJBRENfSW5pdFR5cGVEZWYiLgorICAqIEBub3RlICAgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiBSQ0MgY29uZmlndXJhdGlvbiBmb3IgQURDCisgICogICAgICAgICBpbiBoZWFkZXIgb2YgdGhpcyBmaWxlKS4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBBREMgTVNQIChIQUxfQURDX01zcEluaXQoKSkgb25seSB3aGVuCisgICogICAgICAgICBjb21pbmcgZnJvbSBBREMgc3RhdGUgcmVzZXQuIEZvbGxvd2luZyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2YgQURDX0luaXRUeXBlRGVmICAKKyAgKiAgICAgICAgIHN0cnVjdHVyZSBvbiB0aGUgZmx5LCB3aXRob3V0IG1vZGlmeWluZyBNU1AgY29uZmlndXJhdGlvbi4gSWYgQURDICAKKyAgKiAgICAgICAgIE1TUCBoYXMgdG8gYmUgbW9kaWZpZWQgYWdhaW4sIEhBTF9BRENfRGVJbml0KCkgbXVzdCBiZSBjYWxsZWQKKyAgKiAgICAgICAgIGJlZm9yZSBIQUxfQURDX0luaXQoKS4KKyAgKiAgICAgICAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgRm9yIHBhcmFtZXRlcnMgY29uc3RyYWludHMsIHNlZSBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgCisgICogICAgICAgICAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQURDIHdpdGhpbiAyIHNjb3Blczogc2NvcGUgb2YgZW50aXJlIAorICAqICAgICAgICAgQURDIGFuZCBzY29wZSBvZiByZWd1bGFyIGdyb3VwLiBGb3IgcGFyYW1ldGVycyBkZXRhaWxzLCBzZWUgY29tbWVudHMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdG1wQ0ZHUjEgPSAwVUw7CisgIHVpbnQzMl90IHRtcENGR1IyID0gMFVMOworICB1aW50MzJfdCB0bXBfYWRjX3JlZ19pc19jb252ZXJzaW9uX29uX2dvaW5nOworICBfX0lPIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9IDBVTDsKKyAgCisgIC8qIENoZWNrIEFEQyBoYW5kbGUgKi8KKyAgaWYoaGFkYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DTE9DS1BSRVNDQUxFUihoYWRjLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfUkVTT0xVVElPTihoYWRjLT5Jbml0LlJlc29sdXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19EQVRBX0FMSUdOKGhhZGMtPkluaXQuRGF0YUFsaWduKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0NBTl9NT0RFKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVhUVFJJR19FREdFKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRUUklHKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0LkRNQUNvbnRpbnVvdXNSZXF1ZXN0cykpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VPQ19TRUxFQ1RJT04oaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PVkVSUlVOKGhhZGMtPkluaXQuT3ZlcnJ1bikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKGhhZGMtPkluaXQuU2FtcGxpbmdUaW1lQ29tbW9uMSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NBTVBMRV9USU1FKGhhZGMtPkluaXQuU2FtcGxpbmdUaW1lQ29tbW9uMikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUpKTsKKyAgCisgIGFzc2VydF9wYXJhbShJU19BRENfVFJJR0dFUl9GUkVRKGhhZGMtPkluaXQuVHJpZ2dlckZyZXF1ZW5jeU1vZGUpKTsKKworICBpZihoYWRjLT5Jbml0LlNjYW5Db252TW9kZSAhPSBBRENfU0NBTl9ESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUpKTsKKyAgICAKKyAgICBpZihoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX05CX0NPTlYoaGFkYy0+SW5pdC5OYnJPZkNvbnZlcnNpb24pKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIEFEQyBncm91cCByZWd1bGFyIGRpc2NvbnRpbnVvdXMgbW9kZSBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmICAgICAgICAgICAgICAqLworICAvKiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYgKGhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkpKTsKKyAgCisgIC8qIEFjdGlvbnMgcGVyZm9ybWVkIG9ubHkgaWYgQURDIGlzIGNvbWluZyBmcm9tIHN0YXRlIHJlc2V0OiAgICAgICAgICAgICAgICAqLworICAvKiAtIEluaXRpYWxpemF0aW9uIG9mIEFEQyBNU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoaGFkYy0+U3RhdGUgPT0gSEFMX0FEQ19TVEFURV9SRVNFVCkKKyAgeworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBJbml0IHRoZSBBREMgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgICBoYWRjLT5Db252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICA9IEhBTF9BRENfQ29udkNwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayAgICAgID0gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICA9IEhBTF9BRENfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayAgICAgPSBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2sgICAgID0gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgICAgICAgICA9IEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgCisgICAgaWYgKGhhZGMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisgICAgCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQURDX01zcEluaXQoaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgTG9jayAqLworICAgIGhhZGMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgIH0KKyAgCisgIGlmKExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogRW5hYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciAqLworICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcihoYWRjLT5JbnN0YW5jZSk7CisgICAgCisgICAgLyogRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAvKiBXYWl0IGxvb3AgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiAqLworICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgLyogICAgICAgZXhjZWVkIDMyIGJpdHMgcmVnaXN0ZXIgY2FwYWNpdHkgYW5kIGhhbmRsZSBsb3cgZnJlcXVlbmN5LiAqLworICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX0lOVEVSTkFMX1JFR1VMX1NUQUJfVVMgLyAxMFVMKSAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAoMTAwMDAwVUwgKiAyVUwpKSk7CisgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVTCkKKyAgICB7CisgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFZlcmlmaWNhdGlvbiB0aGF0IEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBpcyBjb3JyZWN0bHkgZW5hYmxlZCwgd2hldGhlciAgICAqLworICAvKiBvciBub3QgQURDIGlzIGNvbWluZyBmcm9tIHN0YXRlIHJlc2V0IChpZiBhbnkgcG90ZW50aWFsIHByb2JsZW0gb2YgICAgICAgKi8KKyAgLyogY2xvY2tpbmcsIHZvbHRhZ2UgcmVndWxhdG9yIHdvdWxkIG5vdCBiZSBlbmFibGVkKS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgIAorICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBwYXJhbWV0ZXJzIGlmIHByZXZpb3VzIHByZWxpbWluYXJ5IGFjdGlvbnMgYXJlICAgICAgKi8gCisgIC8qIGNvcnJlY3RseSBjb21wbGV0ZWQgYW5kIGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciAgICAqLworICAvKiBncm91cCAoQURDIG1heSBhbHJlYWR5IGJlIGVuYWJsZWQgYXQgdGhpcyBwb2ludCBpZiBIQUxfQURDX0luaXQoKSBpcyAgICAgKi8KKyAgLyogY2FsbGVkIHRvIHVwZGF0ZSBhIHBhcmFtZXRlciBvbiB0aGUgZmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHRtcF9hZGNfcmVnX2lzX2NvbnZlcnNpb25fb25fZ29pbmcgPSBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICAKKyAgaWYoICAgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpID09IDBVTCkKKyAgICAgJiYgKHRtcF9hZGNfcmVnX2lzX2NvbnZlcnNpb25fb25fZ29pbmcgPT0gMFVMKQorICAgICkKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgb25seSB3aGVuIEFEQyBpcyBkaXNhYmxlZDogICAgICAgICAgICAgICovCisgICAgLyogIC0gSW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgKG5vIHBhcmFtZXRlciBpbiBIQUwgQURDIGluaXQgc3RydWN0dXJlKSAqLworICAgIC8qICAtIENsb2NrIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogSWYgbG93IHBvd2VyIG1vZGUgQXV0b1Bvd2VyT2ZmIGlzIGVuYWJsZWQsIEFEQyBlbmFibGUgICAgICAgICAgICAqLworICAgIC8qICAgICAgIGFuZCBkaXNhYmxlIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUgICAgICAgKi8KKyAgICAvKiAgICAgICAoaW4gdGhpcyBjYXNlLCBmbGFnIEFEQ19GTEFHX1JEWSBpcyBub3Qgc2V0KS4gICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgICB7CisgICAgICAvKiBTb21lIHBhcmFtZXRlcnMgb2YgdGhpcyByZWdpc3RlciBhcmUgbm90IHJlc2V0LCBzaW5jZSB0aGV5IGFyZSBzZXQgICAqLworICAgICAgLyogYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtdXN0IGJlIGtlcHQgaW4gY2FzZSBvZiB1c2FnZSBvZiB0aGlzICAgICAgICAgKi8KKyAgICAgIC8qIGZ1bmN0aW9uIG9uIHRoZSBmbHkgKHVwZGF0ZSBvZiBhIHBhcmFtZXRlciBvZiBBRENfSW5pdFR5cGVEZWYgICAgICAgICovCisgICAgICAvKiB3aXRob3V0IG5lZWRpbmcgdG8gcmVjb25maWd1cmUgYWxsIG90aGVyIEFEQyBncm91cHMvY2hhbm5lbHMgICAgICAgICAqLworICAgICAgLyogcGFyYW1ldGVycyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgLSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoczogVmJhdCwgdGVtcGVyYXR1cmUgc2Vuc29yLCBWcmVmICAgICAgICovCisgICAgICAvKiAgICAgKHNldCBpbnRvIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgCisgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9SRVMgICAgICAgICwKKyAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5SZXNvbHV0aW9uICk7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGNsb2NrIG1vZGU6IGNsb2NrIHNvdXJjZSBBSEIgb3IgSFNJIHdpdGggICAgICAgICovCisgICAgICAvKiBzZWxlY3RhYmxlIHByZXNjYWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1IyX0NLTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIgJiBBRENfQ0ZHUjJfQ0tNT0RFICk7CisgICAgICAKKyAgICAgIGlmICgoKGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpICE9IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMSkgJiYKKyAgICAgICAgICAoKGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpICE9IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMikgJiYKKyAgICAgICAgICAoKGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpICE9IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWNCkpCisgICAgICB7CisgICAgICAgIE1PRElGWV9SRUcoQURDMV9DT01NT04tPkNDUiAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgQURDX0NDUl9QUkVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5DbG9ja1ByZXNjYWxlciAmIEFEQ19DQ1JfUFJFU0MgKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBMb3dQb3dlckF1dG9XYWl0IG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gTG93UG93ZXJBdXRvUG93ZXJPZmYgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBvdmVycnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBkYXRhIGFsaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIHNjYW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBETUEgY29udGludW91cyByZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wQ0ZHUjEgfD0gKEFEQ19DRkdSMV9BVVRPV0FJVCgodWludDMyX3QpaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0KSAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT09GRigodWludDMyX3QpaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZikgICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0NPTlRJTlVPVVMoKHVpbnQzMl90KWhhZGMtPkluaXQuQ29udGludW91c0NvbnZNb2RlKSAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9PVkVSUlVOKGhhZGMtPkluaXQuT3ZlcnJ1bikgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkRhdGFBbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgQURDX1NDQU5fU0VRX01PREUoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ETUFDT05UUkVRKCh1aW50MzJfdCloYWRjLT5Jbml0LkRNQUNvbnRpbnVvdXNSZXF1ZXN0cykgICk7CisgICAgCisgICAgLyogVXBkYXRlIHNldHRpbmcgb2YgZGlzY29udGludW91cyBtb2RlIG9ubHkgaWYgY29udGludW91cyBtb2RlIGlzIGRpc2FibGVkICovCisgICAgaWYgKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkKKyAgICB7CisgICAgICBpZiAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAgcmVndWxhciBkaXNjb250aW51b3VzIG1vZGUgKi8KKyAgICAgICAgdG1wQ0ZHUjEgfD0gQURDX0NGR1IxX0RJU0NFTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQURDIHJlZ3VsYXIgZ3JvdXAgZGlzY29udGludW91cyB3YXMgaW50ZW5kZWQgdG8gYmUgZW5hYmxlZCwgICAgICAgICovCisgICAgICAgIC8qIGJ1dCBBREMgcmVndWxhciBncm91cCBtb2RlcyBjb250aW51b3VzIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyAqLworICAgICAgICAvKiBjYW5ub3QgYmUgZW5hYmxlZCBzaW11bHRhbmVvdXNseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgIAorICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpZiB0cmlnZ2VyIHNlbGVjdGlvbiBpcyBkaWZmZXJlbnQgb2Ygc29mdHdhcmUgICovCisgICAgLyogc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IFRoaXMgY29uZmlndXJhdGlvbiBrZWVwcyB0aGUgaGFyZHdhcmUgZmVhdHVyZSBvZiBwYXJhbWV0ZXIgICAgICAgKi8KKyAgICAvKiAgICAgICBFeHRlcm5hbFRyaWdDb252RWRnZSAidHJpZ2dlciBlZGdlIG5vbmUiIGVxdWl2YWxlbnQgdG8gICAgICAgICAgICovCisgICAgLyogICAgICAgc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnYgIT0gQURDX1NPRlRXQVJFX1NUQVJUKQorICAgIHsKKyAgICAgIHRtcENGR1IxIHw9ICggKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udiAmIEFEQ19DRkdSMV9FWFRTRUwpIHwKKyAgICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udkVkZ2UgKTsKKyAgICB9CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIG92ZXJzYW1wbGluZyBlbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBvdmVyc2FtcGxpbmcgcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gb3ZlcnNhbXBsaW5nIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgKHRyaWdnZXJlZCBtb2RlKSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSB0cmlnZ2VyIGZyZXF1ZW5jeSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wQ0ZHUjIgfD0gKCBoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SYXRpbyAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlJpZ2h0Qml0U2hpZnQgfAorICAgICAgICAgICAgICAgICAgaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmcuVHJpZ2dlcmVkTW9kZSB8CisgICAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LlRyaWdnZXJGcmVxdWVuY3lNb2RlCisgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIFNFVF9CSVQodG1wQ0ZHUjIsIEFEQ19DRkdSMl9PVlNFKTsKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIEFEQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdpdGggcHJldmlvdXMgc2V0dGluZ3MgKi8KKyAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSMSwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ESVNDRU4gIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BVVRPRkYgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9XQUlUICAgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9DT05UICAgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9PVlJNT0QgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRTRUwgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRFTiAgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9BTElHTiAgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9TQ0FORElSIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMV9ETUFDRkcgICAgICwKKyAgICAgICAgICAgICAgIHRtcENGR1IxICAgICAgICAgICAgICApOworICAgIAorICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNGR1IyLAorICAgICAgICAgICAgICAgQURDX0NGR1IyX0xGVFJJRyB8CisgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTRSAgIHwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSICAgfAorICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1MgICB8CisgICAgICAgICAgICAgICBBRENfQ0ZHUjJfVE9WUyAgICAgICAsCisgICAgICAgICAgICAgICB0bXBDRkdSMiAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBDaGFubmVsIHNhbXBsaW5nIHRpbWUgY29uZmlndXJhdGlvbiAqLworICAgIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX1NBTVBMSU5HVElNRV9DT01NT05fMSwgaGFkYy0+SW5pdC5TYW1wbGluZ1RpbWVDb21tb24xKTsKKyAgICBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19TQU1QTElOR1RJTUVfQ09NTU9OXzIsIGhhZGMtPkluaXQuU2FtcGxpbmdUaW1lQ29tbW9uMik7CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gKi8KKyAgICAvKiAgIDB4MDA6IDEgY2hhbm5lbCBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gcmVndWxhciByYW5rIDEpICAgICAgICAgICAgICAgICovCisgICAgLyogICBQYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgTm90ZTogU2NhbiBtb2RlIGlzIG5vdCBwcmVzZW50IGJ5IGhhcmR3YXJlIG9uIHRoaXMgZGV2aWNlLCBidXQgICAgICAgKi8KKyAgICAvKiAgIGVtdWxhdGVkIGJ5IHNvZnR3YXJlIGZvciBhbGlnbm1lbnQgb3ZlciBhbGwgU1RNMzIgZGV2aWNlcy4gICAgICAgICAgICovCisgICAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCwgcmVndWxhciBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvICAqLworICAgIC8qICAgcGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIENoYW5uZWxzIG11c3QgYmUgY29uZmlndXJlZCBpbnRvIGVhY2ggcmFuayB1c2luZyBmdW5jdGlvbiAgICAgICAgICAgICovCisgICAgLyogICAiSEFMX0FEQ19Db25maWdDaGFubmVsKCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlID09IEFEQ19TQ0FOX0RJU0FCTEUpCisgICAgeworICAgICAgLyogU2V0IHNlcXVlbmNlciBzY2FuIGxlbmd0aCBieSBjbGVhcmluZyByYW5rcyBhYm92ZSByYW5rIDEgICAgICAgICAgICAgKi8KKyAgICAgIC8qIGFuZCBkbyBub3QgbW9kaWZ5IHJhbmsgMSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DSFNFTFIsCisgICAgICAgICAgICAgIEFEQ19DSFNFTFJfU1EyX1RPX1NROCk7CisgICAgfQorICAgIGVsc2UgaWYoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgPT0gQURDX1NDQU5fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIENvdW50IG51bWJlciBvZiByYW5rcyBhdmFpbGFibGUgaW4gSEFMIEFEQyBoYW5kbGUgdmFyaWFibGUgKi8KKyAgICAgIHVpbnQzMl90IEFEQ0dyb3VwUmVndWxhclNlcXVlbmNlclJhbmtzQ291bnQ7CisgICAgICAKKyAgICAgIC8qIFBhcnNlIGFsbCByYW5rcyBmcm9tIDEgdG8gOCAqLworICAgICAgZm9yKEFEQ0dyb3VwUmVndWxhclNlcXVlbmNlclJhbmtzQ291bnQgPSAwVUw7IEFEQ0dyb3VwUmVndWxhclNlcXVlbmNlclJhbmtzQ291bnQgPCAoOFVMKTsgQURDR3JvdXBSZWd1bGFyU2VxdWVuY2VyUmFua3NDb3VudCsrKQorICAgICAgeworICAgICAgICAvKiBDaGVjayBlYWNoIHNlcXVlbmNlciByYW5rIHVudGlsIHZhbHVlIG9mIGVuZCBvZiBzZXF1ZW5jZSAqLworICAgICAgICBpZigoKGhhZGMtPkFEQ0dyb3VwUmVndWxhclNlcXVlbmNlclJhbmtzID4+IChBRENHcm91cFJlZ3VsYXJTZXF1ZW5jZXJSYW5rc0NvdW50ICogNFVMKSkgJiBBRENfQ0hTRUxSX1NRMSkgPT0gQURDX0NIU0VMUl9TUTEpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICBpZihBRENHcm91cFJlZ3VsYXJTZXF1ZW5jZXJSYW5rc0NvdW50ID09IDFVTCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIFNldCBzZXF1ZW5jZXIgc2NhbiBsZW5ndGggYnkgY2xlYXJpbmcgcmFua3MgYWJvdmUgcmFuayAxICAgICAgICAgICAqLworICAgICAgICAvKiBhbmQgZG8gbm90IG1vZGlmeSByYW5rIDEgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0hTRUxSLAorICAgICAgICAgICAgICAgIEFEQ19DSFNFTFJfU1EyX1RPX1NROCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHRvIHZhbHVlIG1lbW9yaXplZCAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgaW4gSEFMIEFEQyBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgIE5vdGU6IFRoaXMgdmFsdWUgbWF5YmUgYmUgaW5pdGlhbGl6ZWQgYXQgYSB1bmtub3duIHZhbHVlLCAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICB0aGVyZWZvcmUgYWZlciB0aGUgZmlyc3QgY2FsbCBvZiAiSEFMX0FEQ19Jbml0KCkiLCAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgZWFjaCByYW5rIGNvcnJlc3BvbmRpbmcgdG8gcGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iICAgICovCisgICAgICAgIC8qICAgICAgICAgIG11c3QgYmUgc2V0IHVzaW5nICJIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSIuICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgLSBTZXQgc2VxdWVuY2VyIHNjYW4gbGVuZ3RoIGJ5IGNsZWFyaW5nIHJhbmtzIGFib3ZlIG1heGltdW0gcmFuayAgKi8KKyAgICAgICAgLyogICAgYW5kIGRvIG5vdCBtb2RpZnkgb3RoZXIgcmFua3MgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIE1PRElGWV9SRUcoaGFkYy0+SW5zdGFuY2UtPkNIU0VMUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0hTRUxSX1NRX0FMTCwKKyAgICAgICAgICAgICAgICAgICAoQURDX0NIU0VMUl9TUTJfVE9fU1E4IDw8ICgoKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uIC0gMVVMKSAqIEFEQ19SRUdVTEFSX1JBTktfMikgJiAweDFGVUwpKSB8IChoYWRjLT5BRENHcm91cFJlZ3VsYXJTZXF1ZW5jZXJSYW5rcykKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENoZWNrIGJhY2sgdGhhdCBBREMgcmVnaXN0ZXJzIGhhdmUgZWZmZWN0aXZlbHkgYmVlbiBjb25maWd1cmVkIHRvICAgICAgKi8KKyAgICAvKiBlbnN1cmUgb2Ygbm8gcG90ZW50aWFsIHByb2JsZW0gb2YgQURDIGNvcmUgcGVyaXBoZXJhbCBjbG9ja2luZy4gICAgICAgICovCisgICAgLyogQ2hlY2sgdGhyb3VnaCByZWdpc3RlciBDRkdSMSAoZXhjbHVkaW5nIGFuYWxvZyB3YXRjaGRvZyBjb25maWd1cmF0aW9uOiAqLworICAgIC8qIHNldCBpbnRvIHNlcGFyYXRlIGRlZGljYXRlZCBmdW5jdGlvbiwgYW5kIGJpdHMgb2YgQURDIHJlc29sdXRpb24gc2V0ICAgKi8KKyAgICAvKiBvdXQgb2YgdGVtcG9yYXJ5IHZhcmlhYmxlICd0bXBDRkdSMScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgJiB+KEFEQ19DRkdSMV9BV0QxQ0ggfCBBRENfQ0ZHUjFfQVdEMUVOIHwgQURDX0NGR1IxX0FXRDFTR0wgfCBBRENfQ0ZHUjFfUkVTKSkKKyAgICAgICAgID09IHRtcENGR1IxKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgCisgICAgICAvKiBTZXQgdGhlIEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAgKiAgICAgICAgIHZhbHVlcywgd2l0aCBkZWluaXRpYWxpemF0aW9uIG9mIHRoZSBBREMgTVNQLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IHJlc2V0IG9mIEFEQyBjb21tb24gcmVnaXN0ZXJzIGlzIGRvbmUgCisgICogICAgICAgICBvbmx5IGlmIGFsbCBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIChmdW5jdGlvbiAiSEFMX0FEQ19Nc3BEZUluaXQoKSIgaXMgYWxzbyBjYWxsZWQgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9uczoKKyAgKiAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIHVzZSB0aGUgc2FtZSBjb3JlIGNsb2NrIGF0IFJDQyBsZXZlbCwgZGlzYWJsaW5nCisgICogICAgICAgICB0aGUgY29yZSBjbG9jayByZXNldCBhbGwgQURDIGluc3RhbmNlcykuCisgICogICAgICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgcmVzZXQgb2YgdGhlc2UgY29tbW9uIHBhcmFtZXRlcnMgcmVzZXQgaXMgIAorICAqICAgICAgICAgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmc6IGl0IGNhbiBiZSB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaW4KKyAgKiAgICAgICAgIGNhc2Ugb2YgcmVzZXQgb2YgYSBzaW5nbGUgQURDIHdoaWxlIHRoZSBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgCisgICogICAgICAgICBjb21tb24gZ3JvdXAgaXMgc3RpbGwgcnVubmluZy4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIEhBTF9BRENfRGVJbml0KCkgc2V0IEFEQyBpbiBtb2RlIGRlZXAgcG93ZXItZG93bjoKKyAgKiAgICAgICAgIHRoaXMgc2F2ZXMgbW9yZSBwb3dlciBieSByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzIAorICAqICAgICAgICAgYW5kIGlzIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBiZWZvcmUgZW50ZXJpbmcgTUNVIGxvdy1wb3dlciBtb2Rlcy4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0RlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayBBREMgaGFuZGxlICovCisgIGlmKGhhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXQgQURDIHN0YXRlICovCisgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiByZWd1bGFyIGdyb3VwICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMpOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSAqLworICAgICAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFQURZOworICAgIH0KKyAgfQorICAKKyAgLyogTm90ZTogSEFMIEFEQyBkZUluaXQgaXMgZG9uZSBpbmRlcGVuZGVudGx5IG9mIEFEQyBjb252ZXJzaW9uIHN0b3AgICAgICAgICovCisgIC8qICAgICAgIGFuZCBkaXNhYmxlIHJldHVybiBzdGF0dXMuIEluIGNhc2Ugb2Ygc3RhdHVzIGZhaWwsIGF0dGVtcHQgdG8gICAgICAqLworICAvKiAgICAgICBwZXJmb3JtIGRlaW5pdGlhbGl6YXRpb24gYW55d2F5IGFuZCBpdCBpcyB1cCB1c2VyIGNvZGUgaW4gICAgICAgICAgKi8KKyAgLyogICAgICAgaW4gSEFMX0FEQ19Nc3BEZUluaXQoKSB0byByZXNldCB0aGUgQURDIHBlcmlwaGVyYWwgdXNpbmcgICAgICAgICAgICovCisgIC8qICAgICAgIHN5c3RlbSBSQ0MgaGFyZCByZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgLyogPT09PT09PT09PSBSZXNldCBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8KKyAgLyogUmVzZXQgcmVnaXN0ZXIgSUVSICovCisgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfQVdEMyAgfCBBRENfSVRfQVdEMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVRfQVdEMSAgfCBBRENfSVRfT1ZSICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVRfRU9TICAgfCBBRENfSVRfRU9DICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSVRfRU9TTVAgfCBBRENfSVRfUkRZICAgKSApOworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgSVNSICovCisgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19BV0QzICB8IEFEQ19GTEFHX0FXRDIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfQVdEMSAgfCBBRENfRkxBR19PVlIgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19GTEFHX0VPUyAgIHwgQURDX0ZMQUdfRU9DICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19FT1NNUCB8IEFEQ19GTEFHX1JEWSAgICkgKTsKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENSICovCisgIC8qIEJpdHMgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURTVFAsIEFEQ19DUl9BRFNUQVJUIGFyZSBpbiBhY2Nlc3MgbW9kZSAgICAgKi8KKyAgLyogInJlYWQtc2V0Ijogbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUjEgKi8KKyAgaGFkYy0+SW5zdGFuY2UtPkNGR1IxICY9IH4oQURDX0NGR1IxX0FXRDFDSCAgIHwgQURDX0NGR1IxX0FXRDFFTiAgfCBBRENfQ0ZHUjFfQVdEMVNHTCB8IEFEQ19DRkdSMV9ESVNDRU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT0ZGICB8IEFEQ19DRkdSMV9XQUlUICAgfCBBRENfQ0ZHUjFfQ09OVCAgIHwgQURDX0NGR1IxX09WUk1PRCB8ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0VYVEVOICAgfCBBRENfQ0ZHUjFfRVhUU0VMIHwgQURDX0NGR1IxX0FMSUdOICB8IEFEQ19DRkdSMV9SRVMgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfU0NBTkRJUiB8IEFEQ19DRkdSMV9ETUFDRkcgfCBBRENfQ0ZHUjFfRE1BRU4gICAgICAgICAgICAgICAgICAgICAgKTsKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovCisgIC8qIE5vdGU6IFVwZGF0ZSBvZiBBREMgY2xvY2sgbW9kZSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUgZGlzYWJsZWQ6ICAgKi8KKyAgLyogICAgICAgYWxyZWFkeSBkb25lIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIgJj0gfkFEQ19DRkdSMl9DS01PREU7CisgIAorICAvKiBSZXNldCByZWdpc3RlciBTTVBSICovCisgIGhhZGMtPkluc3RhbmNlLT5TTVBSICY9IH5BRENfU01QUl9TTVAxOworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgVFIxICovCisgIGhhZGMtPkluc3RhbmNlLT5UUjEgJj0gfihBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxKTsKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENIU0VMUiAqLworICBoYWRjLT5JbnN0YW5jZS0+Q0hTRUxSICY9IH4oQURDX0NIU0VMUl9TUV9BTEwpOworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisgIAorICAvKiBSZXNldCByZWdpc3RlciBDQ1IgKi8KKyAgQURDMV9DT01NT04tPkNDUiAmPSB+KEFEQ19DQ1JfVkJBVEVOIHwgQURDX0NDUl9UU0VOIHwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1BSRVNDKTsKKyAgCisgIC8qID09PT09PT09PT0gSGFyZCByZXNldCBBREMgcGVyaXBoZXJhbCA9PT09PT09PT09ICovCisgIC8qIFBlcmZvcm1zIGEgZ2xvYmFsIHJlc2V0IG9mIHRoZSBlbnRpcmUgQURDIHBlcmlwaGVyYWw6IEFEQyBzdGF0ZSBpcyAgICAgKi8KKyAgLyogZm9yY2VkIHRvIGEgc2ltaWxhciBzdGF0ZSBhZnRlciBkZXZpY2UgcG93ZXItb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBuZWVkZWQsIGNvcHktcGFzdGUgYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHJlc2V0IGNvZGUgaW50byAgICAgICovCisgIC8qIGZ1bmN0aW9uICJ2b2lkIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykiOiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgX19IQUxfUkNDX0FEQzFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorICAKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfQURDX01zcERlSW5pdChoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgCisgIC8qIFJlc2V0IEhBTCBBREMgaGFuZGxlIHZhcmlhYmxlICovCisgIGhhZGMtPkFEQ0dyb3VwUmVndWxhclNlcXVlbmNlclJhbmtzID0gMHgwMDAwMDAwMFVMOworICAKKyAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgCisgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgaGFkYy0+U3RhdGUgPSBIQUxfQURDX1NUQVRFX1JFU0VUOworICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBBREMgTVNQLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Nc3BJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgQURDIE1TUC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQG5vdGUgICBBbGwgQURDIGluc3RhbmNlcyB1c2UgdGhlIHNhbWUgY29yZSBjbG9jayBhdCBSQ0MgbGV2ZWwsIGRpc2FibGluZworICAqICAgICAgICAgdGhlIGNvcmUgY2xvY2sgcmVzZXQgYWxsIEFEQyBpbnN0YW5jZXMpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19Nc3BEZUluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTXNwRGVJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovIAorfQorCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgQURDIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGFkYyBQb2ludGVyIHRvIGEgQURDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBBREMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgICBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRCAgICAgICAgICBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICAgQURDIGVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18yX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfM19DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICAgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICBBREMgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQURDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMFVMKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgOgorICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfRVJST1JfQ0JfSUQgOgorICAgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRCA6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgOgorICAgICAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9BRENfU1RBVEVfUkVTRVQgPT0gaGFkYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIAorICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBBREMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEFEQyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhhZGMgUG9pbnRlciB0byBhIEFEQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQURDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgICBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRCAgICAgICAgICBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICAgQURDIGVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18yX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfM19DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICAgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICBBREMgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayA9IEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9BRENfRXJyb3JDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzJfQ0JfSUQgOgorICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrID0gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayA9IEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0VORF9PRl9TQU1QTElOR19DQl9JRCA6CisgICAgICAgIGhhZGMtPkVuZE9mU2FtcGxpbmdDYWxsYmFjayA9IEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0FEQ19TVEFURV9SRVNFVCA9PSBoYWRjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9BRENfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEFEQyBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgQURDIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBjb21wbGV0ZSBvbiByZWd1bGFyIGdyb3VwLgorICAgICAgKCspIFBvbGwgZm9yIGNvbnZlcnNpb24gZXZlbnQuCisgICAgICAoKykgR2V0IHJlc3VsdCBvZiByZWd1bGFyIGNoYW5uZWwgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGVuYWJsZSBpbnRlcnJ1cHRpb25zLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgSGFuZGxlIEFEQyBpbnRlcnJ1cHQgcmVxdWVzdAorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZGlzYWJsZSBBREMgRE1BIHRyYW5zZmVyLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuCisgICogQG5vdGUgICBJbnRlcnJ1cHRpb25zIGVuYWJsZWQgaW4gdGhpcyBmdW5jdGlvbjogTm9uZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfCBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgKi8KKyAgICAgIC8qIFJlc2V0IGFsbCBBREMgZXJyb3IgY29kZSBmaWVsZHMgKi8KKyAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIChUbyBlbnN1cmUgb2Ygbm8gdW5rbm93biBzdGF0ZSBmcm9tIHBvdGVudGlhbCBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGNoYW5uZWxzIGluIAorICAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBBREMgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZTogIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBzdG9wIG9mIHBvdGVudGlhbCAKKyAgKiAgICAgICAgIGNvbnZlcnNpb24gb24gaW5qZWN0ZWQgZ3JvdXAuIElmIGluamVjdGVkIGdyb3VwIGlzIHVuZGVyIHVzZSwgaXQKKyAgKiAgICAgICAgIHNob3VsZCBiZSBwcmVsaW1pbmFyaWx5IHN0b3BwZWQgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RvcCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZywgb24gQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYyk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHRvIGJlIGNvbXBsZXRlZC4KKyAgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGZsYWdzIEVPUyAoZW5kIG9mIHNlcXVlbmNlKSBhbmQgRU9DIChlbmQgb2YKKyAgKiAgICAgICAgIGNvbnZlcnNpb24pIGFyZSBjbGVhcmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHdpdGggYW4gZXhjZXB0aW9uOgorICAqICAgICAgICAgaWYgbG93IHBvd2VyIGZlYXR1cmUgIkxvd1Bvd2VyQXV0b1dhaXQiIGlzIGVuYWJsZWQsIGZsYWdzIGFyZSAKKyAgKiAgICAgICAgIG5vdCBjbGVhcmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSByZWdpc3RlcgorICAqICAgICAgICAgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFydGljdWxhciBzZXR1cDogQURDIGNvbmZpZ3VyZWQgCisgICogICAgICAgICBpbiBETUEgbW9kZSBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbiAoQURDIGluaXQKKyAgKiAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiBzZXQgdG8gQURDX0VPQ19TSU5HTEVfQ09OVikuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIERNQSByZXNldHMgdGhlIGZsYWcgRU9DIGFuZCBwb2xsaW5nIGNhbm5vdCBiZQorICAqICAgICAgICAgcGVyZm9ybWVkIG9uIGVhY2ggY29udmVyc2lvbi4gTmV2ZXJ0aGVsZXNzLCBwb2xsaW5nIGNhbiBzdGlsbCAKKyAgKiAgICAgICAgIGJlIHBlcmZvcm1lZCBvbiB0aGUgY29tcGxldGUgc2VxdWVuY2UgKEFEQyBpbml0CisgICogICAgICAgICBwYXJhbWV0ZXIgIkVPQ1NlbGVjdGlvbiIgc2V0IHRvIEFEQ19FT0NfU0VRX0NPTlYpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbihBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXBfRmxhZ19FbmQ7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisgIGlmIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbiA9PSBBRENfRU9DX1NFUV9DT05WKQorICB7CisgICAgdG1wX0ZsYWdfRW5kID0gQURDX0ZMQUdfRU9TOworICB9CisgIC8qIElmIGVuZCBvZiBjb252ZXJzaW9uIHNlbGVjdGVkIHRvIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyAgZWxzZSAvKiBBRENfRU9DX1NJTkdMRV9DT05WICovCisgIHsKKyAgICAvKiBWZXJpZmljYXRpb24gdGhhdCBBREMgY29uZmlndXJhdGlvbiBpcyBjb21wbGlhbnQgd2l0aCBwb2xsaW5nIGZvciAgICAgICovCisgICAgLyogZWFjaCBjb252ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgQURDIHNlcXVlbmNlciB3aXRoICAgKi8KKyAgICAvKiBzZXZlcmFsIHJhbmtzIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICovCisgICAgLyogRm9yIGNvZGUgc2ltcGxpY2l0eSBzYWtlLCB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcyBnZW5lcmFsaXplZCB0byAgICAgICAqLworICAgIC8qIEFEQyBjb25maWd1cmVkIGluIERNQSBtb2RlIGFuZCBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DRkdSMSAmIEFEQ19DRkdSMV9ETUFFTikgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wX0ZsYWdfRW5kID0gKEFEQ19GTEFHX0VPQyk7CisgICAgfQorICB9CisgIAorICAvKiBHZXQgdGljayBjb3VudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAKKyAgLyogV2FpdCB1bnRpbCBFbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9yIHNlcXVlbmNlIGNvbnZlcnNpb25zIGZsYWcgaXMgcmFpc2VkICovCisgIHdoaWxlKChoYWRjLT5JbnN0YW5jZS0+SVNSICYgdG1wX0ZsYWdfRW5kKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8KKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVTCkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byB0aW1lb3V0ICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfVElNRU9VVCk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19FT0MpOworICAKKyAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAgICovCisgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nLiAgICAgICAgICAqLworICBpZiggICAoTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpCisgICAgICYmIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKQorICAgICkKKyAgeworICAgIC8qIENoZWNrIHdoZXRoZXIgZW5kIG9mIHNlcXVlbmNlIGlzIHJlYWNoZWQgKi8KKyAgICBpZiggX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPUykgKQorICAgIHsKKyAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0VPQy9BRENfSVRfRU9TIG9ubHkgaWYgYml0ICAgICAgICAgICAgICovCisgICAgICAvKiBBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIEFEQyBlbmQgb2Ygc2luZ2xlIGNvbnZlcnNpb24gaW50ZXJydXB0IG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgICAgICovCisgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICAgICAqLworICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENsZWFyIGVuZCBvZiBjb252ZXJzaW9uIGZsYWcgb2YgcmVndWxhciBncm91cCBpZiBsb3cgcG93ZXIgZmVhdHVyZSAgICAgICAqLworICAvKiAiTG93UG93ZXJBdXRvV2FpdCAiIGlzIGRpc2FibGVkLCB0byBub3QgaW50ZXJmZXJlIHdpdGggdGhpcyBmZWF0dXJlICAgICAgKi8KKyAgLyogdW50aWwgZGF0YSByZWdpc3RlciBpcyByZWFkIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4gICAgICAgICAgICovCisgIGlmIChoYWRjLT5Jbml0Lkxvd1Bvd2VyQXV0b1dhaXQgPT0gRElTQUJMRSkKKyAgeworICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUykpOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUG9sbCBmb3IgQURDIGV2ZW50LgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gRXZlbnRUeXBlIHRoZSBBREMgZXZlbnQgdHlwZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19FT1NNUF9FVkVOVCAgQURDIEVuZCBvZiBTYW1wbGluZyBldmVudAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19BV0QxX0VWRU5UICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50IChtYWluIGFuYWxvZyB3YXRjaGRvZywgcHJlc2VudCBvbiBhbGwgU1RNMzIgZGV2aWNlcykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfQVdEMl9FVkVOVCAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBldmVudCAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIG5vdCBwcmVzZW50IG9uIGFsbCBTVE0zMiBmYW1pbGllcykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfQVdEM19FVkVOVCAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBldmVudCAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2csIG5vdCBwcmVzZW50IG9uIGFsbCBTVE0zMiBmYW1pbGllcykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfT1ZSX0VWRU5UICAgIEFEQyBPdmVycnVuIGV2ZW50CisgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAbm90ZSAgIFRoZSByZWxldmFudCBmbGFnIGlzIGNsZWFyZWQgaWYgZm91bmQgdG8gYmUgc2V0LCBleGNlcHQgZm9yIEFEQ19GTEFHX09WUi4KKyAgKiAgICAgICAgIEluZGVlZCwgdGhlIGxhdHRlciBpcyByZXNldCBvbmx5IGlmIGhhZGMtPkluaXQuT3ZlcnJ1biBmaWVsZCBpcyBzZXQgIAorICAqICAgICAgICAgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBPdGhlcndpc2UsIGRhdGEgcmVnaXN0ZXIgbWF5IGJlIHBvdGVudGlhbGx5IG92ZXJ3cml0dGVuIAorICAqICAgICAgICAgYnkgYSBuZXcgY29udmVydGVkIGRhdGEgYXMgc29vbiBhcyBPVlIgaXMgY2xlYXJlZC4KKyAgKiAgICAgICAgIFRvIHJlc2V0IE9WUiBmbGFnIG9uY2UgdGhlIHByZXNlcnZlZCBkYXRhIGlzIHJldHJpZXZlZCwgdGhlIHVzZXIgY2FuIHJlc29ydAorICAqICAgICAgICAgdG8gbWFjcm8gX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsgCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1BvbGxGb3JFdmVudChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgRXZlbnRUeXBlLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7IAorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FVkVOVF9UWVBFKEV2ZW50VHlwZSkpOworICAKKyAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qIENoZWNrIHNlbGVjdGVkIGV2ZW50IGZsYWcgKi8KKyAgd2hpbGUoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEV2ZW50VHlwZSkgPT0gMFVMKQorICB7CisgICAgLyogQ2hlY2sgaWYgdGltZW91dCBpcyBkaXNhYmxlZCAoc2V0IHRvIGluZmluaXRlIHdhaXQpICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBzd2l0Y2goRXZlbnRUeXBlKQorICB7CisgIC8qIEVuZCBPZiBTYW1wbGluZyBldmVudCAqLworICBjYXNlIEFEQ19FT1NNUF9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVApOworICAgICAKKyAgICAvKiBDbGVhciB0aGUgRW5kIE9mIFNhbXBsaW5nIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCk7CisgICAgICAgCisgICAgYnJlYWs7ICAKKyAgCisgIC8qIEFuYWxvZyB3YXRjaGRvZyAobGV2ZWwgb3V0IG9mIHdpbmRvdykgZXZlbnQgKi8KKyAgLyogTm90ZTogSW4gY2FzZSBvZiBzZXZlcmFsIGFuYWxvZyB3YXRjaGRvZyBlbmFibGVkLCBpZiBuZWVkZWQgdG8ga25vdyAgICAgICovCisgIC8qIHdoaWNoIG9uZSB0cmlnZ2VyZWQgYW5kIG9uIHdoaWNoIEFEQ3gsIHRlc3QgQURDIHN0YXRlIG9mIGFuYWxvZyB3YXRjaGRvZyAqLworICAvKiBmbGFncyBIQUxfQURDX1NUQVRFX0FXRDEvMi8zIHVzaW5nIGZ1bmN0aW9uICJIQUxfQURDX0dldFN0YXRlKCkiLiAgICAgICAgKi8KKyAgLyogRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIiAgICAgICAgICAqLworICAvKiAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9BV0QyKSAhPSAwVUwpICIgICAgICAgICAgKi8KKyAgLyogICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMykgIT0gMFVMKSAiICAgICAgICAgICovCisgIAorICAvKiBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnICovCisgIGNhc2UgQURDX0FXRF9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QxKTsKKyAgICAKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QxKTsKKyAgICAKKyAgICBicmVhazsKKyAgCisgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAyIGZsYWcgKi8KKyAgY2FzZSBBRENfQVdEMl9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QyKTsKKyAgICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDIpOworICAgIAorICAgIGJyZWFrOworICAKKyAgLyogQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAqLworICBjYXNlIEFEQ19BV0QzX0VWRU5UOgorICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOworICAgICAgCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMyk7CisgICAgCisgICAgYnJlYWs7CisgIAorICAvKiBPdmVycnVuIGV2ZW50ICovCisgIGRlZmF1bHQ6IC8qIENhc2UgQURDX09WUl9FVkVOVCAqLworICAgIC8qIElmIG92ZXJydW4gaXMgc2V0IHRvIG92ZXJ3cml0ZSBwcmV2aW91cyBkYXRhLCBvdmVycnVuIGV2ZW50IGlzIG5vdCAgICAgKi8KKyAgICAvKiBjb25zaWRlcmVkIGFzIGFuIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKGNmIHJlZiBtYW51YWwgIk1hbmFnaW5nIGNvbnZlcnNpb25zIHdpdGhvdXQgdXNpbmcgdGhlIERNQSBhbmQgd2l0aG91dCAqLworICAgIC8qIG92ZXJydW4gIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5pdC5PdmVycnVuID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSKTsKKyAgICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gb3ZlcnJ1biAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfT1ZSKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFEQyBPdmVycnVuIGZsYWcgb25seSBpZiBPdmVycnVuIGlzIHNldCB0byBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyAgICAgICAgIG90aGVyd2lzZSwgZGF0YSByZWdpc3RlciBpcyBwb3RlbnRpYWxseSBvdmVyd3JpdHRlbiBieSBuZXcgY29udmVydGVkIGRhdGEgYXMgc29vbgorICAgICAgICAgYXMgT1ZSIGlzIGNsZWFyZWQuICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCB3aXRoIGludGVycnVwdGlvbi4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbml0aWFsaXphdGlvbgorICAqICAgICAgICAgc2V0dGluZyA6IEVPQyAoZW5kIG9mIGNvbnZlcnNpb24pLCBFT1MgKGVuZCBvZiBzZXF1ZW5jZSksIAorICAqICAgICAgICAgT1ZSIG92ZXJydW4uCisgICogICAgICAgICBFYWNoIG9mIHRoZXNlIGludGVycnVwdGlvbnMgaGFzIGl0cyBkZWRpY2F0ZWQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogQG5vdGUgICBUbyBndWFyYW50ZWUgYSBwcm9wZXIgcmVzZXQgb2YgYWxsIGludGVycnVwdGlvbnMgb25jZSBhbGwgdGhlIG5lZWRlZAorICAqICAgICAgICAgY29udmVyc2lvbnMgYXJlIG9idGFpbmVkLCBIQUxfQURDX1N0b3BfSVQoKSBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgCisgICogICAgICAgICBhIGNvcnJlY3Qgc3RvcCBvZiB0aGUgSVQtYmFzZWQgY29udmVyc2lvbnMuCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBIQUxfQURDX1N0YXJ0X0lUKCkgZG9lcyBub3QgZW5hYmxlIHRoZSBFbmQgT2YgU2FtcGxpbmcgCisgICogICAgICAgICBpbnRlcnJ1cHRpb24uIElmIHJlcXVpcmVkIChlLmcuIGluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIHdpdGggdHJpZ2dlcgorICAqICAgICAgICAgbW9kZSksIHRoZSB1c2VyIG11c3Q6CisgICogICAgICAgICAgMS4gZmlyc3QgY2xlYXIgdGhlIEVPU01QIGZsYWcgaWYgc2V0IHdpdGggbWFjcm8gX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TTVApICAgICAgICAgICAgIAorICAqICAgICAgICAgIDIuIHRoZW4gZW5hYmxlIHRoZSBFT1NNUCBpbnRlcnJ1cHQgd2l0aCBtYWNybyBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9FT1NNUCkgICAgIAorICAqICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIEhBTF9BRENfU3RhcnRfSVQoKS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQZXJmb3JtIEFEQyBlbmFibGUgYW5kIGNvbnZlcnNpb24gc3RhcnQgaWYgbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyAqLworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGFkYyk7CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0VuYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBTdGFydCBjb252ZXJzaW9uIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfCBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgCisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSAqLworICAgICAgLyogUmVzZXQgYWxsIEFEQyBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAgIAorICAgICAgLyogQ2xlYXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgICAgICAgICAgICAgICAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX09WUikpOworICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAqLworICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgIAorICAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0aW9ucyBiZWZvcmUgZW5hYmxpbmcgdGhlIGRlc2lyZWQgb25lcyAqLworICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCAqLworICAgICAgc3dpdGNoKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKQorICAgICAgeworICAgICAgICBjYXNlIEFEQ19FT0NfU0VRX0NPTlY6CisgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfRU9TKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX19IQUxfQURDX0VOQUJMRV9JVChoYWRjLCBBRENfSVRfRU9DKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRW5hYmxlIEFEQyBvdmVycnVuIGludGVycnVwdCAqLworICAgICAgLyogSWYgaGFkYy0+SW5pdC5PdmVycnVuIGlzIHNldCB0byBBRENfT1ZSX0RBVEFfUFJFU0VSVkVELCBvbmx5IHRoZW4gaXMKKyAgICAgICAgIEFEQ19JVF9PVlIgZW5hYmxlZDsgb3RoZXJ3aXNlIGRhdGEgb3ZlcndyaXRlIGlzIGNvbnNpZGVyZWQgYXMgbm9ybWFsCisgICAgICAgICBiZWhhdmlvciBhbmQgbm8gQ1BVIHRpbWUgaXMgbG9zdCBmb3IgYSBub24tcHJvY2Vzc2VkIGludGVycnVwdGlvbiAqLworICAgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnJ1biA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKQorICAgICAgeworICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOyAgCisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgfQorICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGdyb3VwIGluIAorICAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBpbnRlcnJ1dGlvbiBvZiAKKyAgKiAgICAgICAgIGVuZC1vZi1jb252ZXJzaW9uLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0b3BfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiBBREMgZ3JvdXAgcmVndWxhciAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19Db252ZXJzaW9uU3RvcChoYWRjKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIERpc2FibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBmb3IgcmVndWxhciBncm91cCAqLworICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworICAgIAorICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIHRyYW5zZmVyIHJlc3VsdCB0aHJvdWdoIERNQS4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgb3ZlcnJ1biAoaWYgYXBwbGljYWJsZSksIERNQSBoYWxmIHRyYW5zZmVyLCBETUEgdHJhbnNmZXIgY29tcGxldGUuIAorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gcERhdGEgRGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtIExlbmd0aCBOdW1iZXIgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIEFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUGVyZm9ybSBBREMgZW5hYmxlIGFuZCBjb252ZXJzaW9uIHN0YXJ0IGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIFNwZWNpZmljIGNhc2UgZm9yIGZpcnN0IGNhbGwgb2NjdXJyZW5jZSBvZiB0aGlzIGZ1bmN0aW9uIChETUEgdHJhbnNmZXIgKi8KKyAgICAvKiBub3QgYWN0aXZhdGVkIGFuZCBBREMgZGlzYWJsZWQpLCBETUEgdHJhbnNmZXIgbXVzdCBiZSBhY3RpdmF0ZWQgICAgICAgICovCisgICAgLyogd2l0aCBBREMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoaGFkYy0+SW5zdGFuY2UtPkNGR1IxICYgQURDX0NGR1IxX0RNQUVOKSA9PSAwVUwpCisgICAgeworICAgICAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBREMgKi8KKyAgICAgICAgTExfQURDX0Rpc2FibGUoaGFkYy0+SW5zdGFuY2UpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIERNQSBtb2RlICovCisgICAgICBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEgfD0gQURDX0NGR1IxX0RNQUVOOworICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8IEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSAqLworICAgICAgLyogUmVzZXQgYWxsIEFEQyBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJDcGx0Q2FsbGJhY2sgPSBBRENfRE1BQ29udkNwbHQ7CisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gQURDX0RNQUhhbGZDb252Q3BsdDsKKyAgICAgIAorICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhhZGMtPkRNQV9IYW5kbGUtPlhmZXJFcnJvckNhbGxiYWNrID0gQURDX0RNQUVycm9yOworICAgICAgCisgICAgICAKKyAgICAgIC8qIE1hbmFnZSBBREMgYW5kIERNQSBzdGFydDogQURDIG92ZXJydW4gaW50ZXJydXB0aW9uLCBETUEgc3RhcnQsIEFEQyAgICovCisgICAgICAvKiBzdGFydCAoaW4gY2FzZSBvZiBTVyBzdGFydCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgCisgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDICAgICAgICAgICAqLworICAgICAgLyogb3BlcmF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIChBRENfRkxBR19FT0MgfCBBRENfRkxBR19FT1MgfCBBRENfRkxBR19PVlIpKTsKKyAgICAgIAorICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgLyogVW5sb2NrIGJlZm9yZSBzdGFydGluZyBBREMgY29udmVyc2lvbnM6IGluIGNhc2Ugb2YgcG90ZW50aWFsICAgICAgICAgKi8KKyAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgICAKKyAgICAgIC8qIFN0YXJ0IHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhhZGMtPkRNQV9IYW5kbGUsICh1aW50MzJfdCkmaGFkYy0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIExlbmd0aCk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGF0IG5leHQgKi8KKyAgICAgIC8qIHRyaWdnZXIgZXZlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbihoYWRjLT5JbnN0YW5jZSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCAoYW5kIGluamVjdGVkIGdyb3VwIGluIAorICAqICAgICAgICAgY2FzZSBvZiBhdXRvX2luamVjdGlvbiBtb2RlKSwgZGlzYWJsZSBBREMgRE1BIHRyYW5zZmVyLCBkaXNhYmxlIAorICAqICAgICAgICAgQURDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMpOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKGluIGNhc2Ugb2YgRE1BIGluIGNpcmN1bGFyIG1vZGUgb3Igc3RvcCAgICAgICAqLworICAgIC8qIHdoaWxlIERNQSB0cmFuc2ZlciBpcyBvbiBnb2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihoYWRjLT5ETUFfSGFuZGxlLT5TdGF0ZSA9PSBIQUxfRE1BX1NUQVRFX0JVU1kpCisgICAgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiBETUEgY2hhbm5lbCBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgdG8ga2VlcCAgKi8KKyAgICAvKiBpbiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKHZvaWQpQURDX0Rpc2FibGUoaGFkYyk7CisgICAgfQorICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgICAgfQorICAgIAorICAgIC8qIERpc2FibGUgQURDIERNQSAoQURDIERNQSBjb25maWd1cmF0aW9uIG9mIGNvbnRpbnVvdXMgcmVxdWVzdHMgaXMga2VwdCkgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IxLCBBRENfQ0ZHUjFfRE1BRU4pOworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgRFIgYXV0b21hdGljYWxseSBjbGVhcnMgQURDIGZsYWcgRU9DCisgICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbikuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIEFEQyBmbGFnIEVPUyAKKyAgKiAgICAgICAgIChBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikuCisgICogICAgICAgICBPY2N1cnJlbmNlIG9mIGZsYWcgRU9TIHJpc2luZzoKKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgRU9TIGlzIGVxdWl2YWxlbnQKKyAgKiAgICAgICAgICAgIHRvIGZsYWcgRU9DLgorICAqICAgICAgICAgIC0gSWYgc2VxdWVuY2VyIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgcmFua3MsIGR1cmluZyB0aGUgc2NhbgorICAqICAgICAgICAgICAgc2VxdWVuY2UgZmxhZyBFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgRU9DIGFuZCBFT1MgYXJlIHJhaXNlZC4KKyAgKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjoKKyAgKiAgICAgICAgIGluIHByb2dyYW1taW5nIG1vZGVsIElUOiBAcmVmIEhBTF9BRENfSVJRSGFuZGxlcigpLCBpbiBwcm9ncmFtbWluZworICAqICAgICAgICAgbW9kZWwgcG9sbGluZzogQHJlZiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKCkKKyAgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0VPUykuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIE5vdGU6IEVPQyBmbGFnIGlzIG5vdCBjbGVhcmVkIGhlcmUgYnkgc29mdHdhcmUgYmVjYXVzZSBhdXRvbWF0aWNhbGx5ICAgICAqLworICAvKiAgICAgICBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gcmVhZGluZyByZWdpc3RlciBEUi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gaGFkYy0+SW5zdGFuY2UtPkRSOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBREMgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIHVpbnQzMl90IG92ZXJydW5fZXJyb3IgPSAwVUw7IC8qIGZsYWcgc2V0IGlmIG92ZXJydW4gb2NjdXJyZW5jZSBoYXMgdG8gYmUgY29uc2lkZXJlZCBhcyBhbiBlcnJvciAqLworICB1aW50MzJfdCB0bXBfaXNyID0gaGFkYy0+SW5zdGFuY2UtPklTUjsKKyAgdWludDMyX3QgdG1wX2llciA9IGhhZGMtPkluc3RhbmNlLT5JRVI7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VPQ19TRUxFQ1RJT04oaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pKTsKKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgRW5kIG9mIFNhbXBsaW5nIGZsYWcgZm9yIEFEQyBncm91cCByZWd1bGFyID09PT09PT09PT0gKi8KKyAgaWYoKCh0bXBfaXNyICYgQURDX0ZMQUdfRU9TTVApID09IEFEQ19GTEFHX0VPU01QKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfRU9TTVApID09IEFEQ19JVF9FT1NNUCkpCisgIHsKKyAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBlbmQgb2Ygc2FtcGxpbmcgc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSA9PSAwVUwpCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9TTVApOworICAgIH0KKyAgICAKKyAgICAvKiBFbmQgT2YgU2FtcGxpbmcgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+RW5kT2ZTYW1wbGluZ0NhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIENsZWFyIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TTVAgKTsKKyAgfQorICAKKyAgLyogPT09PT09IENoZWNrIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gc2VxdWVuY2UgY29udmVyc2lvbnMgPT09PT0gKi8KKyAgaWYoKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPQykgPT0gQURDX0ZMQUdfRU9DKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfRU9DKSA9PSBBRENfSVRfRU9DKSkgfHwKKyAgICAgKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPUykgPT0gQURDX0ZMQUdfRU9TKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfRU9TKSA9PSBBRENfSVRfRU9TKSkgICkKKyAgeworICAgIC8qIFVwZGF0ZSBzdGF0ZSBtYWNoaW5lIG9uIGNvbnZlcnNpb24gc3RhdHVzIGlmIG5vdCBpbiBlcnJvciBzdGF0ZSAqLworICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKSA9PSAwVUwpCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKyAgICB9CisgICAgCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nICAgICAgICAgKi8KKyAgICAvKiB0byBkaXNhYmxlIGludGVycnVwdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoICAgKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAgICYmIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKQorICAgICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSApCisgICAgICB7CisgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0VPQy9BRENfSVRfRU9TIG9ubHkgaWYgYml0ICAgICAgICAgICAqLworICAgICAgICAvKiBBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNpbmdsZSBjb252ZXJzaW9uIGludGVycnVwdCBvbiBncm91cCByZWd1bGFyICovCisgICAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgICAqLworICAgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICAgKi8KKyAgICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgICAgCisgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAvKiBOb3RlOiBJbnRvIGNhbGxiYWNrIGZ1bmN0aW9uICJIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSIsICAgICAgICAgICAgICovCisgICAgLyogICAgICAgdG8gZGV0ZXJtaW5lIGlmIGNvbnZlcnNpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGZyb20gRU9DIG9yIEVPUywgICAqLworICAgIC8qICAgICAgIHBvc3NpYmlsaXR5IHRvIHVzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgIiBpZiggX19IQUxfQURDX0dFVF9GTEFHKCZoYWRjLCBBRENfRkxBR19FT1MpKSAiICAgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAKKyAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgIC8qIE5vdGU6IGluIGNhc2Ugb2Ygb3ZlcnJ1biBzZXQgdG8gQURDX09WUl9EQVRBX1BSRVNFUlZFRCwgZW5kIG9mICAgICAgICAgKi8KKyAgICAvKiAgICAgICBjb252ZXJzaW9uIGZsYWdzIGNsZWFyIGluZHVjZXMgdGhlIHJlbGVhc2Ugb2YgdGhlIHByZXNlcnZlZCBkYXRhLiovCisgICAgLyogICAgICAgVGhlcmVmb3JlLCBpZiB0aGUgcHJlc2VydmVkIGRhdGEgdmFsdWUgaXMgbmVlZGVkLCBpdCBtdXN0IGJlICAgICAqLworICAgIC8qICAgICAgIHJlYWQgcHJlbGltaW5hcmlseSBpbnRvIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLiAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSApOworICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgPT09PT09PT09PSAqLworICBpZiAoKCh0bXBfaXNyICYgQURDX0ZMQUdfQVdEMSkgPT0gQURDX0ZMQUdfQVdEMSkgJiYgKCh0bXBfaWVyICYgQURDX0lUX0FXRDEpID09IEFEQ19JVF9BV0QxKSkgICAgICAKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDEpOworICAgIAorICAgIC8qIExldmVsIG91dCBvZiB3aW5kb3cgMSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENfTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLyAKKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QxKTsKKyAgfQorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0FXRDIpID09IEFEQ19GTEFHX0FXRDIpICYmICgodG1wX2llciAmIEFEQ19JVF9BV0QyKSA9PSBBRENfSVRfQVdEMikpICAgICAgCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QyKTsKKyAgICAKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovIAorICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDIpOworICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgPT09PT09PT09PSAqLworICBpZiAoKCh0bXBfaXNyICYgQURDX0ZMQUdfQVdEMykgPT0gQURDX0ZMQUdfQVdEMykgJiYgKCh0bXBfaWVyICYgQURDX0lUX0FXRDMpID09IEFEQ19JVF9BV0QzKSkgICAgICAKKyAgeworICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOworICAgIAorICAgIC8qIExldmVsIG91dCBvZiB3aW5kb3cgMyBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8gCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMyk7CisgIH0KKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgT3ZlcnJ1biBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX09WUikgPT0gQURDX0ZMQUdfT1ZSKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfT1ZSKSA9PSBBRENfSVRfT1ZSKSkgCisgIHsKKyAgICAvKiBJZiBvdmVycnVuIGlzIHNldCB0byBvdmVyd3JpdGUgcHJldmlvdXMgZGF0YSAoZGVmYXVsdCBzZXR0aW5nKSwgICAgICAgICovCisgICAgLyogb3ZlcnJ1biBldmVudCBpcyBub3QgY29uc2lkZXJlZCBhcyBhbiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIChjZiByZWYgbWFudWFsICJNYW5hZ2luZyBjb252ZXJzaW9ucyB3aXRob3V0IHVzaW5nIHRoZSBETUEgYW5kIHdpdGhvdXQgKi8KKyAgICAvKiBvdmVycnVuICIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogRXhjZXB0aW9uIGZvciB1c2FnZSB3aXRoIERNQSBvdmVycnVuIGV2ZW50IGFsd2F5cyBjb25zaWRlcmVkIGFzIGFuICAgICAqLworICAgIC8qIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5pdC5PdmVycnVuID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpCisgICAgeworICAgICAgb3ZlcnJ1bl9lcnJvciA9IDFVTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIERNQSBjb25maWd1cmF0aW9uICovCisgICAgICBpZiAoTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcihoYWRjLT5JbnN0YW5jZSkgIT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgb3ZlcnJ1bl9lcnJvciA9IDFVTDsKKyAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIGlmIChvdmVycnVuX2Vycm9yID09IDFVTCkKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19PVlIpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gb3ZlcnJ1biAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfT1ZSKTsKKyAgICAgIAorICAgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIC8qIE5vdGU6IEluIGNhc2Ugb2Ygb3ZlcnJ1biwgQURDIGNvbnZlcnNpb24gZGF0YSBpcyBwcmVzZXJ2ZWQgdW50aWwgICAgICovCisgICAgICAvKiAgICAgICBmbGFnIE9WUiBpcyByZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgVGhlcmVmb3JlLCBvbGQgQURDIGNvbnZlcnNpb24gZGF0YSBjYW4gYmUgcmV0cmlldmVkIGluICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGZ1bmN0aW9uICJIQUxfQURDX0Vycm9yQ2FsbGJhY2soKSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGFkYy0+RXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgICBIQUxfQURDX0Vycm9yQ2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIAorICAgIC8qIENsZWFyIEFEQyBvdmVycnVuIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOworICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWFkeSBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0NDUkRZKSA9PSBBRENfRkxBR19DQ1JEWSkgJiYgKCh0bXBfaWVyICYgQURDX0lUX0NDUkRZKSA9PSBBRENfSVRfQ0NSRFkpKQorICB7CisgICAgLyogTGV2ZWwgb3V0IG9mIHdpbmRvdyAxIGNhbGxiYWNrICovCisgICAgSEFMX0FEQ0V4X0NoYW5uZWxDb25maWdSZWFkeUNhbGxiYWNrKGhhZGMpOworICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLyAKKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19DQ1JEWSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFEQyBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqICAgICAgICAgKEFEQyBjb252ZXJzaW9uIHdpdGggaW50ZXJydXB0aW9uIG9yIHRyYW5zZmVyIGJ5IERNQSkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGVycm9yIGR1ZSB0byBvdmVycnVuIHdoZW4gdXNpbmcgQURDIHdpdGggRE1BIHRyYW5zZmVyIAorICAqICAgICAgICAgKEhBTCBBREMgaGFuZGxlIHBhcmFtZXRlciAiRXJyb3JDb2RlIiB0byBzdGF0ZSAiSEFMX0FEQ19FUlJPUl9PVlIiKToKKyAgKiAgICAgICAgIC0gUmVpbml0aWFsaXplIHRoZSBETUEgdXNpbmcgZnVuY3Rpb24gIkhBTF9BRENfU3RvcF9ETUEoKSIuCisgICogICAgICAgICAtIElmIG5lZWRlZCwgcmVzdGFydCBhIG5ldyBBREMgY29udmVyc2lvbiB1c2luZyBmdW5jdGlvbgorICAqICAgICAgICAgICAiSEFMX0FEQ19TdGFydF9ETUEoKSIKKyAgKiAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjbGVhcmluZyBvdmVycnVuIGZsYWcpCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19FcnJvckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0Vycm9yQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzIG9uIHJlZ3VsYXIgZ3JvdXAKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZworICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhIGNoYW5uZWwgdG8gYmUgYXNzaWduZWQgdG8gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOgorICAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgICogICAgICAgICBUaGVzZSBpbnRlcm5hbCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgZnVuY3Rpb24gCisgICogICAgICAgICBIQUxfQURDX0RlSW5pdCgpLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgY2hhbm5lbCBpbnRvIEFEQyBncm91cCByZWd1bGFyLAorICAqICAgICAgICAgZm9sbG93aW5nIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUKKyAgKiAgICAgICAgIHNvbWUgcGFyYW1ldGVycyBvZiBzdHJ1Y3R1cmUgIkFEQ19DaGFubmVsQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksCisgICogICAgICAgICB3aXRob3V0IHJlc2V0dGluZyB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBSZWZlciB0byBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgIkFEQ19DaGFubmVsQ29uZlR5cGVEZWYiLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gc0NvbmZpZyBTdHJ1Y3R1cmUgb2YgQURDIGNoYW5uZWwgYXNzaWduZWQgdG8gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYqIHNDb25maWcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWw7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKHNDb25maWctPkNoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTElOR19USU1FX0NPTU1PTihzQ29uZmlnLT5TYW1wbGluZ1RpbWUpKTsKKyAgCisgIGlmKChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRUQpICAgICAgICAgIHx8CisgICAgIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRURfQkFDS1dBUkQpICAgKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdVTEFSX1JBTktfU0VRX0ZJWEVEKHNDb25maWctPlJhbmspKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfTkJfQ09OVihoYWRjLT5Jbml0Lk5ick9mQ29udmVyc2lvbikpOworICAgIAorICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9SQU5LKHNDb25maWctPlJhbmspKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIHNhbXBsaW5nIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gTWFuYWdlbWVudCBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVnJlZkludC9UZW1wU2Vuc29yL1ZiYXQgICovCisgIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgeworICAgIC8qIENvbmZpZ3VyZSBjaGFubmVsOiBkZXBlbmRpbmcgb24gcmFuayBzZXR0aW5nLCBhZGQgaXQgb3IgcmVtb3ZlIGl0IGZyb20gKi8KKyAgICAvKiBBREMgc2VxdWVuY2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgc2VxdWVuY2VyIHNldCB0byBub3QgZnVsbHkgY29uZmlndXJhYmxlIHdpdGggY2hhbm5lbCByYW5rIHNldCB0byAgICAqLworICAgIC8qIG5vbmUsIHJlbW92ZSB0aGUgY2hhbm5lbCBmcm9tIHRoZSBzZXF1ZW5jZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBPdGhlcndpc2UgKHNlcXVlbmNlciBzZXQgdG8gZnVsbHkgY29uZmlndXJhYmxlIG9yIHRvIHRvIG5vdCBmdWxseSAgICAgICovCisgICAgLyogY29uZmlndXJhYmxlIHdpdGggY2hhbm5lbCByYW5rIHRvIGJlIHNldCksIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgICAgICAqLworICAgIC8qIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihzQ29uZmlnLT5SYW5rICE9IEFEQ19SQU5LX05PTkUpCisgICAgeworICAgICAgLyogUmVndWxhciBzZXF1ZW5jZSBjb25maWd1cmF0aW9uICovCisgICAgICAvKiBOb3RlOiBBREMgY2hhbm5lbCBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGZldyBBREMgY2xvY2sgY3ljbGVzICAgICAgICAqLworICAgICAgLyogICAgICAgdG8gYmUgcmVhZHkuIFByb2Nlc3Npbmcgb2YgQURDIHNldHRpbmdzIGluIHRoaXMgZnVuY3Rpb24gICAgICAgKi8KKyAgICAgIC8qICAgICAgIGluZHVjZSB0aGF0IGEgc3BlY2lmaWMgd2FpdCB0aW1lIGlzIG5vdCBuZWNlc3NhcnkuICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICBGb3IgbW9yZSBkZXRhaWxzIG9uIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHksICAgICAgICAgICAqLworICAgICAgLyogICAgICAgcmVmZXIgdG8gZnVuY3Rpb24gIkxMX0FEQ19Jc0FjdGl2ZUZsYWdfQ0NSRFkoKSIuICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmKChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRUQpICAgICAgICAgfHwKKyAgICAgICAgIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRURfQkFDS1dBUkQpICApCisgICAgICB7CisgICAgICAgIC8qIFNlcXVlbmNlciBzZXQgdG8gbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBTZXQgdGhlIGNoYW5uZWwgYnkgZW5hYmxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0ZmllbGQuICAgICAgICAgICAgKi8KKyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaEFkZChoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNlcXVlbmNlciBzZXQgdG8gZnVsbHkgY29uZmlndXJhYmxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBTZXQgdGhlIGNoYW5uZWwgYnkgZW50ZXJpbmcgaXQgaW50byB0aGUgc2VsZWN0ZWQgcmFuay4gICAgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIC8qIE1lbW9yaXplIHRoZSBjaGFubmVsIHNldCBpbnRvIHZhcmlhYmxlIGluIEhBTCBBREMgaGFuZGxlICovCisgICAgICAgIE1PRElGWV9SRUcoaGFkYy0+QURDR3JvdXBSZWd1bGFyU2VxdWVuY2VyUmFua3MsCisgICAgICAgICAgICAgICAgICAgQURDX0NIU0VMUl9TUTEgPDwgKHNDb25maWctPlJhbmsgJiAweDFGVUwpLAorICAgICAgICAgICAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnLT5DaGFubmVsKSA8PCAoc0NvbmZpZy0+UmFuayAmIDB4MUZVTCkpOworICAgICAgICAKKyAgICAgICAgLyogSWYgdGhlIHNlbGVjdGVkIHJhbmsgaXMgYmVsb3cgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCwgICovCisgICAgICAgIC8qIGFwcGx5IHRoZSBjb25maWd1cmF0aW9uIGluIEFEQyByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBOb3RlOiBPdGhlcndpc2UsIGNvbmZpZ3VyYXRpb24gaXMgbm90IGFwcGxpZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgVG8gYXBwbHkgaXQsIHBhcmFtZXRlcidOYnJPZkNvbnZlcnNpb24nIG11c3QgYmUgaW5jcmVhc2VkLiAgICovICAgICAgICAKKyAgICAgICAgaWYoKChzQ29uZmlnLT5SYW5rID4+IDJVTCkgKyAxVUwpIDw9IGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcyhoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+UmFuaywgc0NvbmZpZy0+Q2hhbm5lbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovCisgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCwgc0NvbmZpZy0+U2FtcGxpbmdUaW1lKTsKKyAgICAgIAorICAgICAgLyogTWFuYWdlbWVudCBvZiBpbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVnJlZkludC9UZW1wU2Vuc29yL1ZiYXQgKi8KKyAgICAgIC8qIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGVuYWJsZTogSWYgaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCwgICAgICovCisgICAgICAvKiBlbmFibGUgZGVkaWNhdGVkIGludGVybmFsIGJ1ZmZlcnMgYW5kIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogdGhlc2UgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aHMgY2FuIGJlIGRpc2FibGVkIHVzaW5nICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIEhBTF9BRENfRGVJbml0KCkgb3IgcmVtb3ZpbmcgdGhlIGNoYW5uZWwgZnJvbSBzZXF1ZW5jZXIgd2l0aCAgICovCisgICAgICAvKiAgICAgICBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICJSYW5rIi4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYoX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsID0gTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAgICAgICAKKyAgICAgICAgLyogSWYgdGhlIHJlcXVlc3RlZCBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gZW5hYmxlZCwgICAqLworICAgICAgICAvKiBieXBhc3MgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICgoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKSAmJiAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpID09IDBVTCkpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgICAgICAvKiBXYWl0IGxvb3AgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiAqLworICAgICAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgZXhjZWVkIDMyIGJpdHMgcmVnaXN0ZXIgY2FwYWNpdHkgYW5kIGhhbmRsZSBsb3cgZnJlcXVlbmN5LiAqLworICAgICAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAvIDEwVUwpICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpKTsKKyAgICAgICAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WQkFUKSAmJiAoKHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCAmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZCQVQpID09IDBVTCkpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVlJFRklOVCkgJiYgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UKSA9PSAwVUwpKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVndWxhciBzZXF1ZW5jZXIgY29uZmlndXJhdGlvbiAqLworICAgICAgLyogTm90ZTogQ2FzZSBvZiBzZXF1ZW5jZXIgc2V0IHRvIGZ1bGx5IGNvbmZpZ3VyYWJsZTogICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIFNlcXVlbmNlciByYW5rIGNhbm5vdCBiZSBkaXNhYmxlZCwgb25seSBhZmZlY3RlZCB0byAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICBhbm90aGVyIGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgVG8gcmVtb3ZlIGEgcmFuaywgdXNlIHBhcmFtZXRlciAnTmJyT2ZDb252ZXJzaW9uIi4gICAgICAgICAgICAgKi8KKyAgICAgIGlmKChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRUQpICAgICAgICAgfHwKKyAgICAgICAgIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9TRVFfRklYRURfQkFDS1dBUkQpICApCisgICAgICB7CisgICAgICAgIC8qIFNlcXVlbmNlciBzZXQgdG8gbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBSZXNldCB0aGUgY2hhbm5lbCBieSBkaXNhYmxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYml0ZmllbGQuICAgICAgICAgKi8KKyAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaFJlbShoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLiAgKi8KKyAgICAgIC8qIElmIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQsIGVuYWJsZSBkZWRpY2F0ZWQgaW50ZXJuYWwgYnVmZmVycyBhbmQgICAgKi8KKyAgICAgIC8qIHBhdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmKF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoc0NvbmZpZy0+Q2hhbm5lbCkpCisgICAgICB7CisgICAgICAgIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCA9IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwgfkxMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgJiB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkKKyAgICAgICAgeworICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLCB+TExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCAmIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIH5MTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UICYgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIElmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLCBubyB1cGRhdGUgb24gcmVndWxhciAgICAgICAqLworICAvKiBjaGFubmVsIGNvdWxkIGJlIGRvbmUgb24gbmVpdGhlciBvZiB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KKyAgLyogcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZy4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzZWxlY3RlZCBhbmFsb2cgd2F0Y2hkb2csIHN1Y2Nlc3NpdmUgIAorICAqICAgICAgICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19BbmFsb2dXREdDb25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcgCisgICogICAgICAgICB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYiLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY2FuIGJlIG1vZGlmaWVkCisgICogICAgICAgICB3aGlsZSBBREMgY29udmVyc2lvbiBpcyBvbiBnb2luZy4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgc29tZSBjb25zdHJhaW50cyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudDoKKyAgKiAgICAgICAgIHRoZSBwcm9ncmFtbWVkIHRocmVzaG9sZCB2YWx1ZXMgYXJlIGVmZmVjdGl2ZSBmcm9tIHRoZSBuZXh0CisgICogICAgICAgICBBREMgRU9DIChlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uKS4KKyAgKiAgICAgICAgIENvbnNpZGVyaW5nIHRoYXQgcmVnaXN0ZXJzIHdyaXRlIGRlbGF5IG1heSBoYXBwZW4gZHVlIHRvCisgICogICAgICAgICBidXMgYWN0aXZpdHksIHRoaXMgbWlnaHQgY2F1c2UgYW4gdW5jZXJ0YWludHkgb24gdGhlCisgICogICAgICAgICBlZmZlY3RpdmUgdGltaW5nIG9mIHRoZSBuZXcgcHJvZ3JhbW1lZCB0aHJlc2hvbGQgdmFsdWVzLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gQW5hbG9nV0RHQ29uZmlnIFN0cnVjdHVyZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYqIEFuYWxvZ1dER0NvbmZpZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkOworICB1aW50MzJfdCB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTlVNQkVSKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTU9ERShBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShBbmFsb2dXREdDb25maWctPklUTW9kZSkpOworICAKKyAgaWYoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUgPT0gQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsKSk7CisgIH0KKyAgCisgIC8qIFZlcmlmeSB0aHJlc2hvbGRzIHJhbmdlICovCisgIGlmIChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKQorICB7CisgICAgLyogQ2FzZSBvZiBvdmVyc2FtcGxpbmcgZW5hYmxlZDogZGVwZW5kaW5nIG9uIHJhdGlvIGFuZCBzaGlmdCBjb25maWd1cmF0aW9uLAorICAgICAgIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGNhbiBiZSBoaWdoZXIgdGhhbiBBREMgcmVzb2x1dGlvbi4KKyAgICAgICBWZXJpZnkgaWYgdGhyZXNob2xkcyBhcmUgd2l0aGluIG1heGltdW0gdGhyZXNob2xkcyByYW5nZS4gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19SRVNPTFVUSU9OXzEyQiwgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfUkVTT0xVVElPTl8xMkIsIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVmVyaWZ5IGlmIHRocmVzaG9sZHMgYXJlIHdpdGhpbiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIEFuYWxvZ1dER0NvbmZpZy0+TG93VGhyZXNob2xkKSk7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogQW5hbG9nIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZihBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18xKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgYW5hbG9nIHdhdGNoZG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBTZXQgdGhlIGFuYWxvZyB3YXRjaGRvZyBlbmFibGUgbW9kZTogb25lIG9yIG92ZXJhbGwgZ3JvdXAgb2YgICAgICAqLworICAgICAgLyogICAgY2hhbm5lbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHN3aXRjaChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChBbmFsb2dXREdDb25maWctPkNoYW5uZWwsIExMX0FEQ19HUk9VUF9SRUdVTEFSKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHOgorICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLCBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgZGVmYXVsdDogLyogQURDX0FOQUxPR1dBVENIRE9HX05PTkUgKi8KKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwgTExfQURDX0FXRF9ESVNBQkxFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogVXBkYXRlIHN0YXRlLCBjbGVhciBwcmV2aW91cyByZXN1bHQgcmVsYXRlZCB0byBBV0QxICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAqLworICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovCisgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8KKyAgICAgIC8qIChpbiBjYXNlIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykuICAgICAgICAgICAgICAgICAqLworICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICB7CisgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBvciBBRENfQU5BTE9HV0FUQ0hET0dfMyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2goQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUc6CisgICAgICAgICAgLyogVXBkYXRlIEFXRCBieSBiaXRmaWVsZCB0byBrZWVwIHRoZSBwb3NzaWJpbGl0eSB0byBtb25pdG9yICAgICAgICAqLworICAgICAgICAgIC8qIHNldmVyYWwgY2hhbm5lbHMgYnkgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5BV0QyQ1IsICgxVUwgPDwgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwgKDFVTCA8PCBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsKSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLCBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OiAvKiBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAqLworICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIsIExMX0FEQ19BV0RfRElTQUJMRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18yKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgc3RhdGUsIGNsZWFyIHByZXZpb3VzIHJlc3VsdCByZWxhdGVkIHRvIEFXRDIgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDIpOworICAgICAgICAKKyAgICAgICAgLyogQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nICovCisgICAgICAgIC8qIE5vdGU6IEZsYWcgY2xlYXJlZCBDbGVhciB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnIHRvIGJlIHJlYWR5ICAqLworICAgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8KKyAgICAgICAgLyogKGluIGNhc2UgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKS4gICAgICAgICAgICAgICAgICovCisgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIAorICAgICAgICAvKiBDb25maWd1cmUgQURDIGFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaWYoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDIoaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgc3RhdGUsIGNsZWFyIHByZXZpb3VzIHJlc3VsdCByZWxhdGVkIHRvIEFXRDMgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0FXRDMpOworICAgICAgICAKKyAgICAgICAgLyogQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nICovCisgICAgICAgIC8qIE5vdGU6IEZsYWcgY2xlYXJlZCBDbGVhciB0aGUgQURDIEFuYWxvZyB3YXRjaGRvZyBmbGFnIHRvIGJlIHJlYWR5ICAqLworICAgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8KKyAgICAgICAgLyogKGluIGNhc2UgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKS4gICAgICAgICAgICAgICAgICovCisgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMyhoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIAorICAgICAgICAvKiBDb25maWd1cmUgQURDIGFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaWYoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUgPT0gRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDMoaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfQVdEMyhoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgIH0KKyAgICAKKyAgLyogQW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiAqLworICBpZihBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyID09IEFEQ19BTkFMT0dXQVRDSERPR18xKQorICB7CisgICAgLyogU2hpZnQgdGhlIG9mZnNldCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uOiAgICAgICAgKi8KKyAgICAvKiBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgICAqLworICAgIC8qIGFyZSBzZXQgdG8gMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICAgIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkID0gQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihoYWRjLCBBbmFsb2dXREdDb25maWctPkhpZ2hUaHJlc2hvbGQpOworICAgIHRtcEFXRExvd1RocmVzaG9sZFNoaWZ0ZWQgID0gQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihoYWRjLCBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCk7CisgIH0KKyAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBhbmQgQURDX0FOQUxPR1dBVENIRE9HXzMgKi8KKyAgZWxzZQorICB7CisgICAgLyogTm8gbmVlZCB0byBzaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb246ICovCisgICAgLyogVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpICAgKi8KKyAgICAvKiBhcmUgc2V0IHRvIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkID0gQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkOworICAgIHRtcEFXRExvd1RocmVzaG9sZFNoaWZ0ZWQgID0gQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQ7CisgIH0KKyAgCisgIC8qIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgdmFsdWUgb2YgYm90aCB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdyAqLworICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzKGhhZGMtPkluc3RhbmNlLCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLCB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZCwgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZCk7CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBzdGF0ZSBhbmQgZXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgIAorICAgIHBlcmlwaGVyYWwuCisgICAgICAoKykgQ2hlY2sgdGhlIEFEQyBzdGF0ZQorICAgICAgKCspIENoZWNrIHRoZSBBREMgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFEQyBzdGF0ZSBtYWNoaW5lIGlzIG1hbmFnZWQgYnkgYml0ZmllbGRzLCBBREMgc3RhdHVzIG11c3QgYmUgCisgICogICAgICAgICBjb21wYXJlZCB3aXRoIHN0YXRlcyBiaXRzLgorICAqICAgICAgICAgRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkgIgorICAqICAgICAgICAgICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEFEQyBoYW5kbGUgc3RhdGUgKGJpdGZpZWxkIG9uIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFN0YXRlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUmV0dXJuIEFEQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhhZGMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgQURDIGVycm9yIGNvZGUgKGJpdGZpZWxkIG9uIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgcmV0dXJuIGhhZGMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9GdW5jdGlvbnMgQURDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uLgorICAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIGNvbnZlcnNpb25zIG11c3QgYmUKKyAgKiAgICAgICAgIHN0b3BwZWQgdG8gZGlzYWJsZSB0aGUgQURDLgorICAqIEBwYXJhbSAgaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogVmVyaWZpY2F0aW9uIGlmIEFEQyBpcyBub3QgYWxyZWFkeSBzdG9wcGVkIG9uIHJlZ3VsYXIgZ3JvdXAgdG8gYnlwYXNzICAgICovCisgIC8qIHRoaXMgZnVuY3Rpb24gaWYgbm90IG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpCisgIHsKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIHNldCBBRFNUUCBvbmx5IHdoZW4gQURTVEFSVD0xIGFuZCBBRERJUz0wICovCisgICAgaWYgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgeworICAgICAgLyogU3RvcCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgLyogV2FpdCBmb3IgY29udmVyc2lvbiBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgICAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIHdoaWxlKChoYWRjLT5JbnN0YW5jZS0+Q1IgJiBBRENfQ1JfQURTVEFSVCkgIT0gMFVMKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19TVE9QX0NPTlZFUlNJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgbXVzdCBiZSBkaXNhYmxlZAorICAqICAgICAgICAgYW5kIHZvbHRhZ2UgcmVndWxhdG9yIG11c3QgYmUgZW5hYmxlZCAoZG9uZSBpbnRvIEhBTF9BRENfSW5pdCgpKS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0VuYWJsZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICAKKyAgLyogQURDIGVuYWJsZSBhbmQgd2FpdCBmb3IgQURDIHJlYWR5IChpbiBjYXNlIG9mIEFEQyBpcyBkaXNhYmxlZCBvciAgICAgICAgICovCisgIC8qIGVuYWJsaW5nIHBoYXNlIG5vdCB5ZXQgY29tcGxldGVkOiBmbGFnIEFEQyByZWFkeSBub3QgeWV0IHNldCkuICAgICAgICAgICAqLworICAvKiBUaW1lb3V0IGltcGxlbWVudGVkIHRvIG5vdCBiZSBzdHVjayBpZiBBREMgY2Fubm90IGJlIGVuYWJsZWQgKHBvc3NpYmxlICAgKi8KKyAgLyogY2F1c2VzOiBBREMgY2xvY2sgbm90IHJ1bm5pbmcsIC4uLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjb25kaXRpb25zIHRvIGVuYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIChBRENfQ1JfQURDQUwgfCBBRENfQ1JfQURTVFAgfCBBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9BRERJUyB8IEFEQ19DUl9BREVOKSkgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgTExfQURDX0VuYWJsZShoYWRjLT5JbnN0YW5jZSk7CisgICAgCisgICAgLyogSWYgbG93IHBvd2VyIG1vZGUgQXV0b1Bvd2VyT2ZmIGlzIGVuYWJsZWQsIHBvd2VyLW9uL29mZiBwaGFzZXMgYXJlICAgICAqLworICAgIC8qIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlIGFuZCBmbGFnIEFEQyByZWFkeSBpcyBub3Qgc2V0LiAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9Qb3dlck9mZiAhPSBFTkFCTEUpCisgICAgeworICAgICAgLyogV2FpdCBmb3IgQURDIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAKKyAgICAgIHdoaWxlKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19SRFkpID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogIElmIEFERU4gYml0IGlzIHNldCBsZXNzIHRoYW4gNCBBREMgY2xvY2sgY3ljbGVzIGFmdGVyIHRoZSBBRENBTCBiaXQgCisgICAgICAgICAgICBoYXMgYmVlbiBjbGVhcmVkIChhZnRlciBhIGNhbGlicmF0aW9uKSwgQURFTiBiaXQgaXMgcmVzZXQgYnkgdGhlIAorICAgICAgICAgICAgY2FsaWJyYXRpb24gbG9naWMuCisgICAgICAgICAgICBUaGUgd29ya2Fyb3VuZCBpcyB0byBjb250aW51ZSBzZXR0aW5nIEFERU4gdW50aWwgQURSRFkgaXMgYmVjb21lcyAxLgorICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBBRENfRU5BQkxFX1RJTUVPVVQgaXMgZGVmaW5lZCB0byBlbmNvbXBhc3MgdGhpcworICAgICAgICAgICAgNCBBREMgY2xvY2sgY3ljbGUgZHVyYXRpb24gKi8KKyAgICAgICAgLyogTm90ZTogVGVzdCBvZiBBREMgZW5hYmxlZCByZXF1aXJlZCBkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludCB0byAgICAgKi8KKyAgICAgICAgLyogICAgICAgbm90IGVuYWJsZSBBREMgaWYgYWxyZWFkeSBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX0VuYWJsZShoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19FTkFCTEVfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgY29udmVyc2lvbnMgbXVzdCBiZQorICAqICAgICAgICAgc3RvcHBlZC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0Rpc2FibGUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgY29uc3QgdWludDMyX3QgdG1wX2FkY19pc19kaXNhYmxlX29uX2dvaW5nID0gTExfQURDX0lzRGlzYWJsZU9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICAKKyAgLyogVmVyaWZpY2F0aW9uIGlmIEFEQyBpcyBub3QgYWxyZWFkeSBkaXNhYmxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGU6IGZvcmJpZGRlbiB0byBkaXNhYmxlIEFEQyAoc2V0IGJpdCBBRENfQ1JfQURESVMpIGlmIEFEQyBpcyBhbHJlYWR5ICAqLworICAvKiAgICAgICBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKCAgIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpCisgICAgICAmJiAodG1wX2FkY19pc19kaXNhYmxlX29uX2dvaW5nID09IDBVTCkKKyAgICAgKQorICB7CisgICAgLyogQ2hlY2sgaWYgY29uZGl0aW9ucyB0byBkaXNhYmxlIHRoZSBBREMgYXJlIGZ1bGZpbGxlZCAqLworICAgIGlmKChoYWRjLT5JbnN0YW5jZS0+Q1IgJiAoQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURFTikpID09IEFEQ19DUl9BREVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICBMTF9BRENfRGlzYWJsZShoYWRjLT5JbnN0YW5jZSk7CisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9TTVAgfCBBRENfRkxBR19SRFkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAvKiBHZXQgdGljayBjb3VudCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgCisgICAgd2hpbGUoKGhhZGMtPkluc3RhbmNlLT5DUiAmIEFEQ19DUl9BREVOKSAhPSAwVUwpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQURDX0RJU0FCTEVfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBSZXR1cm4gSEFMIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4gCisgICogQHBhcmFtIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjID0gKCBBRENfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovCisgIGlmICgoaGFkYy0+U3RhdGUgJiAoSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCB8IEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKSkgPT0gMFVMKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgICAgCisgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCByZWd1bGFyICAgICAqLworICAgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIsIGNvbnRpbnVvdXMgbW9kZSBvciBzY2FuIHNlcXVlbmNlIG9uIGdvaW5nICAgICAgICAgKi8KKyAgICAvKiB0byBkaXNhYmxlIGludGVycnVwdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoICAgKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAgICYmIChoYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSA9PSBESVNBQkxFKQorICAgICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKSApCisgICAgICB7CisgICAgICAgIC8qIEFsbG93ZWQgdG8gbW9kaWZ5IGJpdHMgQURDX0lUX0VPQy9BRENfSVRfRU9TIG9ubHkgaWYgYml0ICAgICAgICAgICAqLworICAgICAgICAvKiBBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNpbmdsZSBjb252ZXJzaW9uIGludGVycnVwdCBvbiBncm91cCByZWd1bGFyICovCisgICAgICAgICAgLyogTm90ZTogT3ZlcnJ1biBpbnRlcnJ1cHQgd2FzIGVuYWJsZWQgd2l0aCBFT0MgaW50ZXJydXB0IGluICAgICAgICAqLworICAgICAgICAgIC8qIEhBTF9TdGFydF9JVCgpLCBidXQgaXMgbm90IGRpc2FibGVkIGhlcmUgYmVjYXVzZSBjYW4gYmUgdXNlZCAgICAgKi8KKyAgICAgICAgICAvKiBieSBvdmVycnVuIElSUSBwcm9jZXNzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENoYW5nZSBBREMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgICAgCisgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSU5URVJOQUwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UgLyogRE1BIGFuZC1vciBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCAqLworICB7CisgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBDYWxsIEhBTCBBREMgRXJyb3IgQ2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENhbGwgQURDIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEFEQ19ETUFIYWxmQ29udkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFJldHJpZXZlIEFEQyBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBjdXJyZW50IERNQSBoYW5kbGUgKi8KKyAgQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMgPSAoIEFEQ19IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIAorICAvKiBIYWxmIGNvbnZlcnNpb24gY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhhZGMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgSEFMX0FEQ19Db252SGFsZkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQURDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjID0gKCBBRENfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogU2V0IEFEQyBzdGF0ZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7CisgIAorICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gRE1BIGVycm9yICovCisgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0RNQSk7CisgIAorICAvKiBFcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaGFkYy0+RXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9hZGNfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX2FkY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDE3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9hZGNfZXguYwpAQCAtMCwwICsxLDM1NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfYWRjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0b3IgKEFEQykKKyAgKiAgICAgICAgICBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIE9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBDYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgKysrIEFEQyBhdXRvbWF0aWMgc2VsZi1jYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgKysrIENhbGlicmF0aW9uIGZhY3RvcnMgZ2V0IG9yIHNldAorICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZ2VuZXJpYyBmdW5jdGlvbnMpIGFyZSBhdmFpbGFibGUgaW4gZmlsZSAKKyAgKiAgICAgICAgICAic3RtMzJnMHh4X2hhbF9hZGMuYyIuCisgICoKKyAgQHZlcmJhdGltCisgIFsuLl0gCisgIChAKSBTZWN0aW9ucyAiQURDIHBlcmlwaGVyYWwgZmVhdHVyZXMiIGFuZCAiSG93IHRvIHVzZSB0aGlzIGRyaXZlciIgYXJlCisgICAgICBhdmFpbGFibGUgaW4gZmlsZSBvZiBnZW5lcmljIGZ1bmN0aW9ucyAic3RtMzJnMHh4X2hhbF9hZGMuYyIuCisgIFsuLl0KKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXggQURDRXgKKyAgKiBAYnJpZWYgQURDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9Db25zdGFudHMgQURDIEV4dGVuZGVkIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRml4ZWQgdGltZW91dCB2YWx1ZSBmb3IgQURDIGNhbGlicmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBtYXhpbXVtIHJhdGlvIGJldHdlZW4gQURDICAgICovCisvKiBhbmQgQ1BVIGNsb2NrIGZyZXF1ZW5jaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRXhhbXBsZSBvZiBwcm9maWxlIGxvdyBmcmVxdWVuY3kgOiBBREMgZnJlcXVlbmN5IGF0IDMxLjI1a0h6IChBREMgY2xvY2sgICAgKi8KKy8qIHNvdXJjZSBQTEwgOE1IeiwgQURDIGNsb2NrIHByZXNjYWxlciAyNTYpLCBDUFUgZnJlcXVlbmN5IDUyTUh6LiAgICAgICAgICAgICovCisvKiBDYWxpYnJhdGlvbiB0aW1lIG1heCA9IDExNiAvIGZBREMgKHJlZmVyIHRvIGRhdGFzaGVldCkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgPSAxOTMgMDI0IENQVSBjeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NBTElCUkFUSU9OX1RJTUVPVVQgICAgICAgICAoMTkzMDI0VUwpICAgLyohPCBBREMgY2FsaWJyYXRpb24gdGltZS1vdXQgdmFsdWUgKHVuaXQ6IENQVSBjeWNsZXMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEFEQyBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgIAorICAgICAgKCspIFBlcmZvcm0gdGhlIEFEQyBzZWxmLWNhbGlicmF0aW9uLgorICAgICAgKCspIEdldCBjYWxpYnJhdGlvbiBmYWN0b3JzLgorICAgICAgKCspIFNldCBjYWxpYnJhdGlvbiBmYWN0b3JzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYW4gQURDIGF1dG9tYXRpYyBzZWxmLWNhbGlicmF0aW9uCisgICogICAgICAgICBDYWxpYnJhdGlvbiBwcmVyZXF1aXNpdGU6IEFEQyBtdXN0IGJlIGRpc2FibGVkIChleGVjdXRlIHRoaXMKKyAgKiAgICAgICAgIGZ1bmN0aW9uIGJlZm9yZSBIQUxfQURDX1N0YXJ0KCkgb3IgYWZ0ZXIgSEFMX0FEQ19TdG9wKCkgKS4KKyAgKiBAbm90ZSAgIENhbGlicmF0aW9uIGZhY3RvciBjYW4gYmUgcmVhZCBhZnRlciBjYWxpYnJhdGlvbiwgdXNpbmcgZnVuY3Rpb24KKyAgKiAgICAgICAgIEhBTF9BRENfR2V0VmFsdWUoKSAodmFsdWUgb24gNyBiaXRzOiBmcm9tIERSWzY7MF0pLgorICAqIEBwYXJhbSAgaGFkYyAgICAgICBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfQ2FsaWJyYXRpb25fU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICBfX0lPIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9IDBVTDsKKyAgdWludDMyX3QgYmFja3VwX3NldHRpbmdfYWRjX2RtYV90cmFuc2ZlcjsgLyogTm90ZTogVmFyaWFibGUgbm90IGRlY2xhcmVkIGFzIHZvbGF0aWxlIGJlY2F1c2UgcmVnaXN0ZXIgcmVhZCBpcyBhbHJlYWR5IGRlY2xhcmVkIGFzIHZvbGF0aWxlICovCisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQuICovCisgIAorICAvKiBEaXNhYmxlIHRoZSBBREMgKGlmIG5vdCBhbHJlYWR5IGRpc2FibGVkKSAqLworICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAKKyAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIgcmVxdWVzdCBkdXJpbmcgY2FsaWJyYXRpb24gKi8KKyAgICAvKiBOb3RlOiBTcGVjaWZpY2l0eSBvZiB0aGlzIFNUTTMyIHNlcmllOiBDYWxpYnJhdGlvbiBmYWN0b3IgaXMgICAgICAgICAgICovCisgICAgLyogICAgICAgYXZhaWxhYmxlIGluIGRhdGEgcmVnaXN0ZXIgYW5kIGFsc28gdHJhbnNmZXJlZCBieSBETUEuICAgICAgICAgICAqLworICAgIC8qICAgICAgIFRvIG5vdCBpbnNlcnQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBhbW9uZyBBREMgY29udmVyc2lvbiBkYXRhICAgKi8KKyAgICAvKiAgICAgICBpbiBhcnJheSB2YXJpYWJsZSwgRE1BIHRyYW5zZmVyIG11c3QgYmUgZGlzYWJsZWQgZHVyaW5nICAgICAgICAgICovCisgICAgLyogICAgICAgY2FsaWJyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGJhY2t1cF9zZXR0aW5nX2FkY19kbWFfdHJhbnNmZXIgPSBSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEsIEFEQ19DRkdSMV9ETUFFTiB8IEFEQ19DRkdSMV9ETUFDRkcpOworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjEsIEFEQ19DRkdSMV9ETUFFTiB8IEFEQ19DRkdSMV9ETUFDRkcpOworICAgIAorICAgIC8qIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiAqLworICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfQURDQUwpOworICAgIAorICAgIC8qIFdhaXQgZm9yIGNhbGlicmF0aW9uIGNvbXBsZXRpb24gKi8KKyAgICB3aGlsZShMTF9BRENfSXNDYWxpYnJhdGlvbk9uR29pbmcoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkKKyAgICB7CisgICAgICB3YWl0X2xvb3BfaW5kZXgrKzsKKyAgICAgIGlmICh3YWl0X2xvb3BfaW5kZXggPj0gQURDX0NBTElCUkFUSU9OX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogUmVzdG9yZSBBREMgRE1BIHRyYW5zZmVyIHJlcXVlc3QgYWZ0ZXIgY2FsaWJyYXRpb24gKi8KKyAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMSwgYmFja3VwX3NldHRpbmdfYWRjX2RtYV90cmFuc2Zlcik7CisgICAgCisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAKKyAgICAvKiBOb3RlOiBObyBuZWVkIHRvIHVwZGF0ZSB2YXJpYWJsZSAidG1wX2hhbF9zdGF0dXMiIGhlcmU6IGFscmVhZHkgc2V0ICAgICovCisgICAgLyogICAgICAgdG8gc3RhdGUgIkhBTF9FUlJPUiIgYnkgZnVuY3Rpb24gZGlzYWJsaW5nIHRoZSBBREMuICAgICAgICAgICAgICAqLworICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuCisgICogQHJldHZhbCBDYWxpYnJhdGlvbiB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9BRENFeF9DYWxpYnJhdGlvbl9HZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIGNhbGlicmF0aW9uIHZhbHVlICovCisgIHJldHVybiAoKGhhZGMtPkluc3RhbmNlLT5DQUxGQUNUKSAmIDB4MDAwMDAwN0ZVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNhbGlicmF0aW9uIGZhY3RvciB0byBvdmVyd3JpdGUgYXV0b21hdGljIGNvbnZlcnNpb24gcmVzdWx0LgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCBhbmQgbm8gY29udmVyc2lvbiBpcyBvbmdvaW5nLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsaWJyYXRpb25GYWN0b3IgQ2FsaWJyYXRpb24gZmFjdG9yIChjb2RlZCBvbiA3IGJpdHMgbWF4aW11bSkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1NldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3RvcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DQUxGQUNUKENhbGlicmF0aW9uRmFjdG9yKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogVmVyaWZpY2F0aW9uIG9mIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNhbGlicmF0aW9uICAgICovCisgIC8qIGZhY3RvcnMgcmVnaXN0ZXI6IEFEQyBtdXN0IGJlIGVuYWJsZWQsIG5vIGNvbnZlcnNpb24gb24gZ29pbmcuICAgICAgICAgICAqLworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIAorICBpZiAoICAgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkKKyAgICAgICYmICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9PSAwVUwpCisgICAgICkKKyAgeworICAgIGhhZGMtPkluc3RhbmNlLT5DQUxGQUNUICY9IH5BRENfQ0FMRkFDVF9DQUxGQUNUOworICAgIGhhZGMtPkluc3RhbmNlLT5DQUxGQUNUIHw9IENhbGlicmF0aW9uRmFjdG9yOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAvKiBVcGRhdGUgQURDIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworICAKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBPZiBTYW1wbGluZyBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0NoYW5uZWxDb25maWdSZWFkeUNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9DaGFubmVsQ29uZmlnUmVhZHlDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBREMgdm9sdGFnZSByZWd1bGF0b3IuCisgICogQG5vdGUgICBEaXNhYmxpbmcgdm9sdGFnZSByZWd1bGF0b3IgYWxsb3dzIHRvIHNhdmUgcG93ZXIuIFRoaXMgb3BlcmF0aW9uIGNhbgorICAqICAgICAgICAgYmUgY2FycmllZCBvdXQgb25seSB3aGVuIEFEQyBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIFRvIGVuYWJsZSBhZ2FpbiB0aGUgdm9sdGFnZSByZWd1bGF0b3IsIHRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvIAorICAqICAgICAgICAgcmVzb3J0IHRvIEhBTF9BRENfSW5pdCgpIEFQSS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRGlzYWJsZVZvbHRhZ2VSZWd1bGF0b3IoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogQURDIG11c3QgYmUgQURDIGRpc2FibGVkICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yKGhhZGMtPkluc3RhbmNlKTsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2NlYy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfY2VjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMzViNgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2NlYy5jCkBAIC0wLDAgKzEsMTAwMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfY2VjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENFQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBIaWdoIERlZmluaXRpb24gTXVsdGltZWRpYSBJbnRlcmZhY2UKKyAgKiAgICAgICAgICBDb25zdW1lciBFbGVjdHJvbmljcyBDb250cm9sIFBlcmlwaGVyYWwgKENFQykuCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9uCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9uCisgICoKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgQ0VDIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93OgorCisgICAgKCMpIERlY2xhcmUgYSBDRUNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBDRUMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9DRUNfTXNwSW5pdCAoKUFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIENFQyBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgjIykgQ0VDIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBDRUMgR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgQ0VDIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX0NFQ19UcmFuc21pdF9JVCgpCisgICAgICAgICAgICAgYW5kIEhBTF9DRUNfUmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBDRUMgaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIENFQyBJUlEgaGFuZGxlLgorICAgICAgICAgICAgKCsrKykgVGhlIHNwZWNpZmljIENFQyBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgICAgICBfX0hBTF9DRUNfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX0NFQ19ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdAorICAgICAgICAgICAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKworICAgICgjKSBQcm9ncmFtIHRoZSBTaWduYWwgRnJlZSBUaW1lIChTRlQpIGFuZCBTRlQgb3B0aW9uLCBUb2xlcmFuY2UsIHJlY2VwdGlvbiBzdG9wIGluCisgICAgICAgIGluIGNhc2Ugb2YgQml0IFJpc2luZyBFcnJvciwgRXJyb3ItQml0IGdlbmVyYXRpb24gY29uZGl0aW9ucywgZGV2aWNlIGxvZ2ljYWwKKyAgICAgICAgYWRkcmVzcyBhbmQgTGlzdGVuIG1vZGUgaW4gdGhlIGhjZWMgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgQ0VDIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfQ0VDX0luaXQoKSBBUEkuCisKKyAgWy4uXQorICAgIChAKSBUaGlzIEFQSSAoSEFMX0NFQ19Jbml0KCkpIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIChHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21lZCBIQUxfQ0VDX01zcEluaXQoKSBBUEkuCisgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfQ0VDX1JlZ2lzdGVyQ2FsbGJhY2soKSBvciBIQUxfQ0VDX1JlZ2lzdGVyWFhYQ2FsbGJhY2soKQorICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgRnVuY3Rpb24gQHJlZiBIQUxfQ0VDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgIDogVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBDRUMgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogQ0VDIE1zcERlSW5pdC4KKyAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgIEZvciBzcGVjaWZpYyBjYWxsYmFjayBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzCisgIEByZWYgSEFMX0NFQ19SZWdpc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisKKyAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0NFQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgIHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX0NFQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICA6IFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogQ0VDIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IENFQyBNc3BEZUluaXQuCisKKyAgRm9yIGNhbGxiYWNrIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2sgdXNlIGRlZGljYXRlZCB1bnJlZ2lzdGVyIGNhbGxiYWNrIDoKKyAgQHJlZiBIQUxfQ0VDX1VuUmVnaXN0ZXJSeENwbHRDYWxsYmFjaygpLgorCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9DRUNfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfQ0VDX1NUQVRFX1JFU0VUCisgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucyA6CisgIGV4YW1wbGVzIEByZWYgSEFMX0NFQ19UeENwbHRDYWxsYmFjaygpICwgQHJlZiBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKCkuCisgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbiBpbiB0aGUgQHJlZiBIQUxfQ0VDX0luaXQoKS8gQHJlZiBIQUxfQ0VDX0RlSW5pdCgpIG9ubHkgd2hlbgorICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICBpZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0NFQ19Jbml0KCkgLyBAcmVmIEhBTF9DRUNfRGVJbml0KCkKKyAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQorCisgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX0NFQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgaW4gSEFMX0NFQ19TVEFURV9SRUFEWSBvciBIQUxfQ0VDX1NUQVRFX1JFU0VUIHN0YXRlLAorICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgIHVzaW5nIEByZWYgSEFMX0NFQ19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQ0VDX0RlSW5pdCgpCisgIG9yIEByZWYgSEFMX0NFQ19Jbml0KCkgZnVuY3Rpb24uCisKKyAgV2hlbiB0aGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ0VDIENFQworICAqIEBicmllZiBIQUwgQ0VDIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworI2lmZGVmIEhBTF9DRUNfTU9EVUxFX0VOQUJMRUQKKyNpZiBkZWZpbmVkIChDRUMpCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDRUNfUHJpdmF0ZV9Db25zdGFudHMgQ0VDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ0VDX1ByaXZhdGVfRnVuY3Rpb25zIENFQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zIENFQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBDRUMKKyAgICAgICgrKSBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjb25maWd1cmVkOgorICAgICAgICAoKyspIFNpZ25hbEZyZWVUaW1lCisgICAgICAgICgrKykgVG9sZXJhbmNlCisgICAgICAgICgrKykgQlJFUnhTdG9wICAgICAgICAgICAgICAgICAoUlggc3RvcHBlZCBvciBub3QgdXBvbiBCaXQgUmlzaW5nIEVycm9yKQorICAgICAgICAoKyspIEJSRUVycm9yQml0R2VuICAgICAgICAgICAgKEVycm9yLUJpdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgQml0IFJpc2luZyBFcnJvcikKKyAgICAgICAgKCsrKSBMQlBFRXJyb3JCaXRHZW4gICAgICAgICAgIChFcnJvci1CaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIExvbmcgQml0IFBlcmlvZCBFcnJvcikKKyAgICAgICAgKCsrKSBCcm9hZGNhc3RNc2dOb0Vycm9yQml0R2VuIChFcnJvci1iaXQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGJyb2FkY2FzdCBtZXNzYWdlIGVycm9yKQorICAgICAgICAoKyspIFNpZ25hbEZyZWVUaW1lT3B0aW9uICAgICAgKFNGVCBUaW1lciBzdGFydCBkZWZpbml0aW9uKQorICAgICAgICAoKyspIE93bkFkZHJlc3MgICAgICAgICAgICAgICAgKENFQyBkZXZpY2UgYWRkcmVzcykKKyAgICAgICAgKCsrKSBMaXN0ZW5Nb2RlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgQ0VDIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENFQ19Jbml0VHlwZURlZiBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUgLgorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogQ2hlY2sgdGhlIENFQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoKGhjZWMgPT0gTlVMTCkgfHwgKGhjZWMtPkluaXQuUnhCdWZmZXIgPT0gTlVMTCkpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19BTExfSU5TVEFOQ0UoaGNlYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19TSUdOQUxGUkVFVElNRShoY2VjLT5Jbml0LlNpZ25hbEZyZWVUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19DRUNfVE9MRVJBTkNFKGhjZWMtPkluaXQuVG9sZXJhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19DRUNfQlJFUlhTVE9QKGhjZWMtPkluaXQuQlJFUnhTdG9wKSk7CisgIGFzc2VydF9wYXJhbShJU19DRUNfQlJFRVJST1JCSVRHRU4oaGNlYy0+SW5pdC5CUkVFcnJvckJpdEdlbikpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0xCUEVFUlJPUkJJVEdFTihoY2VjLT5Jbml0LkxCUEVFcnJvckJpdEdlbikpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0JST0FEQ0FTVEVSUk9SX05PX0VSUk9SQklUX0dFTkVSQVRJT04oaGNlYy0+SW5pdC5Ccm9hZGNhc3RNc2dOb0Vycm9yQml0R2VuKSk7CisgIGFzc2VydF9wYXJhbShJU19DRUNfU0ZUT1AoaGNlYy0+SW5pdC5TaWduYWxGcmVlVGltZU9wdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0xJU1RFTklOR19NT0RFKGhjZWMtPkluaXQuTGlzdGVuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ0VDX09XTl9BRERSRVNTKGhjZWMtPkluaXQuT3duQWRkcmVzcykpOworCisjaWYgKFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGNlYy0+Z1N0YXRlID09IEhBTF9DRUNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGNlYy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIGhjZWMtPlR4Q3BsdENhbGxiYWNrICA9IEhBTF9DRUNfVHhDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgKi8KKyAgICBoY2VjLT5SeENwbHRDYWxsYmFjayA9IEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoY2VjLT5FcnJvckNhbGxiYWNrID0gSEFMX0NFQ19FcnJvckNhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAqLworCisgICAgaWYgKGhjZWMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhjZWMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DRUNfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBoY2VjLT5Nc3BJbml0Q2FsbGJhY2soaGNlYyk7CisgIH0KKyNlbHNlCisgIGlmIChoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoY2VjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX0NFQ19Nc3BJbml0KGhjZWMpOworICB9CisjZW5kaWYgLyogVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfQ0VDX0RJU0FCTEUoaGNlYyk7CisKKyAgLyogV3JpdGUgdG8gQ0VDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgaGNlYy0+SW5zdGFuY2UtPkNGR1IgPSBoY2VjLT5Jbml0LlNpZ25hbEZyZWVUaW1lIHwgaGNlYy0+SW5pdC5Ub2xlcmFuY2UgfCBoY2VjLT5Jbml0LkJSRVJ4U3RvcCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoY2VjLT5Jbml0LkJSRUVycm9yQml0R2VuIHwgaGNlYy0+SW5pdC5MQlBFRXJyb3JCaXRHZW4gfCBoY2VjLT5Jbml0LkJyb2FkY2FzdE1zZ05vRXJyb3JCaXRHZW4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaGNlYy0+SW5pdC5TaWduYWxGcmVlVGltZU9wdGlvbiB8ICgodWludDMyX3QpKGhjZWMtPkluaXQuT3duQWRkcmVzcykgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoY2VjLT5Jbml0Lkxpc3Rlbk1vZGU7CisKKyAgLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgQ0VDIFRyYW5zbWlzc2lvbi9SZWNlcHRpb24gaW50ZXJydXB0cyBhcworICAgICogd2VsbCBhcyB0aGUgZm9sbG93aW5nIENFQyBUcmFuc21pc3Npb24vUmVjZXB0aW9uIEVycm9ycyBpbnRlcnJ1cHRzCisgICAgKiBSeCBCeXRlIFJlY2VpdmVkIElUCisgICAgKiBFbmQgb2YgUmVjZXB0aW9uIElUCisgICAgKiBSeCBvdmVycnVuCisgICAgKiBSeCBiaXQgcmlzaW5nIGVycm9yCisgICAgKiBSeCBzaG9ydCBiaXQgcGVyaW9kIGVycm9yCisgICAgKiBSeCBsb25nIGJpdCBwZXJpb2QgZXJyb3IKKyAgICAqIFJ4IG1pc3NpbmcgYWNrbm93bGVkZ2UKKyAgICAqIFR4IEJ5dGUgUmVxdWVzdCBJVAorICAgICogRW5kIG9mIFRyYW5zbWlzc2lvbiBJVAorICAgICogVHggTWlzc2luZyBBY2tub3dsZWRnZSBJVAorICAgICogVHgtRXJyb3IgSVQKKyAgICAqIFR4LUJ1ZmZlciBVbmRlcnJ1biBJVAorICAgICogVHggYXJiaXRyYXRpb24gbG9zdCAgICovCisgIF9fSEFMX0NFQ19FTkFCTEVfSVQoaGNlYywgQ0VDX0lUX1JYQlIgfCBDRUNfSVRfUlhFTkQgfCBDRUNfSUVSX1JYX0FMTF9FUlIgfCBDRUNfSVRfVFhCUiB8IENFQ19JVF9UWEVORCB8CisgICAgICAgICAgICAgICAgICAgICAgQ0VDX0lFUl9UWF9BTExfRVJSKTsKKworICAvKiBFbmFibGUgdGhlIENFQyBQZXJpcGhlcmFsICovCisgIF9fSEFMX0NFQ19FTkFCTEUoaGNlYyk7CisKKyAgaGNlYy0+RXJyb3JDb2RlID0gSEFMX0NFQ19FUlJPUl9OT05FOworICBoY2VjLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFQURZOworICBoY2VjLT5SeFN0YXRlID0gSEFMX0NFQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplcyB0aGUgQ0VDIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX0RlSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogQ2hlY2sgdGhlIENFQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNlYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DRUNfQUxMX0lOU1RBTkNFKGhjZWMtPkluc3RhbmNlKSk7CisKKyAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9CVVNZOworCisjaWYgKFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGNlYy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhjZWMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NFQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhjZWMtPk1zcERlSW5pdENhbGxiYWNrKGhjZWMpOworCisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfQ0VDX01zcERlSW5pdChoY2VjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0NFQ19ESVNBQkxFKGhjZWMpOworCisgIC8qIENsZWFyIEZsYWdzICovCisgIF9fSEFMX0NFQ19DTEVBUl9GTEFHKGhjZWMsIENFQ19GTEFHX1RYRU5EIHwgQ0VDX0ZMQUdfVFhCUiB8IENFQ19GTEFHX1JYQlIgfCBDRUNfRkxBR19SWEVORCB8IENFQ19JU1JfQUxMX0VSUk9SKTsKKworICAvKiBEaXNhYmxlIHRoZSBmb2xsb3dpbmcgQ0VDIFRyYW5zbWlzc2lvbi9SZWNlcHRpb24gaW50ZXJydXB0cyBhcworICAgICogd2VsbCBhcyB0aGUgZm9sbG93aW5nIENFQyBUcmFuc21pc3Npb24vUmVjZXB0aW9uIEVycm9ycyBpbnRlcnJ1cHRzCisgICAgKiBSeCBCeXRlIFJlY2VpdmVkIElUCisgICAgKiBFbmQgb2YgUmVjZXB0aW9uIElUCisgICAgKiBSeCBvdmVycnVuCisgICAgKiBSeCBiaXQgcmlzaW5nIGVycm9yCisgICAgKiBSeCBzaG9ydCBiaXQgcGVyaW9kIGVycm9yCisgICAgKiBSeCBsb25nIGJpdCBwZXJpb2QgZXJyb3IKKyAgICAqIFJ4IG1pc3NpbmcgYWNrbm93bGVkZ2UKKyAgICAqIFR4IEJ5dGUgUmVxdWVzdCBJVAorICAgICogRW5kIG9mIFRyYW5zbWlzc2lvbiBJVAorICAgICogVHggTWlzc2luZyBBY2tub3dsZWRnZSBJVAorICAgICogVHgtRXJyb3IgSVQKKyAgICAqIFR4LUJ1ZmZlciBVbmRlcnJ1biBJVAorICAgICogVHggYXJiaXRyYXRpb24gbG9zdCAgICovCisgIF9fSEFMX0NFQ19ESVNBQkxFX0lUKGhjZWMsIENFQ19JVF9SWEJSIHwgQ0VDX0lUX1JYRU5EIHwgQ0VDX0lFUl9SWF9BTExfRVJSIHwgQ0VDX0lUX1RYQlIgfCBDRUNfSVRfVFhFTkQgfAorICAgICAgICAgICAgICAgICAgICAgICBDRUNfSUVSX1RYX0FMTF9FUlIpOworCisgIGhjZWMtPkVycm9yQ29kZSA9IEhBTF9DRUNfRVJST1JfTk9ORTsKKyAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9SRVNFVDsKKyAgaGNlYy0+UnhTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhjZWMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgT3duIEFkZHJlc3Mgb2YgdGhlIENFQyBkZXZpY2UKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHBhcmFtICBDRUNfT3duQWRkcmVzcyBUaGUgQ0VDIG93biBhZGRyZXNzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NFQ19TZXREZXZpY2VBZGRyZXNzKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCB1aW50MTZfdCBDRUNfT3duQWRkcmVzcykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NFQ19PV05fQUREUkVTUyhDRUNfT3duQWRkcmVzcykpOworCisgIGlmICgoaGNlYy0+Z1N0YXRlID09IEhBTF9DRUNfU1RBVEVfUkVBRFkpICYmIChoY2VjLT5SeFN0YXRlID09IEhBTF9DRUNfU1RBVEVfUkVBRFkpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjZWMpOworCisgICAgaGNlYy0+Z1N0YXRlID0gSEFMX0NFQ19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NFQ19ESVNBQkxFKGhjZWMpOworCisgICAgaWYgKENFQ19Pd25BZGRyZXNzICE9IENFQ19PV05fQUREUkVTU19OT05FKQorICAgIHsKKyAgICAgIGhjZWMtPkluc3RhbmNlLT5DRkdSIHw9ICgodWludDMyX3QpQ0VDX093bkFkZHJlc3MgPDwgMTYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNlYy0+SW5zdGFuY2UtPkNGR1IgJj0gfihDRUNfQ0ZHUl9PQVIpOworICAgIH0KKworICAgIGhjZWMtPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVBRFk7CisgICAgaGNlYy0+RXJyb3JDb2RlID0gSEFMX0NFQ19FUlJPUl9OT05FOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2VjKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NFQ19FTkFCTEUoaGNlYyk7CisKKyAgICByZXR1cm4gIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIENFQyBNU1AgSW5pdAorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DRUNfTXNwSW5pdChDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNlYyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBDRUMgTVNQIERlSW5pdAorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DRUNfTXNwRGVJbml0KENFQ19IYW5kbGVUeXBlRGVmICpoY2VjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY2VjKTsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DRUNfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorI2lmIChVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIENFQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhjZWMgQ0VDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19UWF9DUExUX0NCX0lEIFR4IENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DRUNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfUmVnaXN0ZXJDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYywgSEFMX0NFQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDRUNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhjZWMtPkVycm9yQ29kZSB8PSBIQUxfQ0VDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhjZWMpOworCisgIGlmIChoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DRUNfVFhfQ1BMVF9DQl9JRCA6CisgICAgICAgIGhjZWMtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ0VDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGNlYy0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NFQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNlYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ0VDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjZWMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY2VjLT5FcnJvckNvZGUgfD0gSEFMX0NFQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DRUNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjZWMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NFQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY2VjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGNlYyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIENFQyBDYWxsYmFjaworICAqICAgICAgICAgQ0VDIGNhbGxhYmNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBoY2VjIHVhcnQgaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19UWF9DUExUX0NCX0lEIFR4IENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DRUNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NFQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfVW5SZWdpc3RlckNhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCBIQUxfQ0VDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhjZWMpOworCisgIGlmIChoY2VjLT5nU3RhdGUgPT0gSEFMX0NFQ19TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DRUNfVFhfQ1BMVF9DQl9JRCA6CisgICAgICAgIGhjZWMtPlR4Q3BsdENhbGxiYWNrID0gSEFMX0NFQ19UeENwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBUeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ0VDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGNlYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9DRUNfRXJyb3JDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ0VDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY2VjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ0VDX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DRUNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNlYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ0VDX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGNlYy0+Z1N0YXRlID09IEhBTF9DRUNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ0VDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY2VjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ0VDX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DRUNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNlYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ0VDX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGNlYyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBDRUMgUlggY29tcGxldGUgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGNlYyBDRUMgaGFuZGxlCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgUnggdHJhbnNmZXIgY29tcGVsZXRlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1JlZ2lzdGVyUnhDcGx0Q2FsbGJhY2soQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHBDRUNfUnhDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGNlYy0+RXJyb3JDb2RlIHw9IEhBTF9DRUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNlYyk7CisKKyAgaWYgKEhBTF9DRUNfU1RBVEVfUkVBRFkgPT0gaGNlYy0+UnhTdGF0ZSkKKyAgeworICAgIGhjZWMtPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhjZWMtPkVycm9yQ29kZSB8PSBIQUxfQ0VDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhjZWMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgQ0VDIFJYIGNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBDRUMgUlggY29tcGxldGUgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ0VDX1VuUmVnaXN0ZXJSeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNlYyk7CisKKyAgaWYgKEhBTF9DRUNfU1RBVEVfUkVBRFkgPT0gaGNlYy0+UnhTdGF0ZSkKKyAgeworICAgIGhjZWMtPlJ4Q3BsdENhbGxiYWNrID0gSEFMX0NFQ19SeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgIENFQyBSeENwbHRDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY2VjLT5FcnJvckNvZGUgfD0gSEFMX0NFQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoY2VjKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX0NFQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDRUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIENFQyBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgQ0VDIGRhdGEgdHJhbnNmZXJzLgorCisgICAgKCMpIFRoZSBDRUMgaGFuZGxlIG11c3QgY29udGFpbiB0aGUgaW5pdGlhdG9yIChUWCBzaWRlKSBhbmQgdGhlIGRlc3RpbmF0aW9uIChSWCBzaWRlKQorICAgICAgICBsb2dpY2FsIGFkZHJlc3NlcyAoNC1iaXQgbG9uZyBhZGRyZXNzZXMsIDB4RiBmb3IgYnJvYWRjYXN0IG1lc3NhZ2VzIGRlc3RpbmF0aW9uKQorCisgICAgKCMpIFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzLgorICAgICAgICAgICBUaGVzZSBBUEkncyByZXR1cm4gdGhlIEhBTCBzdGF0dXMuCisgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICBkZWRpY2F0ZWQgQ0VDIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlLgorICAgICAgICAgICBUaGUgSEFMX0NFQ19UeENwbHRDYWxsYmFjaygpLCBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgIFRoZSBIQUxfQ0VDX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24KKyAgICAgICAgICAgZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAgKCspIEhBTF9DRUNfVHJhbnNtaXRfSVQoKQorICAgICAgICAgKCspIEhBTF9DRUNfSVJRSGFuZGxlcigpCisKKyAgICAoIykgQSBzZXQgb2YgVXNlciBDYWxsYmFja3MgYXJlIHByb3ZpZGVkOgorICAgICAgICAgKCspIEhBTF9DRUNfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAgKCspIEhBTF9DRUNfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAgKCspIEhBTF9DRUNfRXJyb3JDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHBhcmFtIEluaXRpYXRvckFkZHJlc3MgSW5pdGlhdG9yIGFkZHJlc3MKKyAgKiBAcGFyYW0gRGVzdGluYXRpb25BZGRyZXNzIGRlc3RpbmF0aW9uIGxvZ2ljYWwgYWRkcmVzcworICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGlucHV0IGJ5dGUgZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IGluIGJ5dGVzICh3aXRob3V0IGNvdW50aW5nIHRoZSBoZWFkZXIpLgorICAqICAgICAgICAgICAgICAwIG1lYW5zIG9ubHkgdGhlIGhlYWRlciBpcyBzZW50IChwaW5nIG9wZXJhdGlvbikuCisgICogICAgICAgICAgICAgIE1heGltdW0gVFggc2l6ZSBpcyAxNSBieXRlcyAoMSBvcGNvZGUgYW5kIHVwIHRvIDE0IG9wZXJhbmRzKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DRUNfVHJhbnNtaXRfSVQoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQ4X3QgSW5pdGlhdG9yQWRkcmVzcywgdWludDhfdCBEZXN0aW5hdGlvbkFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBTaXplKQoreworICAvKiBpZiB0aGUgcGVyaXBoZXJhbCBpc24ndCBhbHJlYWR5IGJ1c3kgYW5kIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHRyYW5zbWlzc2lvbgorICAgICBhbHJlYWR5IHBlbmRpbmcgZHVlIHRvIGFyYml0cmF0aW9uIGxvc3QgKi8KKyAgaWYgKGhjZWMtPmdTdGF0ZSA9PSBIQUxfQ0VDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSAmJiAoU2l6ZSA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0VDX0FERFJFU1MoRGVzdGluYXRpb25BZGRyZXNzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NFQ19BRERSRVNTKEluaXRpYXRvckFkZHJlc3MpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ0VDX01TR1NJWkUoU2l6ZSkpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjZWMpOworICAgIGhjZWMtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoY2VjLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX0JVU1lfVFg7CisgICAgaGNlYy0+RXJyb3JDb2RlID0gSEFMX0NFQ19FUlJPUl9OT05FOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQsCisgICAgICAqIDAgbWVhbnMgb25seSBvbmUgaGVhZGVyIGlzIHNlbnQgKHBpbmcgb3BlcmF0aW9uKSAqLworICAgIGhjZWMtPlR4WGZlckNvdW50ID0gKHVpbnQxNl90KVNpemU7CisKKyAgICAvKiBpbiBjYXNlIG9mIG5vIHBheWxvYWQgKFNpemUgPSAwKSwgc2VuZGVyIGlzIG9ubHkgcGluZ2luZyB0aGUgc3lzdGVtOworICAgICAgIFNldCBUWCBFbmQgb2YgTWVzc2FnZSAoVFhFT00pIGJpdCwgbXVzdCBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgZGF0YSB0byBUWERSICovCisgICAgaWYgKFNpemUgPT0gMFUpCisgICAgeworICAgICAgX19IQUxfQ0VDX0xBU1RfQllURV9UWF9TRVQoaGNlYyk7CisgICAgfQorCisgICAgLyogc2VuZCBoZWFkZXIgYmxvY2sgKi8KKyAgICBoY2VjLT5JbnN0YW5jZS0+VFhEUiA9ICh1aW50MzJfdCkoKCh1aW50MzJfdClJbml0aWF0b3JBZGRyZXNzIDw8IENFQ19JTklUSUFUT1JfTFNCX1BPUykgfCBEZXN0aW5hdGlvbkFkZHJlc3MpOworCisgICAgLyogU2V0IFRYIFN0YXJ0IG9mIE1lc3NhZ2UgIChUWFNPTSkgYml0ICovCisgICAgX19IQUxfQ0VDX0ZJUlNUX0JZVEVfVFhfU0VUKGhjZWMpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY2VjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEdldCBzaXplIG9mIHRoZSByZWNlaXZlZCBmcmFtZS4KKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBGcmFtZSBzaXplCisgICovCit1aW50MzJfdCBIQUxfQ0VDX0dldExhc3RSZWNlaXZlZEZyYW1lU2l6ZShDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgcmV0dXJuIGhjZWMtPlJ4WGZlclNpemU7Cit9CisKKy8qKgorICAqIEBicmllZiBDaGFuZ2UgUnggQnVmZmVyLgorICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcGFyYW0gUnhidWZmZXIgUnggQnVmZmVyCisgICogQG5vdGUgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBvbmx5IGluc2lkZSB0aGUgSEFMX0NFQ19SeENwbHRDYWxsYmFjaygpCisgICogQHJldHZhbCBGcmFtZSBzaXplCisgICovCit2b2lkIEhBTF9DRUNfQ2hhbmdlUnhCdWZmZXIoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMsIHVpbnQ4X3QgKlJ4YnVmZmVyKQoreworICBoY2VjLT5Jbml0LlJ4QnVmZmVyID0gUnhidWZmZXI7Cit9CisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQ0VDIGludGVycnVwdCByZXF1ZXN0cy4KKyAgKiBAcGFyYW0gaGNlYyBDRUMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9DRUNfSVJRSGFuZGxlcihDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKworICAvKiBzYXZlIGludGVycnVwdHMgcmVnaXN0ZXIgZm9yIGZ1cnRoZXIgZXJyb3Igb3IgaW50ZXJydXB0cyBoYW5kbGluZyBwdXJwb3NlcyAqLworICB1aW50MzJfdCByZWc7CisgIHJlZyA9IGhjZWMtPkluc3RhbmNlLT5JU1I7CisKKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQXJiaXRyYXRpb24gTG9zdCBNYW5hZ2VtZW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENFQyBUWCBhcmJpdHJhdGlvbiBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKHJlZyAmIENFQ19GTEFHX0FSQkxTVCkgIT0gMFUpCisgIHsKKyAgICBoY2VjLT5FcnJvckNvZGUgPSBIQUxfQ0VDX0VSUk9SX0FSQkxTVDsKKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBDRUNfRkxBR19BUkJMU1QpOworICB9CisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJ4IE1hbmFnZW1lbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ0VDIFJYIGJ5dGUgcmVjZWl2ZWQgaW50ZXJydXB0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKHJlZyAmIENFQ19GTEFHX1JYQlIpICE9IDBVKQorICB7CisgICAgLyogcmVjZXB0aW9uIGlzIHN0YXJ0aW5nICovCisgICAgaGNlYy0+UnhTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfQlVTWV9SWDsKKyAgICBoY2VjLT5SeFhmZXJTaXplKys7CisgICAgLyogcmVhZCByZWNlaXZlZCBieXRlICovCisgICAgKmhjZWMtPkluaXQuUnhCdWZmZXIgPSAodWludDhfdCkgaGNlYy0+SW5zdGFuY2UtPlJYRFI7CisgICAgaGNlYy0+SW5pdC5SeEJ1ZmZlcisrOworICAgIF9fSEFMX0NFQ19DTEVBUl9GTEFHKGhjZWMsIENFQ19GTEFHX1JYQlIpOworICB9CisKKyAgLyogQ0VDIFJYIGVuZCByZWNlaXZlZCBpbnRlcnJ1cHQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgocmVnICYgQ0VDX0ZMQUdfUlhFTkQpICE9IDBVKQorICB7CisgICAgLyogY2xlYXIgSVQgKi8KKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBDRUNfRkxBR19SWEVORCk7CisKKyAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBoY2VjLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGNlYy0+UnhTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVBRFk7CisgICAgaGNlYy0+RXJyb3JDb2RlID0gSEFMX0NFQ19FUlJPUl9OT05FOworICAgIGhjZWMtPkluaXQuUnhCdWZmZXIgLT0gaGNlYy0+UnhYZmVyU2l6ZTsKKyNpZiAoVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhjZWMtPlJ4Q3BsdENhbGxiYWNrKGhjZWMsIGhjZWMtPlJ4WGZlclNpemUpOworI2Vsc2UKKyAgICBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKGhjZWMsIGhjZWMtPlJ4WGZlclNpemUpOworI2VuZGlmIC8qIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIGhjZWMtPlJ4WGZlclNpemUgPSAwVTsKKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1UeCBNYW5hZ2VtZW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENFQyBUWCBieXRlIHJlcXVlc3QgaW50ZXJydXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgocmVnICYgQ0VDX0ZMQUdfVFhCUikgIT0gMFUpCisgIHsKKyAgICBpZiAoaGNlYy0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogaWYgdGhpcyBpcyB0aGUgbGFzdCBieXRlIHRyYW5zbWlzc2lvbiwgc2V0IFRYIEVuZCBvZiBNZXNzYWdlIChUWEVPTSkgYml0ICovCisgICAgICBfX0hBTF9DRUNfTEFTVF9CWVRFX1RYX1NFVChoY2VjKTsKKyAgICAgIGhjZWMtPkluc3RhbmNlLT5UWERSID0gKmhjZWMtPnBUeEJ1ZmZQdHI7CisgICAgICBoY2VjLT5wVHhCdWZmUHRyKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY2VjLT5JbnN0YW5jZS0+VFhEUiA9ICpoY2VjLT5wVHhCdWZmUHRyOworICAgICAgaGNlYy0+cFR4QnVmZlB0cisrOworICAgICAgaGNlYy0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgICAgLyogY2xlYXIgVHgtQnl0ZSByZXF1ZXN0IGZsYWcgKi8KKyAgICBfX0hBTF9DRUNfQ0xFQVJfRkxBRyhoY2VjLCBDRUNfRkxBR19UWEJSKTsKKyAgfQorCisgIC8qIENFQyBUWCBlbmQgaW50ZXJydXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgocmVnICYgQ0VDX0ZMQUdfVFhFTkQpICE9IDBVKQorICB7CisgICAgX19IQUxfQ0VDX0NMRUFSX0ZMQUcoaGNlYywgQ0VDX0ZMQUdfVFhFTkQpOworCisgICAgLyogVHggcHJvY2VzcyBpcyBlbmRlZCwgcmVzdG9yZSBoY2VjLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoY2VjLT5nU3RhdGUgPSBIQUxfQ0VDX1NUQVRFX1JFQURZOworICAgIC8qIENhbGwgdGhlIFByb2Nlc3MgVW5sb2NrZWQgYmVmb3JlIGNhbGxpbmcgdGhlIFR4IGNhbGwgYmFjayBBUEkgdG8gZ2l2ZSB0aGUgcG9zc2liaWxpdHkgdG8KKyAgICBzdGFydCBhZ2FpbiB0aGUgVHJhbnNtaXNzaW9uIHVuZGVyIHRoZSBUeCBjYWxsIGJhY2sgQVBJICovCisgICAgX19IQUxfVU5MT0NLKGhjZWMpOworICAgIGhjZWMtPkVycm9yQ29kZSA9IEhBTF9DRUNfRVJST1JfTk9ORTsKKyNpZiAoVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhjZWMtPlR4Q3BsdENhbGxiYWNrKGhjZWMpOworI2Vsc2UKKyAgICBIQUxfQ0VDX1R4Q3BsdENhbGxiYWNrKGhjZWMpOworI2VuZGlmIC8qIFVTRV9IQUxfQ0VDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJ4L1R4IEVycm9yIE1hbmFnZW1lbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChyZWcgJiAoQ0VDX0lTUl9SWE9WUiB8IENFQ19JU1JfQlJFIHwgQ0VDX0lTUl9TQlBFIHwgQ0VDX0lTUl9MQlBFIHwgQ0VDX0lTUl9SWEFDS0UgfCBDRUNfSVNSX1RYVURSIHwgQ0VDX0lTUl9UWEVSUiB8CisgICAgICAgICAgICAgIENFQ19JU1JfVFhBQ0tFKSkgIT0gMFUpCisgIHsKKyAgICBoY2VjLT5FcnJvckNvZGUgPSByZWc7CisgICAgX19IQUxfQ0VDX0NMRUFSX0ZMQUcoaGNlYywgSEFMX0NFQ19FUlJPUl9SWE9WUiB8IEhBTF9DRUNfRVJST1JfQlJFIHwgQ0VDX0ZMQUdfTEJQRSB8IENFQ19GTEFHX1NCUEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DRUNfRVJST1JfUlhBQ0tFIHwgSEFMX0NFQ19FUlJPUl9UWFVEUiB8IEhBTF9DRUNfRVJST1JfVFhFUlIgfCBIQUxfQ0VDX0VSUk9SX1RYQUNLRSk7CisKKworICAgIGlmICgocmVnICYgKENFQ19JU1JfUlhPVlIgfCBDRUNfSVNSX0JSRSB8IENFQ19JU1JfU0JQRSB8IENFQ19JU1JfTEJQRSB8IENFQ19JU1JfUlhBQ0tFKSkgIT0gMFUpCisgICAgeworICAgICAgaGNlYy0+SW5pdC5SeEJ1ZmZlciAtPSBoY2VjLT5SeFhmZXJTaXplOworICAgICAgaGNlYy0+UnhYZmVyU2l6ZSA9IDBVOworICAgICAgaGNlYy0+UnhTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVBRFk7CisgICAgfQorICAgIGVsc2UgaWYgKCgocmVnICYgQ0VDX0lTUl9BUkJMU1QpID09IDBVKSAmJiAoKHJlZyAmIChDRUNfSVNSX1RYVURSIHwgQ0VDX0lTUl9UWEVSUiB8IENFQ19JU1JfVFhBQ0tFKSkgIT0gMFUpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgQ0VDIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgIGhjZWMtPmdTdGF0ZSA9IEhBTF9DRUNfU1RBVEVfUkVBRFk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvZG8qLworICAgIH0KKyNpZiAoVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhjZWMtPkVycm9yQ2FsbGJhY2soaGNlYyk7CisjZWxzZQorICAgIC8qIEVycm9yICBDYWxsIEJhY2sgKi8KKyAgICBIQUxfQ0VDX0Vycm9yQ2FsbGJhY2soaGNlYyk7CisjZW5kaWYgLyogVVNFX0hBTF9DRUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0b2RvKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhjZWMgQ0VDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NFQ19UeENwbHRDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNlYyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhjZWMgQ0VDIGhhbmRsZQorICAqIEBwYXJhbSBSeEZyYW1lU2l6ZSBTaXplIG9mIGZyYW1lCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrKENFQ19IYW5kbGVUeXBlRGVmICpoY2VjLCB1aW50MzJfdCBSeEZyYW1lU2l6ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNlYyk7CisgIFVOVVNFRChSeEZyYW1lU2l6ZSk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgQ0VDIGVycm9yIGNhbGxiYWNrcworICAqIEBwYXJhbSBoY2VjIENFQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DRUNfRXJyb3JDYWxsYmFjayhDRUNfSGFuZGxlVHlwZURlZiAqaGNlYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNlYyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ0VDX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENFQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbgorICAqICBAYnJpZWYgICBDRUMgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbiAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBDRUMuCisgICAgICgrKSBIQUxfQ0VDX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgQ0VDIHBlcmlwaGVyYWwuCisgICAgICgrKSBIQUxfQ0VDX0dldEVycm9yKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBlcnJvciBvZiB0aGUgQ0VDIHBlcmlwaGVyYWwuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmIHJldHVybiB0aGUgQ0VDIHN0YXRlCisgICogQHBhcmFtIGhjZWMgcG9pbnRlciB0byBhIENFQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIENFQyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DRUNfU3RhdGVUeXBlRGVmIEhBTF9DRUNfR2V0U3RhdGUoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7CisgIHVpbnQzMl90IHRlbXAxLCB0ZW1wMjsKKyAgdGVtcDEgPSBoY2VjLT5nU3RhdGU7CisgIHRlbXAyID0gaGNlYy0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9DRUNfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENFQyBlcnJvciBjb2RlCisgICogQHBhcmFtICBoY2VjICBwb2ludGVyIHRvIGEgQ0VDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ0VDLgorICAqIEByZXR2YWwgQ0VDIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9DRUNfR2V0RXJyb3IoQ0VDX0hhbmRsZVR5cGVEZWYgKmhjZWMpCit7CisgIHJldHVybiBoY2VjLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogQ0VDICovCisjZW5kaWYgLyogSEFMX0NFQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2NvbXAuYyBiL1NyYy9zdG0zMmcweHhfaGFsX2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE5YjEyCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfY29tcC5jCkBAIC0wLDAgKzEsMTA2NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfY29tcC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDT01QIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPTVAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zIGluIHBvbGxpbmcgbW9kZQorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBpbnRlcnJ1cHQgbW9kZSAodGhyb3VnaCBFWFRJIGludGVycnVwdCkKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIGNvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBzdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIyMjIyMgQ09NUCBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICAgIFRoZSBTVE0zMkcweHggZGV2aWNlIGZhbWlseSBpbnRlZ3JhdGVzIHR3byBhbmFsb2cgY29tcGFyYXRvcnMgaW5zdGFuY2VzOgorICAgICAgQ09NUDEsIENPTVAyLgorICAgICAgKCMpIENvbXBhcmF0b3JzIGlucHV0IG1pbnVzIChpbnZlcnRpbmcgaW5wdXQpIGFuZCBpbnB1dCBwbHVzIChub24gaW52ZXJ0aW5nIGlucHV0KQorICAgICAgICAgIGNhbiBiZSBzZXQgdG8gaW50ZXJuYWwgcmVmZXJlbmNlcyBvciB0byBHUElPIHBpbnMKKyAgICAgICAgICAocmVmZXIgdG8gR1BJTyBsaXN0IGluIHJlZmVyZW5jZSBtYW51YWwpLgorCisgICAgICAoIykgQ29tcGFyYXRvcnMgb3V0cHV0IGxldmVsIGlzIGF2YWlsYWJsZSB1c2luZyBIQUxfQ09NUF9HZXRPdXRwdXRMZXZlbCgpCisgICAgICAgICAgYW5kIGNhbiBiZSByZWRpcmVjdGVkIHRvIG90aGVyIHBlcmlwaGVyYWxzOiBHUElPIHBpbnMgKGluIG1vZGUKKyAgICAgICAgICBhbHRlcm5hdGUgZnVuY3Rpb25zIGZvciBjb21wYXJhdG9yKSwgdGltZXJzLgorICAgICAgICAgIChyZWZlciB0byBHUElPIGxpc3QgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKKyAgICAgICgjKSBUaGUgY29tcGFyYXRvcnMgaGF2ZSBpbnRlcnJ1cHQgY2FwYWJpbGl0eSB0aHJvdWdoIHRoZSBFWFRJIGNvbnRyb2xsZXIKKyAgICAgICAgICB3aXRoIHdha2UtdXAgZnJvbSBzbGVlcCBhbmQgc3RvcCBtb2Rlcy4KKworICAgICAgKCMpIFBhaXJzIG9mIGNvbXBhcmF0b3JzIGluc3RhbmNlcyBjYW4gYmUgY29tYmluZWQgaW4gd2luZG93IG1vZGUKKyAgICAgICAgICAoMiBjb25zZWN1dGl2ZSBpbnN0YW5jZXMgb2RkIGFuZCBldmVuIENPTVA8eD4gYW5kIENPTVA8eCsxPikuCisKKyAgICAgICAgICBGcm9tIHRoZSBjb3JyZXNwb25kaW5nIElSUSBoYW5kbGVyLCB0aGUgcmlnaHQgaW50ZXJydXB0IHNvdXJjZSBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfQ09NUF9DT01QeF9FWFRJX0dFVF9GTEFHKCkuCisKKyAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIGNvbXBhcmF0b3IgaW5zdGFuY2VzCisgICAgICBvZiBTVE0zMkcweHggZGV2aWNlcy4KKworICAgICAgVG8gdXNlIHRoZSBjb21wYXJhdG9yLCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisKKyAgICAgICgjKSAgSW5pdGlhbGl6ZSB0aGUgQ09NUCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX0NPTVBfTXNwSW5pdCgpOgorICAgICAgKCsrKSBDb25maWd1cmUgdGhlIEdQSU8gY29ubmVjdGVkIHRvIGNvbXBhcmF0b3IgaW5wdXRzIHBsdXMgYW5kIG1pbnVzIGluIGFuYWxvZyBtb2RlCisgICAgICAgICAgIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KKyAgICAgICgrKykgSWYgbmVlZGVkLCBjb25maWd1cmUgdGhlIEdQSU8gY29ubmVjdGVkIHRvIGNvbXBhcmF0b3Igb3V0cHV0IGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlCisgICAgICAgICAgIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KKyAgICAgICgrKykgSWYgcmVxdWlyZWQgZW5hYmxlIHRoZSBDT01QIGludGVycnVwdCBieSBjb25maWd1cmluZyBhbmQgZW5hYmxpbmcgRVhUSSBsaW5lIGluIEludGVycnVwdCBtb2RlIGFuZAorICAgICAgICAgICBzZWxlY3RpbmcgdGhlIGRlc2lyZWQgc2Vuc2l0aXZpdHkgbGV2ZWwgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIGZ1bmN0aW9uLiBBZnRlciB0aGF0IGVuYWJsZSB0aGUgY29tcGFyYXRvcgorICAgICAgICAgICBpbnRlcnJ1cHQgdmVjdG9yIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpIGZ1bmN0aW9uLgorCisgICAgICAoIykgQ29uZmlndXJlIHRoZSBjb21wYXJhdG9yIHVzaW5nIEhBTF9DT01QX0luaXQoKSBmdW5jdGlvbjoKKyAgICAgICgrKykgU2VsZWN0IHRoZSBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KQorICAgICAgKCsrKSBTZWxlY3QgdGhlIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpCisgICAgICAoKyspIFNlbGVjdCB0aGUgaHlzdGVyZXNpcworICAgICAgKCsrKSBTZWxlY3QgdGhlIGJsYW5raW5nIHNvdXJjZQorICAgICAgKCsrKSBTZWxlY3QgdGhlIG91dHB1dCBwb2xhcml0eQorICAgICAgKCsrKSBTZWxlY3QgdGhlIHBvd2VyIG1vZGUKKyAgICAgICgrKykgU2VsZWN0IHRoZSB3aW5kb3cgbW9kZQorCisgICAgICAtQEAtIEhBTF9DT01QX0luaXQoKSBjYWxscyBpbnRlcm5hbGx5IF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpCisgICAgICAgICAgdG8gZW5hYmxlIGludGVybmFsIGNvbnRyb2wgY2xvY2sgb2YgdGhlIGNvbXBhcmF0b3JzLgorICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgYSBsZWdhY3kgc3RyYXRlZ3kuIEluIGZ1dHVyZSBTVE0zMiBmYW1pbGllcywKKyAgICAgICAgICBDT01QIGNsb2NrIGVuYWJsZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHVzZXIgaW4gIkhBTF9DT01QX01zcEluaXQoKSIuCisgICAgICAgICAgVGhlcmVmb3JlLCBmb3IgY29tcGF0aWJpbGl0eSBhbnRpY2lwYXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvCisgICAgICAgICAgaW1wbGVtZW50IF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpIGluICJIQUxfQ09NUF9Nc3BJbml0KCkiLgorCisgICAgICAoIykgUmVjb25maWd1cmF0aW9uIG9uLXRoZS1mbHkgb2YgY29tcGFyYXRvciBjYW4gYmUgZG9uZSBieSBjYWxsaW5nIGFnYWluCisgICAgICAgICAgZnVuY3Rpb24gSEFMX0NPTVBfSW5pdCgpIHdpdGggbmV3IGlucHV0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcy4KKworICAgICAgKCMpIEVuYWJsZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9TdGFydCgpIGZ1bmN0aW9uLgorCisgICAgICAoIykgVXNlIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjaygpIG9yIEhBTF9DT01QX0dldE91dHB1dExldmVsKCkgZnVuY3Rpb25zCisgICAgICAgICAgdG8gbWFuYWdlIGNvbXBhcmF0b3Igb3V0cHV0cyAoZXZlbnRzIGFuZCBvdXRwdXQgbGV2ZWwpLgorCisgICAgICAoIykgRGlzYWJsZSB0aGUgY29tcGFyYXRvciB1c2luZyBIQUxfQ09NUF9TdG9wKCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBEZS1pbml0aWFsaXplIHRoZSBjb21wYXJhdG9yIHVzaW5nIEhBTF9DT01QX0RlSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgICAoIykgRm9yIHNhZmV0eSBwdXJwb3NlLCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGxvY2tlZCB1c2luZyBIQUxfQ09NUF9Mb2NrKCkgZnVuY3Rpb24uCisgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKworICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MsIHdoZW4gc2V0IHRvIDEsCisgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgICAgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfQ09NUF9SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgVHJpZ2dlckNhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIENPTVAgdHJpZ2dlci4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBAcmVmIEhBTF9DT01QX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICA6IGNhbGxiYWNrIGZvciBDT01QIHRyaWdnZXIuCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgIFsuLl0KKworICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfQ09NUF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0NPTVBfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlIEByZWYgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0NPTVBfSW5pdCgpLyBAcmVmIEhBTF9DT01QX0RlSW5pdCgpIG9ubHkgd2hlbgorICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIFsuLl0KKworICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9DT01QX0luaXQoKS8gQHJlZiBIQUxfQ09NUF9EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICAgWy4uXQorCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfQ09NUF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfQ09NUF9TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9DT01QX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgIFsuLl0KKworICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX0NPTVBfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0NPTVBfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfQ09NUF9Jbml0KCkgZnVuY3Rpb24uCisgICAgIFsuLl0KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZCAoQ09NUDEpIHx8IGRlZmluZWQgKENPTVAyKQorCisvKiogQGRlZmdyb3VwIENPTVAgQ09NUAorICAqIEBicmllZiBDT01QIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIERlbGF5IGZvciBDT01QIHN0YXJ0dXAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBEZWxheSByZXF1aXJlZCB0byByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01QX0RFTEFZX1NUQVJUVVBfVVMgICAgICAgICAgKDgwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisKKy8qIERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U1RBUlRfU0NBTEVSIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAoMjAwVUwpICAvKiE8IERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0JJVE9GRlNFVF9QT1MgICAgKDMwVUwpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09NUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGRlLWluaXRpYWxpemUgY29tcGFyYXRvcnMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDT01QIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDT01QX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIElmIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yIGlzIGxvY2tlZCwgaW5pdGlhbGl6YXRpb24gY2FuJ3QgYmUgcGVyZm9ybWVkLgorICAqICAgICAgICAgVG8gdW5sb2NrIHRoZSBjb25maWd1cmF0aW9uLCBwZXJmb3JtIGEgc3lzdGVtIHJlc2V0LgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIHVpbnQzMl90IHRtcF9jc3I7CisgIHVpbnQzMl90IGV4dGlfbGluZTsKKyAgdWludDMyX3QgY29tcF92b2x0YWdlX3NjYWxlcl9pbml0aWFsaXplZDsgLyogVmFsdWUgIjAiIGlmIGNvbXBhcmF0b3Igdm9sdGFnZSBzY2FsZXIgaXMgbm90IGluaXRpYWxpemVkICovCisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gYW5kIGxvY2sgc3RhdHVzICovCisgIGlmKGhjb21wID09IE5VTEwpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZSBpZihfX0hBTF9DT01QX0lTX0xPQ0tFRChoY29tcCkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfSU5QVVRfUExVUyhoY29tcC0+SW5zdGFuY2UsIGhjb21wLT5Jbml0LklucHV0UGx1cykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0lOUFVUX01JTlVTKGhjb21wLT5JbnN0YW5jZSwgaGNvbXAtPkluaXQuSW5wdXRNaW51cykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX09VVFBVVFBPTChoY29tcC0+SW5pdC5PdXRwdXRQb2wpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9QT1dFUk1PREUoaGNvbXAtPkluaXQuTW9kZSkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0hZU1RFUkVTSVMoaGNvbXAtPkluaXQuSHlzdGVyZXNpcykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0JMQU5LSU5HU1JDX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSwgaGNvbXAtPkluaXQuQmxhbmtpbmdTcmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfVFJJR0dFUk1PREUoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9XSU5ET1dNT0RFKGhjb21wLT5Jbml0LldpbmRvd01vZGUpKTsKKyAgICBpZihoY29tcC0+SW5pdC5XaW5kb3dNb2RlICE9IENPTVBfV0lORE9XTU9ERV9ESVNBQkxFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19DT01QX1dJTkRPV09VVFBVVChoY29tcC0+SW5pdC5XaW5kb3dPdXRwdXQpKTsKKyAgICB9CisKKyAgICBpZihoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgICAgaGNvbXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAgIC8qIFNldCBDT01QIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgICAgQ09NUF9DTEVBUl9FUlJPUkNPREUoaGNvbXApOworCisKKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogSW5pdCB0aGUgQ09NUCBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgICAgaGNvbXAtPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKworICAgICAgaWYgKGhjb21wLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgICB9CisKKyAgICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgICAgLyogTm90ZTogSW50ZXJuYWwgY29udHJvbCBjbG9jayBvZiB0aGUgY29tcGFyYXRvcnMgbXVzdCAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGJlIGVuYWJsZWQgaW4gIkhBTF9DT01QX01zcEluaXQoKSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICB1c2luZyAiX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayhoY29tcCk7CisjZWxzZQorICAgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgICAvKiBOb3RlOiBJbnRlcm5hbCBjb250cm9sIGNsb2NrIG9mIHRoZSBjb21wYXJhdG9ycyBtdXN0ICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgYmUgZW5hYmxlZCBpbiAiSEFMX0NPTVBfTXNwSW5pdCgpIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIHVzaW5nICJfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBIQUxfQ09NUF9Nc3BJbml0KGhjb21wKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorCisgICAgLyogTWVtb3JpemUgdm9sdGFnZSBzY2FsZXIgc3RhdGUgYmVmb3JlIGluaXRpYWxpemF0aW9uICovCisgICAgY29tcF92b2x0YWdlX3NjYWxlcl9pbml0aWFsaXplZCA9IFJFQURfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCAoQ09NUF9DU1JfSU5NU0VMXzEgfCBDT01QX0NTUl9JTk1TRUxfMCkpOworCisgICAgLyogU2V0IENPTVAgcGFyYW1ldGVycyAqLworICAgIHRtcF9jc3IgPSAoICBoY29tcC0+SW5pdC5JbnB1dE1pbnVzCisgICAgICAgICAgICAgICB8IGhjb21wLT5Jbml0LklucHV0UGx1cworICAgICAgICAgICAgICAgfCBoY29tcC0+SW5pdC5CbGFua2luZ1NyY2UKKyAgICAgICAgICAgICAgIHwgaGNvbXAtPkluaXQuSHlzdGVyZXNpcworICAgICAgICAgICAgICAgfCBoY29tcC0+SW5pdC5PdXRwdXRQb2wKKyAgICAgICAgICAgICAgIHwgaGNvbXAtPkluaXQuTW9kZQorICAgICAgICAgICAgICApOworCisgICAgLyogU2V0IHBhcmFtZXRlcnMgaW4gQ09NUCByZWdpc3RlciAqLworICAgIC8qIE5vdGU6IFVwZGF0ZSBhbGwgYml0cyBleGNlcHQgcmVhZC1vbmx5LCBsb2NrIGFuZCBlbmFibGUgYml0cyAqLworICAgIE1PRElGWV9SRUcoaGNvbXAtPkluc3RhbmNlLT5DU1IsCisgICAgICAgICAgICAgICBDT01QX0NTUl9QV1JNT0RFICB8IENPTVBfQ1NSX0lOTVNFTCAgIHwgQ09NUF9DU1JfSU5QU0VMICB8CisgICAgICAgICAgICAgICBDT01QX0NTUl9XSU5NT0RFICB8IENPTVBfQ1NSX1BPTEFSSVRZIHwgQ09NUF9DU1JfSFlTVCAgICB8CisgICAgICAgICAgICAgICBDT01QX0NTUl9CTEFOS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgdG1wX2NzcgorICAgICAgICAgICAgICApOworCisgICAgLyogU2V0IHdpbmRvdyBtb2RlICovCisgICAgLyogTm90ZTogV2luZG93IG1vZGUgYml0IGlzIGxvY2F0ZWQgaW50byAxIG91dCBvZiB0aGUgMiBwYWlycyBvZiBDT01QICAgICAqLworICAgIC8qICAgICAgIGluc3RhbmNlcy4gVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIGNhbiB1cGRhdGUgYW5vdGhlciBDT01QICAgICAgKi8KKyAgICAvKiAgICAgICBpbnN0YW5jZSB0aGF0IHRoZSBvbmUgY3VycmVudGx5IHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoaGNvbXAtPkluaXQuV2luZG93TW9kZSA9PSBDT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04pCisgICAgeworICAgICAgQ0xFQVJfQklUKENPTVAxMl9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk1PREUpOworICAgICAgU0VUX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfRVZFTiwgQ09NUF9DU1JfV0lOTU9ERSk7CisgICAgfQorICAgIGVsc2UgaWYoaGNvbXAtPkluaXQuV2luZG93TW9kZSA9PSBDT01QX1dJTkRPV01PREVfQ09NUDJfSU5QVVRfUExVU19DT01NT04pCisgICAgeworICAgICAgU0VUX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfT0RELCBDT01QX0NTUl9XSU5NT0RFKTsKKyAgICAgIENMRUFSX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfRVZFTiwgQ09NUF9DU1JfV0lOTU9ERSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBDTEVBUl9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSX09ERCwgQ09NUF9DU1JfV0lOTU9ERSk7CisgICAgICBDTEVBUl9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSX0VWRU4sIENPTVBfQ1NSX1dJTk1PREUpOworICAgIH0KKworICAgIC8qIFNldCB3aW5kb3cgbW9kZSBvdXRwdXQgKi8KKyAgICAvKiBOb3RlOiBXaW5kb3cgbW9kZSBtb2RlIG91dHB1dCBjYW4gYWxzbyBiZSB1c2VkIHdoZW4gd2luZG93IG1vZGUgICAgICAgICovCisgICAgLyogICAgICAgaXMgZGlzYWJsZWQsIHRvIHVzZSBjb21wYXJhdG9ycyBpbiBpbmRlcGVuZGVudCBtb2RlIHdpdGggdGhlaXIgICAqLworICAgIC8qICAgICAgIG91dHB1dCBjb25uZWN0ZWQgdGhyb3VnaCBleGNsdXNpdmUtb3IgY2lyY3VpdHJ5LiAgICAgICAgICAgICAgICAgKi8KKyAgICBzd2l0Y2ggKGhjb21wLT5Jbml0LldpbmRvd091dHB1dCkKKyAgICB7CisgICAgICBjYXNlIENPTVBfV0lORE9XT1VUUFVUX0NPTVAxOgorICAgICAgICBTRVRfQklUKENPTVAxMl9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk9VVCk7CisgICAgICAgIENMRUFSX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfRVZFTiwgQ09NUF9DU1JfV0lOT1VUKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ09NUF9XSU5ET1dPVVRQVVRfQ09NUDI6CisgICAgICAgIENMRUFSX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfT0RELCBDT01QX0NTUl9XSU5PVVQpOworICAgICAgICBTRVRfQklUKENPTVAxMl9DT01NT04tPkNTUl9FVkVOLCBDT01QX0NTUl9XSU5PVVQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDT01QX1dJTkRPV09VVFBVVF9CT1RIOgorICAgICAgICBTRVRfQklUKENPTVAxMl9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk9VVCk7CisgICAgICAgIFNFVF9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSX0VWRU4sIENPTVBfQ1NSX1dJTk9VVCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAvKiBDT01QX1dJTkRPV09VVFBVVF9FQUNIX0NPTVAgKi8KKyAgICAgICAgQ0xFQVJfQklUKENPTVAxMl9DT01NT04tPkNTUl9PREQsIENPTVBfQ1NSX1dJTk9VVCk7CisgICAgICAgIENMRUFSX0JJVChDT01QMTJfQ09NTU9OLT5DU1JfRVZFTiwgQ09NUF9DU1JfV0lOT1VUKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogRGVsYXkgZm9yIENPTVAgc2NhbGVyIGJyaWRnZSB2b2x0YWdlIHN0YWJpbGl6YXRpb24gKi8KKyAgICAvKiBBcHBseSB0aGUgZGVsYXkgaWYgdm9sdGFnZSBzY2FsZXIgYnJpZGdlIGlzIHJlcXVpcmVkIGFuZCBub3QgYWxyZWFkeSBlbmFibGVkICovCisgICAgaWYgKChSRUFEX0JJVChoY29tcC0+SW5zdGFuY2UtPkNTUiwgKENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApKSAhPSAwVUwpICYmCisgICAgICAgIChjb21wX3ZvbHRhZ2Vfc2NhbGVyX2luaXRpYWxpemVkID09IDBVTCkgICAgICAgICAgICAgICApCisgICAgeworICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTIC8gMTBVTCkgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMFVMICogMlVMKSkpOworICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IHRoZSBFWFRJIGxpbmUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZSAqLworICAgIGV4dGlfbGluZSA9IENPTVBfR0VUX0VYVElfTElORShoY29tcC0+SW5zdGFuY2UpOworCisgICAgLyogTWFuYWdlIEVYVEkgc2V0dGluZ3MgKi8KKyAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiAoQ09NUF9FWFRJX0lUIHwgQ09NUF9FWFRJX0VWRU5UKSkgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSBFWFRJIHJpc2luZyBlZGdlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfUklTSU5HKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgRVhUSSBmYWxsaW5nIGVkZ2UgKi8KKyAgICAgIGlmKChoY29tcC0+SW5pdC5UcmlnZ2VyTW9kZSAmIENPTVBfRVhUSV9GQUxMSU5HKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIENPTVAgRVhUSSBwZW5kaW5nIGJpdCAoaWYgYW55KSAqLworICAgICAgTExfRVhUSV9DbGVhclJpc2luZ0ZsYWdfMF8zMShleHRpX2xpbmUpOworICAgICAgTExfRVhUSV9DbGVhckZhbGxpbmdGbGFnXzBfMzEoZXh0aV9saW5lKTsKKworICAgICAgLyogQ29uZmlndXJlIEVYVEkgZXZlbnQgbW9kZSAqLworICAgICAgaWYoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9FWFRJX0VWRU5UKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBFWFRJIGludGVycnVwdCBtb2RlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfSVQpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVhUSSBldmVudCBtb2RlICovCisgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKGV4dGlfbGluZSk7CisKKyAgICAgIC8qIERpc2FibGUgRVhUSSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShleHRpX2xpbmUpOworICAgIH0KKworICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAvKiBOb3RlOiBUcmFuc2l0aW9uIGZyb20gc3RhdGUgcmVzZXQgdG8gc3RhdGUgcmVhZHksICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgb3RoZXJ3aXNlIChjb21pbmcgZnJvbSBzdGF0ZSByZWFkeSBvciBidXN5KSBubyBzdGF0ZSB1cGRhdGUuICAgICAqLworICAgIGlmIChoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIENPTVAgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZSAgIERlaW5pdGlhbGl6YXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBpZiB0aGUgQ09NUCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZC4KKyAgKiAgICAgICAgIFRvIHVubG9jayB0aGUgY29uZmlndXJhdGlvbiwgcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoaGNvbXAgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlIGlmKF9fSEFMX0NPTVBfSVNfTE9DS0VEKGhjb21wKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogU2V0IENPTVBfQ1NSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgV1JJVEVfUkVHKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCAweDAwMDAwMDAwVUwpOworCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBpZiAoaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NPTVBfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgICAgfQorCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIFJDQyBjbG9jaywgTlZJQyAqLworICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayhoY29tcCk7CisjZWxzZQorICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBSQ0MgY2xvY2ssIE5WSUMgKi8KKyAgICBIQUxfQ09NUF9Nc3BEZUluaXQoaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVDsKKworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY29tcCk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIENPTVAgTVNQLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9Nc3BJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjb21wKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NPTVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgQ09NUCBNU1AuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DT01QX01zcERlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY29tcCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DT01QX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIENPTVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoY29tcCBQb2ludGVyIHRvIGEgQ09NUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ09NUC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX1RSSUdHRVJfQ0JfSUQgVHJpZ2dlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9SZWdpc3RlckNhbGxiYWNrKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXAsIEhBTF9DT01QX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBDT01QX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKEhBTF9DT01QX1NUQVRFX1JFQURZID09IGhjb21wLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DT01QX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQ09NUF9TVEFURV9SRVNFVCA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIENPTVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIENPTVAgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoY29tcCBQb2ludGVyIHRvIGEgQ09NUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ09NUC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChIQUxfQ09NUF9TVEFURV9SRUFEWSA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQ09NUF9TVEFURV9SRVNFVCA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAgICAgKCspIFN0b3AgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdGFydChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBfX0lPIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9IDBVTDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UgaWYoX19IQUxfQ09NUF9JU19MT0NLRUQoaGNvbXApKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgICBpZihoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVBRFkpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yICovCisgICAgICBTRVRfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9FTik7CisKKyAgICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAgIGhjb21wLT5TdGF0ZSA9IEhBTF9DT01QX1NUQVRFX0JVU1k7CisKKyAgICAgIC8qIERlbGF5IGZvciBDT01QIHN0YXJ0dXAgdGltZSAqLworICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoQ09NUF9ERUxBWV9TVEFSVFVQX1VTIC8gMTBVTCkgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMFVMICogMlVMKSkpOworICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdG9wKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoaGNvbXAgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlIGlmKF9fSEFMX0NPTVBfSVNfTE9DS0VEKGhjb21wKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogQ2hlY2sgY29tcGxpYW50IHN0YXRlczogSEFMX0NPTVBfU1RBVEVfUkVBRFkgb3IgSEFMX0NPTVBfU1RBVEVfQlVTWSAgICAqLworICAgIC8qIChhbGwgc3RhdGVzIGV4Y2VwdCBIQUxfQ09NUF9TVEFURV9SRVNFVCBhbmQgZXhjZXB0IGxvY2tlZCBzdGF0dXMuICAgICAgKi8KKyAgICBpZihoY29tcC0+U3RhdGUgIT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgICAgQ0xFQVJfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9FTik7CisKKyAgICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAgIGhjb21wLT5TdGF0ZSA9IEhBTF9DT01QX1NUQVRFX1JFQURZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyYXRvciBJUlEgaGFuZGxlci4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ09NUF9JUlFIYW5kbGVyKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIEdldCB0aGUgRVhUSSBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UgKi8KKyAgdWludDMyX3QgZXh0aV9saW5lID0gQ09NUF9HRVRfRVhUSV9MSU5FKGhjb21wLT5JbnN0YW5jZSk7CisgIHVpbnQzMl90IGNvbXBhcmF0b3Jfd2luZG93X21vZGVfb2RkID0gUkVBRF9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSX09ERCwgQ09NUF9DU1JfV0lOTU9ERSk7CisgIHVpbnQzMl90IGNvbXBhcmF0b3Jfd2luZG93X21vZGVfZXZlbiA9IFJFQURfQklUKENPTVAxMl9DT01NT04tPkNTUl9FVkVOLCBDT01QX0NTUl9XSU5NT0RFKTsKKworICAvKiBDaGVjayBDT01QIEVYVEkgZmxhZyAqLworICBpZihMTF9FWFRJX0lzQWN0aXZlUmlzaW5nRmxhZ18wXzMxKGV4dGlfbGluZSkgIT0gMFVMKQorICB7CisgICAgLyogQ2hlY2sgd2hldGhlciBjb21wYXJhdG9yIGlzIGluIGluZGVwZW5kZW50IG9yIHdpbmRvdyBtb2RlICovCisgICAgaWYoICAgKGNvbXBhcmF0b3Jfd2luZG93X21vZGVfb2RkICE9IDBVTCkKKyAgICAgICB8fCAoY29tcGFyYXRvcl93aW5kb3dfbW9kZV9ldmVuICE9IDBVTCkpCisgICAgeworICAgICAgLyogQ2xlYXIgQ09NUCBFWFRJIGxpbmUgcGVuZGluZyBiaXQgb2YgdGhlIHBhaXIgb2YgY29tcGFyYXRvcnMgICAgICAgICAgKi8KKyAgICAgIC8qIGluIHdpbmRvdyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBOb3RlOiBQYWlyIG9mIGNvbXBhcmF0b3JzIGluIHdpbmRvdyBtb2RlIGNhbiBib3RoIHRyaWcgSVJRIHdoZW4gICAgICAqLworICAgICAgLyogICAgICAgaW5wdXQgdm9sdGFnZSBpcyBjaGFuZ2luZyBmcm9tICJvdXQgb2Ygd2luZG93IiBhcmVhICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIChsb3cgb3IgaGlnaCApIHRvIHRoZSBvdGhlciAib3V0IG9mIHdpbmRvdyIgYXJlYSAoaGlnaCBvciBsb3cpLiovCisgICAgICAvKiAgICAgICBCb3RoIGZsYWdzIG11c3QgYmUgY2xlYXJlZCB0byBjYWxsIGNvbXBhcmF0b3IgdHJpZ2dlciAgICAgICAgICAqLworICAgICAgLyogICAgICAgY2FsbGJhY2sgaXMgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIExMX0VYVElfQ2xlYXJSaXNpbmdGbGFnXzBfMzEoKENPTVBfRVhUSV9MSU5FX0NPTVAxIHwgQ09NUF9FWFRJX0xJTkVfQ09NUDIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENsZWFyIENPTVAgRVhUSSBsaW5lIHBlbmRpbmcgYml0ICovCisgICAgICBMTF9FWFRJX0NsZWFyUmlzaW5nRmxhZ18wXzMxKGV4dGlfbGluZSk7CisgICAgfQorCisgICAgLyogQ09NUCB0cmlnZ2VyIHVzZXIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhjb21wLT5UcmlnZ2VyQ2FsbGJhY2soaGNvbXApOworI2Vsc2UKKyAgICBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmKExMX0VYVElfSXNBY3RpdmVGYWxsaW5nRmxhZ18wXzMxKGV4dGlfbGluZSkgIT0gMFVMKQorICB7CisgICAgLyogQ2hlY2sgd2hldGhlciBjb21wYXJhdG9yIGlzIGluIGluZGVwZW5kZW50IG9yIHdpbmRvdyBtb2RlICovCisgICAgaWYoICAgKGNvbXBhcmF0b3Jfd2luZG93X21vZGVfb2RkICE9IDBVTCkKKyAgICAgICB8fCAoY29tcGFyYXRvcl93aW5kb3dfbW9kZV9ldmVuICE9IDBVTCkpCisgICAgeworICAgICAgLyogQ2xlYXIgQ09NUCBFWFRJIGxpbmUgcGVuZGluZyBiaXQgb2YgdGhlIHBhaXIgb2YgY29tcGFyYXRvcnMgICAgICAgICAgKi8KKyAgICAgIC8qIGluIHdpbmRvdyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBOb3RlOiBQYWlyIG9mIGNvbXBhcmF0b3JzIGluIHdpbmRvdyBtb2RlIGNhbiBib3RoIHRyaWcgSVJRIHdoZW4gICAgICAqLworICAgICAgLyogICAgICAgaW5wdXQgdm9sdGFnZSBpcyBjaGFuZ2luZyBmcm9tICJvdXQgb2Ygd2luZG93IiBhcmVhICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIChsb3cgb3IgaGlnaCApIHRvIHRoZSBvdGhlciAib3V0IG9mIHdpbmRvdyIgYXJlYSAoaGlnaCBvciBsb3cpLiovCisgICAgICAvKiAgICAgICBCb3RoIGZsYWdzIG11c3QgYmUgY2xlYXJlZCB0byBjYWxsIGNvbXBhcmF0b3IgdHJpZ2dlciAgICAgICAgICAqLworICAgICAgLyogICAgICAgY2FsbGJhY2sgaXMgY2FsbGVkIG9uY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIExMX0VYVElfQ2xlYXJGYWxsaW5nRmxhZ18wXzMxKChDT01QX0VYVElfTElORV9DT01QMSB8IENPTVBfRVhUSV9MSU5FX0NPTVAyKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciBDT01QIEVYVEkgbGluZSBwZW5kaW5nIGJpdCAqLworICAgICAgTExfRVhUSV9DbGVhckZhbGxpbmdGbGFnXzBfMzEoZXh0aV9saW5lKTsKKyAgICB9CisKKyAgICAvKiBDT01QIHRyaWdnZXIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhjb21wLT5UcmlnZ2VyQ2FsbGJhY2soaGNvbXApOworI2Vsc2UKKyAgICBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBNYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgY29tcGFyYXRvcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgQSBzeXN0ZW0gcmVzZXQgaXMgcmVxdWlyZWQgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBMb2NraW5nIHRoZSBjb21wYXJhdG9yIGZyb20gcmVzZXQgc3RhdGUgaXMgcG9zc2libGUKKyAgKiAgICAgICAgIGlmIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0xvY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UgaWYoX19IQUxfQ09NUF9JU19MT0NLRUQoaGNvbXApKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgICAvKiBTZXQgSEFMIENPTVAgaGFuZGxlIHN0YXRlICovCisgICAgc3dpdGNoKGhjb21wLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DT01QX1NUQVRFX1JFU0VUOgorICAgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVF9MT0NLRUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ09NUF9TVEFURV9SRUFEWToKKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFlfTE9DS0VEOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DT01QX1NUQVRFX0JVU1kgKi8KKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfQlVTWV9MT0NLRUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgdGhlIGxvY2sgYml0IGNvcnJlc3BvbmRpbmcgdG8gc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgIF9fSEFMX0NPTVBfTE9DSyhoY29tcCk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgb3V0cHV0IGxldmVsIChoaWdoIG9yIGxvdykgb2YgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IuCisgICogICAgICAgICBUaGUgb3V0cHV0IGxldmVsIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIHBvbGFyaXR5LgorICAqICAgICAgICAgSWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGxvd2VyCisgICogICAgICAgICAgICAgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgIElmIHRoZSBwb2xhcml0eSBpcyBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBsb3dlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWw6CisgICogICAgICAgICBAYXJnIENPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBDT01QX09VVFBVVF9MRVZFTF9ISUdICisgICoKKyAgKi8KK3VpbnQzMl90IEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgPj4gQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyYXRvciB0cmlnZ2VyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNvbXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdCB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENPTVAgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DT01QX1N0YXRlVHlwZURlZiBIQUxfQ09NUF9HZXRTdGF0ZShDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9DT01QX1NUQVRFX1JFU0VUOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgLyogUmV0dXJuIEhBTCBDT01QIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGNvbXAtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQ09NUCBlcnJvciBjb2RlLgorICAqIEBwYXJhbSBoY29tcCBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgQ09NUCBlcnJvciBjb2RlCisgICovCit1aW50MzJfdCBIQUxfQ09NUF9HZXRFcnJvcihDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgcmV0dXJuIGhjb21wLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDT01QMSB8fCBDT01QMiAqLworCisjZW5kaWYgLyogSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2NvcnRleC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfY29ydGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNTM4YwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2NvcnRleC5jCkBAIC0wLDAgKzEsNDE3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jb3J0ZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPUlRFWDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgKioqIEhvdyB0byBjb25maWd1cmUgSW50ZXJydXB0cyB1c2luZyBDT1JURVggSEFMIGRyaXZlciAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgTlZJQyBpbnRlcnJ1cHRzIChJUlEpLgorICAgIFRoZSBDb3J0ZXggTTArIGV4Y2VwdGlvbnMgYXJlIG1hbmFnZWQgYnkgQ01TSVMgZnVuY3Rpb25zLgorICAgICAgKCMpIEVuYWJsZSBhbmQgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBvZiB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzLgorICAgICAgICAgICAgIFRoZSBwcmlvcml0eSBjYW4gYmUgMC4uMy4KKworICAgICAgICAtQC0gTG93ZXIgcHJpb3JpdHkgdmFsdWVzIGdpdmVzIGhpZ2hlciBwcmlvcml0eS4KKyAgICAgICAgLUAtIFByaW9yaXR5IE9yZGVyOgorICAgICAgICAgICAgKCNAKSBMb3dlc3QgcHJpb3JpdHkuCisgICAgICAgICAgICAoI0ApIExvd2VzdCBoYXJkd2FyZSBwcmlvcml0eSAoSVJRbiBwb3NpdGlvbikuCisKKyAgICAgICgjKSAgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBvZiB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKworICAgICAgKCMpICBFbmFibGUgdGhlIHNlbGVjdGVkIElSUSBDaGFubmVscyB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQorCisgICAgICAtQC0gIE5lZ2F0aXZlIHZhbHVlIG9mIElSUW5fVHlwZSBhcmUgbm90IGFsbG93ZWQuCisKKyAgICAqKiogSG93IHRvIGNvbmZpZ3VyZSBTeXN0aWNrIHVzaW5nIENPUlRFWCBIQUwgZHJpdmVyICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFNldHVwIFN5c1RpY2sgVGltZXIgZm9yIHRpbWUgYmFzZS4KKworICAgKCspIFRoZSBIQUxfU1lTVElDS19Db25maWcoKWZ1bmN0aW9uIGNhbGxzIHRoZSBTeXNUaWNrX0NvbmZpZygpIGZ1bmN0aW9uIHdoaWNoCisgICAgICAgaXMgYSBDTVNJUyBmdW5jdGlvbiB0aGF0OgorICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgUmVsb2FkIHJlZ2lzdGVyIHdpdGggdmFsdWUgcGFzc2VkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSB0byB0aGUgbG93ZXN0IHZhbHVlICgweDAzKS4KKyAgICAgICAgKCsrKSBSZXNldHMgdGhlIFN5c1RpY2sgQ291bnRlciByZWdpc3Rlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIENvdW50ZXIgY2xvY2sgc291cmNlIHRvIGJlIENvcmUgQ2xvY2sgU291cmNlIChIQ0xLKS4KKyAgICAgICAgKCsrKSBFbmFibGVzIHRoZSBTeXNUaWNrIEludGVycnVwdC4KKyAgICAgICAgKCsrKSBTdGFydHMgdGhlIFN5c1RpY2sgQ291bnRlci4KKworICAgKCspIFlvdSBjYW4gY2hhbmdlIHRoZSBTeXNUaWNrIENsb2NrIHNvdXJjZSB0byBiZSBIQ0xLX0RpdjggYnkgY2FsbGluZyB0aGUgbWFjcm8KKyAgICAgICBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSBqdXN0IGFmdGVyIHRoZQorICAgICAgIEhBTF9TWVNUSUNLX0NvbmZpZygpIGZ1bmN0aW9uIGNhbGwuIFRoZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoKSBtYWNybyBpcyBkZWZpbmVkCisgICAgICAgaW5zaWRlIHRoZSBzdG0zMmcweHhfaGFsX2NvcnRleC5oIGZpbGUuCisKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgYnkgY2FsbGluZyB0aGUKKyAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sLi4uKSBmdW5jdGlvbiBqdXN0IGFmdGVyIHRoZSBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbgorICAgICAgIGNhbGwuIFRoZSBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGNhbGwgdGhlIE5WSUNfU2V0UHJpb3JpdHkoKSBmdW5jdGlvbiB3aGljaCBpcyBhIENNU0lTIGZ1bmN0aW9uLgorCisgICAoKykgVG8gYWRqdXN0IHRoZSBTeXNUaWNrIHRpbWUgYmFzZSwgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKworICAgICAgIFJlbG9hZCBWYWx1ZSA9IFN5c1RpY2sgQ291bnRlciBDbG9jayAoSHopIHggIERlc2lyZWQgVGltZSBiYXNlIChzKQorICAgICAgICgrKykgUmVsb2FkIFZhbHVlIGlzIHRoZSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIGZvciBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbgorICAgICAgICgrKykgUmVsb2FkIFZhbHVlIHNob3VsZCBub3QgZXhjZWVkIDB4RkZGRkZGCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWAorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgdGhlIENPUlRFWCBIQUwgZHJpdmVyIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgSW50ZXJydXB0cworICAgICAgU3lzdGljayBmdW5jdGlvbmFsaXRpZXMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFNldHMgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4KKyAgKiBAcGFyYW0gSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyIC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHN0bTMyZzB4eC5oIGZpbGUpCisgICogQHBhcmFtIFByZWVtcHRQcmlvcml0eSBUaGUgcHJlZW1wdGlvbiBwcmlvcml0eSBmb3IgdGhlIElSUW4gY2hhbm5lbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMy4KKyAgKiAgICAgICAgIEEgbG93ZXIgcHJpb3JpdHkgdmFsdWUgaW5kaWNhdGVzIGEgaGlnaGVyIHByaW9yaXR5CisgICogQHBhcmFtIFN1YlByaW9yaXR5IHRoZSBzdWJwcmlvcml0eSBsZXZlbCBmb3IgdGhlIElSUSBjaGFubmVsLgorICAqICAgICAgICAgd2l0aCBzdG0zMmcweHggZGV2aWNlcywgdGhpcyBwYXJhbWV0ZXIgaXMgYSBkdW1teSB2YWx1ZSBhbmQgaXQgaXMgaWdub3JlZCwgYmVjYXVzZQorICAqICAgICAgICAgbm8gc3VicHJpb3JpdHkgc3VwcG9ydGVkIGluIENvcnRleCBNMCsgYmFzZWQgcHJvZHVjdHMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX1NldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90IFN1YlByaW9yaXR5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFByZWVtcHRQcmlvcml0eSkpOworICBOVklDX1NldFByaW9yaXR5KElSUW4sUHJlZW1wdFByaW9yaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmcweHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfRW5hYmxlSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKworICAvKiBFbmFibGUgaW50ZXJydXB0ICovCisgIE5WSUNfRW5hYmxlSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYSBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0IGluIHRoZSBOVklDIGludGVycnVwdCBjb250cm9sbGVyLgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmcweHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfRGlzYWJsZUlSUShJUlFuX1R5cGUgSVJRbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKyAgTlZJQ19EaXNhYmxlSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYXRlIGEgc3lzdGVtIHJlc2V0IHJlcXVlc3QgdG8gcmVzZXQgdGhlIE1DVS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU3lzdGVtUmVzZXQodm9pZCkKK3sKKyAgLyogU3lzdGVtIFJlc2V0ICovCisgIE5WSUNfU3lzdGVtUmVzZXQoKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTeXN0ZW0gVGltZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZCBhbmQgc3RhcnQgdGhlIFN5c3RlbSBUaWNrIFRpbWVyIChTeXNUaWNrKToKKyAgKiAgICAgICAgIENvdW50ZXIgaXMgaW4gZnJlZSBydW5uaW5nIG1vZGUgdG8gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIFRpY2tzTnVtYiBTcGVjaWZpZXMgdGhlIHRpY2tzIE51bWJlciBvZiB0aWNrcyBiZXR3ZWVuIHR3byBpbnRlcnJ1cHRzLgorICAqIEByZXR2YWwgc3RhdHVzOiAgLSAwICBGdW5jdGlvbiBzdWNjZWVkZWQuCisgICogICAgICAgICAgICAgICAgICAtIDEgIEZ1bmN0aW9uIGZhaWxlZC4KKyAgKi8KK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpCit7CisgIHJldHVybiBTeXNUaWNrX0NvbmZpZyhUaWNrc051bWIpOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgQ29ydGV4IGNvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBDT1JURVgKKyAgICAgIChOVklDLCBTWVNUSUNLLCBNUFUpIGZ1bmN0aW9uYWxpdGllcy4KKworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMmcweHh4eC5oKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuKQoreworICAvKiBHZXQgcHJpb3JpdHkgZm9yIENvcnRleC1NIHN5c3RlbSBvciBkZXZpY2Ugc3BlY2lmaWMgaW50ZXJydXB0cyAqLworICByZXR1cm4gTlZJQ19HZXRQcmlvcml0eShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUGVuZGluZyBiaXQgb2YgYW4gZXh0ZXJuYWwgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZzB4eHh4LmgpKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19TZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKworICAvKiBTZXQgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyAgTlZJQ19TZXRQZW5kaW5nSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQZW5kaW5nIEludGVycnVwdCAocmVhZCB0aGUgcGVuZGluZyByZWdpc3RlciBpbiB0aGUgTlZJQworICAqICAgICAgICAgYW5kIHJldHVybiB0aGUgcGVuZGluZyBiaXQgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0KS4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJnMHh4eHguaCkpCisgICogQHJldHZhbCBzdGF0dXM6IC0gMCAgSW50ZXJydXB0IHN0YXR1cyBpcyBub3QgcGVuZGluZy4KKyAgKiAgICAgICAgICAgICAgICAgLSAxICBJbnRlcnJ1cHQgc3RhdHVzIGlzIHBlbmRpbmcuCisgICovCit1aW50MzJfdCBIQUxfTlZJQ19HZXRQZW5kaW5nSVJRKElSUW5fVHlwZSBJUlFuKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19ERVZJQ0VfSVJRKElSUW4pKTsKKworICAvKiBSZXR1cm4gMSBpZiBwZW5kaW5nIGVsc2UgMCAqLworICByZXR1cm4gTlZJQ19HZXRQZW5kaW5nSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBwZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyZzB4eHh4LmgpKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworCisgIC8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCisgIE5WSUNfQ2xlYXJQZW5kaW5nSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtIENMS1NvdXJjZSBzcGVjaWZpZXMgdGhlIFN5c1RpY2sgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWODogQUhCIGNsb2NrIGRpdmlkZWQgYnkgOCBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICAgICBAYXJnIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs6IEFIQiBjbG9jayBzZWxlY3RlZCBhcyBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnKHVpbnQzMl90IENMS1NvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NZU1RJQ0tfQ0xLX1NPVVJDRShDTEtTb3VyY2UpKTsKKyAgaWYgKENMS1NvdXJjZSA9PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKQorICB7CisgICAgU3lzVGljay0+Q1RSTCB8PSBTWVNUSUNLX0NMS1NPVVJDRV9IQ0xLOworICB9CisgIGVsc2UKKyAgeworICAgIFN5c1RpY2stPkNUUkwgJj0gflNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU1lTVElDSyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU1RJQ0tfSVJRSGFuZGxlcih2b2lkKQoreworICBIQUxfU1lTVElDS19DYWxsYmFjaygpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNZU1RJQ0sgY2FsbGJhY2suCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1lTVElDS19DYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChfX01QVV9QUkVTRU5UID09IDFVKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIE1QVS4KKyAgKiBAcGFyYW0gIE1QVV9Db250cm9sIFNwZWNpZmllcyB0aGUgY29udHJvbCBtb2RlIG9mIHRoZSBNUFUgZHVyaW5nIGhhcmQgZmF1bHQsCisgICogICAgICAgICAgTk1JLCBGQVVMVE1BU0sgYW5kIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSBkZWZhdWx0IG1lbW9yeQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIE1QVV9IRk5NSV9QUklWREVGX05PTkUKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX0hBUkRGQVVMVF9OTUkKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX1BSSVZJTEVHRURfREVGQVVMVAorICAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTVBVX0VuYWJsZSh1aW50MzJfdCBNUFVfQ29udHJvbCkKK3sKKyAgLyogRW5hYmxlIHRoZSBNUFUgKi8KKyAgTVBVLT5DVFJMID0gKE1QVV9Db250cm9sIHwgTVBVX0NUUkxfRU5BQkxFX01zayk7CisKKyAgLyogRW5zdXJlIE1QVSBzZXR0aW5nIHRha2UgZWZmZWN0cyAqLworICBfX0RTQigpOworICBfX0lTQigpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTVBVLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTVBVX0Rpc2FibGUodm9pZCkKK3sKKyAgLyogTWFrZSBzdXJlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBhcmUgZG9uZSAqLworICBfX0RNQigpOworCisgIC8qIERpc2FibGUgdGhlIE1QVSBhbmQgY2xlYXIgdGhlIGNvbnRyb2wgcmVnaXN0ZXIqLworICBNUFUtPkNUUkwgID0gMDsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgUmVnaW9uIGFuZCB0aGUgbWVtb3J5IHRvIGJlIHByb3RlY3RlZC4KKyAgKiBAcGFyYW0gTVBVX0luaXQgUG9pbnRlciB0byBhIE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9NUFVfQ29uZmlnUmVnaW9uKE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgKk1QVV9Jbml0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9OVU1CRVIoTVBVX0luaXQtPk51bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9FTkFCTEUoTVBVX0luaXQtPkVuYWJsZSkpOworCisgIC8qIFNldCB0aGUgUmVnaW9uIG51bWJlciAqLworICBNUFUtPlJOUiA9IE1QVV9Jbml0LT5OdW1iZXI7CisKKyAgaWYgKChNUFVfSW5pdC0+RW5hYmxlKSAhPSAwVSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9JTlNUUlVDVElPTl9BQ0NFU1MoTVBVX0luaXQtPkRpc2FibGVFeGVjKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fUEVSTUlTU0lPTl9BVFRSSUJVVEUoTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24pKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1RFWF9MRVZFTChNUFVfSW5pdC0+VHlwZUV4dEZpZWxkKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKE1QVV9Jbml0LT5Jc1NoYXJlYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShNUFVfSW5pdC0+SXNDYWNoZWFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKE1QVV9Jbml0LT5Jc0J1ZmZlcmFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1NVQl9SRUdJT05fRElTQUJMRShNUFVfSW5pdC0+U3ViUmVnaW9uRGlzYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX1NJWkUoTVBVX0luaXQtPlNpemUpKTsKKworICAgIE1QVS0+UkJBUiA9IE1QVV9Jbml0LT5CYXNlQWRkcmVzczsKKyAgICBNUFUtPlJBU1IgPSAoKHVpbnQzMl90KU1QVV9Jbml0LT5EaXNhYmxlRXhlYyAgICAgICAgICAgICA8PCBNUFVfUkFTUl9YTl9Qb3MpICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24gICAgICAgIDw8IE1QVV9SQVNSX0FQX1BvcykgICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+VHlwZUV4dEZpZWxkICAgICAgICAgICAgPDwgTVBVX1JBU1JfVEVYX1BvcykgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5Jc1NoYXJlYWJsZSAgICAgICAgICAgICA8PCBNUFVfUkFTUl9TX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQ2FjaGVhYmxlICAgICAgICAgICAgIDw8IE1QVV9SQVNSX0NfUG9zKSAgICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+SXNCdWZmZXJhYmxlICAgICAgICAgICAgPDwgTVBVX1JBU1JfQl9Qb3MpICAgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5TdWJSZWdpb25EaXNhYmxlICAgICAgICA8PCBNUFVfUkFTUl9TUkRfUG9zKSAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlNpemUgICAgICAgICAgICAgICAgICAgIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+RW5hYmxlICAgICAgICAgICAgICAgICAgPDwgTVBVX1JBU1JfRU5BQkxFX1Bvcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTVBVLT5SQkFSID0gMHgwMFU7CisgICAgTVBVLT5SQVNSID0gMHgwMFU7CisgIH0KK30KKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQ09SVEVYX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfY3JjLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY4MDk0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfY3JjLmMKQEAgLTAsMCArMSw1MTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2NyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2sgKENSQykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICAoKykgRW5hYmxlIENSQyBBSEIgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0NSQ19DTEtfRU5BQkxFKCk7CisgICAgICAgICAoKykgSW5pdGlhbGl6ZSBDUkMgY2FsY3VsYXRvcgorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBnZW5lcmF0aW5nIHBvbHlub21pYWwgKHBlcmlwaGVyYWwgZGVmYXVsdCBvciBub24tZGVmYXVsdCBvbmUpCisgICAgICAgICAgICAgKCsrKSBzcGVjaWZ5IGluaXRpYWxpemF0aW9uIHZhbHVlIChwZXJpcGhlcmFsIGRlZmF1bHQgb3Igbm9uLWRlZmF1bHQgb25lKQorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBpbnB1dCBkYXRhIGZvcm1hdAorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBpbnB1dCBvciBvdXRwdXQgZGF0YSBpbnZlcnNpb24gbW9kZSBpZiBhbnkKKyAgICAgICAgICgrKSBVc2UgSEFMX0NSQ19BY2N1bXVsYXRlKCkgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgQ1JDIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgIGlucHV0IGRhdGEgYnVmZmVyIHN0YXJ0aW5nIHdpdGggdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgQ1JDIGFzCisgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgICAgICAgICgrKSBVc2UgSEFMX0NSQ19DYWxjdWxhdGUoKSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBDUkMgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICAgaW5wdXQgZGF0YSBidWZmZXIgc3RhcnRpbmcgd2l0aCB0aGUgZGVmaW5lZCBpbml0aWFsaXphdGlvbiB2YWx1ZQorICAgICAgICAgICAgIChkZWZhdWx0IG9yIG5vbi1kZWZhdWx0KSB0byBpbml0aWF0ZSBDUkMgY2FsY3VsYXRpb24KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkMgQ1JDCisgICogQGJyaWVmIENSQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX1ByaXZhdGVfRnVuY3Rpb25zIENSQyBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfOChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDhfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7CitzdGF0aWMgdWludDMyX3QgQ1JDX0hhbmRsZV8xNihDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDE2X3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUkMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgICAgICAgIGluIHRoZSBDUkNfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSQyBwZXJpcGhlcmFsCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JDIE1TUCAoTUNVIFNwZWNpZmljIFBhY2thZ2UpCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUkMgTVNQCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JDIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUkNfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNfSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogQ2hlY2sgdGhlIENSQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfQUxMX0lOU1RBTkNFKGhjcmMtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhjcmMtPlN0YXRlID09IEhBTF9DUkNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGNyYy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfQ1JDX01zcEluaXQoaGNyYyk7CisgIH0KKworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICAvKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBub24tZGVmYXVsdCBnZW5lcmF0aW5nIHBvbHlub21pYWwgaGFzIGJlZW4KKyAgICogcGlja2VkIHVwIGJ5IHVzZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RFRkFVTFRfUE9MWU5PTUlBTChoY3JjLT5Jbml0LkRlZmF1bHRQb2x5bm9taWFsVXNlKSk7CisgIGlmIChoY3JjLT5Jbml0LkRlZmF1bHRQb2x5bm9taWFsVXNlID09IERFRkFVTFRfUE9MWU5PTUlBTF9FTkFCTEUpCisgIHsKKyAgICAvKiBpbml0aWFsaXplIHBlcmlwaGVyYWwgd2l0aCBkZWZhdWx0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+UE9MLCBERUZBVUxUX0NSQzMyX1BPTFkpOworICAgIE1PRElGWV9SRUcoaGNyYy0+SW5zdGFuY2UtPkNSLCBDUkNfQ1JfUE9MWVNJWkUsIENSQ19QT0xZTEVOR1RIXzMyQik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogaW5pdGlhbGl6ZSBDUkMgcGVyaXBoZXJhbCB3aXRoIGdlbmVyYXRpbmcgcG9seW5vbWlhbCBkZWZpbmVkIGJ5IHVzZXIgKi8KKyAgICBpZiAoSEFMX0NSQ0V4X1BvbHlub21pYWxfU2V0KGhjcmMsIGhjcmMtPkluaXQuR2VuZXJhdGluZ1BvbHlub21pYWwsIGhjcmMtPkluaXQuQ1JDTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBjaGVjayB3aGV0aGVyIG9yIG5vdCBub24tZGVmYXVsdCBDUkMgaW5pdGlhbCB2YWx1ZSBoYXMgYmVlbgorICAgKiBwaWNrZWQgdXAgYnkgdXNlciAqLworICBhc3NlcnRfcGFyYW0oSVNfREVGQVVMVF9JTklUX1ZBTFVFKGhjcmMtPkluaXQuRGVmYXVsdEluaXRWYWx1ZVVzZSkpOworICBpZiAoaGNyYy0+SW5pdC5EZWZhdWx0SW5pdFZhbHVlVXNlID09IERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUpCisgIHsKKyAgICBXUklURV9SRUcoaGNyYy0+SW5zdGFuY2UtPklOSVQsIERFRkFVTFRfQ1JDX0lOSVRWQUxVRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgV1JJVEVfUkVHKGhjcmMtPkluc3RhbmNlLT5JTklULCBoY3JjLT5Jbml0LkluaXRWYWx1ZSk7CisgIH0KKworCisgIC8qIHNldCBpbnB1dCBkYXRhIGludmVyc2lvbiBtb2RlICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9NT0RFKGhjcmMtPkluaXQuSW5wdXREYXRhSW52ZXJzaW9uTW9kZSkpOworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9JTiwgaGNyYy0+SW5pdC5JbnB1dERhdGFJbnZlcnNpb25Nb2RlKTsKKworICAvKiBzZXQgb3V0cHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKGhjcmMtPkluaXQuT3V0cHV0RGF0YUludmVyc2lvbk1vZGUpKTsKKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfT1VULCBoY3JjLT5Jbml0Lk91dHB1dERhdGFJbnZlcnNpb25Nb2RlKTsKKworICAvKiBtYWtlcyBzdXJlIHRoZSBpbnB1dCBkYXRhIGZvcm1hdCAoYnl0ZXMsIGhhbGZ3b3JkcyBvciB3b3JkcyBzdHJlYW0pCisgICAqIGlzIHByb3Blcmx5IHNwZWNpZmllZCBieSB1c2VyICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfSU5QVVREQVRBX0ZPUk1BVChoY3JjLT5JbnB1dERhdGFGb3JtYXQpKTsKKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIENSQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0RlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogQ2hlY2sgdGhlIENSQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfQUxMX0lOU1RBTkNFKGhjcmMtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgdGhlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmIChoY3JjLT5TdGF0ZSA9PSBIQUxfQ1JDX1NUQVRFX0JVU1kpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgLyogUmVzZXQgQ1JDIGNhbGN1bGF0aW9uIHVuaXQgKi8KKyAgX19IQUxfQ1JDX0RSX1JFU0VUKGhjcmMpOworCisgIC8qIFJlc2V0IElEUiByZWdpc3RlciBjb250ZW50ICovCisgIENMRUFSX0JJVChoY3JjLT5JbnN0YW5jZS0+SURSLCBDUkNfSURSX0lEUik7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX0NSQ19Nc3BEZUluaXQoaGNyYyk7CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoY3JjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSQyBNU1AuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUkNfTXNwSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUkNfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIENSQyBNU1AuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUkNfTXNwRGVJbml0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3JjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NSQ19Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgICBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIGNvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICAgICAgICAgdXNpbmcgY29tYmluYXRpb24gb2YgdGhlIHByZXZpb3VzIENSQyB2YWx1ZSBhbmQgdGhlIG5ldyBvbmUuCisKKyAgICAgICBbLi5dICBvcgorCisgICAgICAoKykgY29tcHV0ZSB0aGUgNywgOCwgMTYgb3IgMzItYml0IENSQyB2YWx1ZSBvZiBhbiA4LCAxNiBvciAzMi1iaXQgZGF0YSBidWZmZXIKKyAgICAgICAgICBpbmRlcGVuZGVudGx5IG9mIHRoZSBwcmV2aW91cyBDUkMgdmFsdWUuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29tcHV0ZSB0aGUgNywgOCwgMTYgb3IgMzItYml0IENSQyB2YWx1ZSBvZiBhbiA4LCAxNiBvciAzMi1iaXQgZGF0YSBidWZmZXIKKyAgKiAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgQ1JDIGFzIGluaXRpYWxpemF0aW9uIHZhbHVlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgYnVmZmVyLCBleGFjdCBpbnB1dCBkYXRhIGZvcm1hdCBpcworICAqICAgICAgICAgcHJvdmlkZWQgYnkgaGNyYy0+SW5wdXREYXRhRm9ybWF0LgorICAqIEBwYXJhbSAgQnVmZmVyTGVuZ3RoIGlucHV0IGRhdGEgYnVmZmVyIGxlbmd0aCAobnVtYmVyIG9mIGJ5dGVzIGlmIHBCdWZmZXIKKyAgKiAgICAgICAgIHR5cGUgaXMgKiB1aW50OF90LCBudW1iZXIgb2YgaGFsZi13b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MTZfdCwKKyAgKiAgICAgICAgIG51bWJlciBvZiB3b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MzJfdCkuCisgICogQG5vdGUgIEJ5IGRlZmF1bHQsIHRoZSBBUEkgZXhwZWN0cyBhIHVpbnQzMl90IHBvaW50ZXIgYXMgaW5wdXQgYnVmZmVyIHBhcmFtZXRlci4KKyAgKiAgICAgICAgSW5wdXQgYnVmZmVyIHBvaW50ZXJzIHdpdGggb3RoZXIgdHlwZXMgc2ltcGx5IG5lZWQgdG8gYmUgY2FzdCBpbiB1aW50MzJfdAorICAqICAgICAgICBhbmQgdGhlIEFQSSB3aWxsIGludGVybmFsbHkgYWRqdXN0IGl0cyBpbnB1dCBkYXRhIHByb2Nlc3NpbmcgYmFzZWQgb24gdGhlCisgICogICAgICAgIGhhbmRsZSBmaWVsZCBoY3JjLT5JbnB1dERhdGFGb3JtYXQuCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8KK3VpbnQzMl90IEhBTF9DUkNfQWNjdW11bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpCit7CisgIHVpbnQzMl90IGluZGV4OyAgICAgIC8qIENSQyBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICB1aW50MzJfdCB0ZW1wID0gMFU7ICAvKiBDUkMgb3V0cHV0IChyZWFkIGZyb20gaGNyYy0+SW5zdGFuY2UtPkRSIHJlZ2lzdGVyKSAqLworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICBzd2l0Y2ggKGhjcmMtPklucHV0RGF0YUZvcm1hdCkKKyAgeworICAgIGNhc2UgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFM6CisgICAgICAvKiBFbnRlciBEYXRhIHRvIHRoZSBDUkMgY2FsY3VsYXRvciAqLworICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IEJ1ZmZlckxlbmd0aDsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgaGNyYy0+SW5zdGFuY2UtPkRSID0gcEJ1ZmZlcltpbmRleF07CisgICAgICB9CisgICAgICB0ZW1wID0gaGNyYy0+SW5zdGFuY2UtPkRSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX0JZVEVTOgorICAgICAgdGVtcCA9IENSQ19IYW5kbGVfOChoY3JjLCAodWludDhfdCAqKXBCdWZmZXIsIEJ1ZmZlckxlbmd0aCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ1JDX0lOUFVUREFUQV9GT1JNQVRfSEFMRldPUkRTOgorICAgICAgdGVtcCA9IENSQ19IYW5kbGVfMTYoaGNyYywgKHVpbnQxNl90ICopKHZvaWQgKilwQnVmZmVyLCBCdWZmZXJMZW5ndGgpOyAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovCisgIHJldHVybiB0ZW1wOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICogICAgICAgICBzdGFydGluZyB3aXRoIGhjcmMtPkluc3RhbmNlLT5JTklUIGFzIGluaXRpYWxpemF0aW9uIHZhbHVlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgYnVmZmVyLCBleGFjdCBpbnB1dCBkYXRhIGZvcm1hdCBpcworICAqICAgICAgICAgcHJvdmlkZWQgYnkgaGNyYy0+SW5wdXREYXRhRm9ybWF0LgorICAqIEBwYXJhbSAgQnVmZmVyTGVuZ3RoIGlucHV0IGRhdGEgYnVmZmVyIGxlbmd0aCAobnVtYmVyIG9mIGJ5dGVzIGlmIHBCdWZmZXIKKyAgKiAgICAgICAgIHR5cGUgaXMgKiB1aW50OF90LCBudW1iZXIgb2YgaGFsZi13b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MTZfdCwKKyAgKiAgICAgICAgIG51bWJlciBvZiB3b3JkcyBpZiBwQnVmZmVyIHR5cGUgaXMgKiB1aW50MzJfdCkuCisgICogQG5vdGUgIEJ5IGRlZmF1bHQsIHRoZSBBUEkgZXhwZWN0cyBhIHVpbnQzMl90IHBvaW50ZXIgYXMgaW5wdXQgYnVmZmVyIHBhcmFtZXRlci4KKyAgKiAgICAgICAgSW5wdXQgYnVmZmVyIHBvaW50ZXJzIHdpdGggb3RoZXIgdHlwZXMgc2ltcGx5IG5lZWQgdG8gYmUgY2FzdCBpbiB1aW50MzJfdAorICAqICAgICAgICBhbmQgdGhlIEFQSSB3aWxsIGludGVybmFsbHkgYWRqdXN0IGl0cyBpbnB1dCBkYXRhIHByb2Nlc3NpbmcgYmFzZWQgb24gdGhlCisgICogICAgICAgIGhhbmRsZSBmaWVsZCBoY3JjLT5JbnB1dERhdGFGb3JtYXQuCisgICogQHJldHZhbCB1aW50MzJfdCBDUkMgKHJldHVybmVkIHZhbHVlIExTQnMgZm9yIENSQyBzaG9ydGVyIHRoYW4gMzIgYml0cykKKyAgKi8KK3VpbnQzMl90IEhBTF9DUkNfQ2FsY3VsYXRlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCkKK3sKKyAgdWludDMyX3QgaW5kZXg7ICAgICAgLyogQ1JDIGlucHV0IGRhdGEgYnVmZmVyIGluZGV4ICovCisgIHVpbnQzMl90IHRlbXAgPSAwVTsgIC8qIENSQyBvdXRwdXQgKHJlYWQgZnJvbSBoY3JjLT5JbnN0YW5jZS0+RFIgcmVnaXN0ZXIpICovCisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiBVbml0IChoY3JjLT5JbnN0YW5jZS0+SU5JVCBpcworICAqICB3cml0dGVuIGluIGhjcmMtPkluc3RhbmNlLT5EUikgKi8KKyAgX19IQUxfQ1JDX0RSX1JFU0VUKGhjcmMpOworCisgIHN3aXRjaCAoaGNyYy0+SW5wdXREYXRhRm9ybWF0KQorICB7CisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUzoKKyAgICAgIC8qIEVudGVyIDMyLWJpdCBpbnB1dCBkYXRhIHRvIHRoZSBDUkMgY2FsY3VsYXRvciAqLworICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IEJ1ZmZlckxlbmd0aDsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgaGNyYy0+SW5zdGFuY2UtPkRSID0gcEJ1ZmZlcltpbmRleF07CisgICAgICB9CisgICAgICB0ZW1wID0gaGNyYy0+SW5zdGFuY2UtPkRSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX0JZVEVTOgorICAgICAgLyogU3BlY2lmaWMgOC1iaXQgaW5wdXQgZGF0YSBoYW5kbGluZyAgKi8KKyAgICAgIHRlbXAgPSBDUkNfSGFuZGxlXzgoaGNyYywgKHVpbnQ4X3QgKilwQnVmZmVyLCBCdWZmZXJMZW5ndGgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX0hBTEZXT1JEUzoKKyAgICAgIC8qIFNwZWNpZmljIDE2LWJpdCBpbnB1dCBkYXRhIGhhbmRsaW5nICAqLworICAgICAgdGVtcCA9IENSQ19IYW5kbGVfMTYoaGNyYywgKHVpbnQxNl90ICopKHZvaWQgKilwQnVmZmVyLCBCdWZmZXJMZW5ndGgpOyAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIHRoZSBDUkMgY29tcHV0ZWQgdmFsdWUgKi8KKyAgcmV0dXJuIHRlbXA7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENSQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0NSQ19TdGF0ZVR5cGVEZWYgSEFMX0NSQ19HZXRTdGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogUmV0dXJuIENSQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhjcmMtPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDX1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgRW50ZXIgOC1iaXQgaW5wdXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IuCisgICogICAgICAgICBTcGVjaWZpYyBkYXRhIGhhbmRsaW5nIHRvIG9wdGltaXplIHByb2Nlc3NpbmcgdGltZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgQnVmZmVyTGVuZ3RoIGlucHV0IGRhdGEgYnVmZmVyIGxlbmd0aAorICAqIEByZXR2YWwgdWludDMyX3QgQ1JDIChyZXR1cm5lZCB2YWx1ZSBMU0JzIGZvciBDUkMgc2hvcnRlciB0aGFuIDMyIGJpdHMpCisgICovCitzdGF0aWMgdWludDMyX3QgQ1JDX0hhbmRsZV84KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50OF90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKQoreworICB1aW50MzJfdCBpOyAvKiBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICB1aW50MTZfdCBkYXRhOworICBfX0lPIHVpbnQxNl90ICpwUmVnOworCisgIC8qIFByb2Nlc3NpbmcgdGltZSBvcHRpbWl6YXRpb246IDQgYnl0ZXMgYXJlIGVudGVyZWQgaW4gYSByb3cgd2l0aCBhIHNpbmdsZSB3b3JkIHdyaXRlLAorICAgKiBsYXN0IGJ5dGVzIG11c3QgYmUgY2FyZWZ1bGx5IGZlZCB0byB0aGUgQ1JDIGNhbGN1bGF0b3IgdG8gZW5zdXJlIGEgY29ycmVjdCB0eXBlCisgICAqIGhhbmRsaW5nIGJ5IHRoZSBwZXJpcGhlcmFsICovCisgIGZvciAoaSA9IDBVOyBpIDwgKEJ1ZmZlckxlbmd0aCAvIDRVKTsgaSsrKQorICB7CisgICAgaGNyYy0+SW5zdGFuY2UtPkRSID0gKCh1aW50MzJfdClwQnVmZmVyWzRVICogaV0gPDwgMjRVKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXBCdWZmZXJbKDRVICogaSkgKyAxVV0gPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXBCdWZmZXJbKDRVICogaSkgKyAyVV0gPDwgOFUpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcEJ1ZmZlclsoNFUgKiBpKSArIDNVXTsKKyAgfQorICAvKiBsYXN0IGJ5dGVzIHNwZWNpZmljIGhhbmRsaW5nICovCisgIGlmICgoQnVmZmVyTGVuZ3RoICUgNFUpICE9IDBVKQorICB7CisgICAgaWYgKChCdWZmZXJMZW5ndGggJSA0VSkgPT0gMVUpCisgICAgeworICAgICAgKihfX0lPIHVpbnQ4X3QgKikoX19JTyB2b2lkICopKCZoY3JjLT5JbnN0YW5jZS0+RFIpID0gcEJ1ZmZlcls0VSAqIGldOyAgICAgICAgIC8qIERlcm9nYXRpb24gTWlzcmFDMjAxMiBSLjExLjUgKi8KKyAgICB9CisgICAgaWYgKChCdWZmZXJMZW5ndGggJSA0VSkgPT0gMlUpCisgICAgeworICAgICAgZGF0YSA9ICgodWludDE2X3QpKHBCdWZmZXJbNFUgKiBpXSkgPDwgOFUpIHwgKHVpbnQxNl90KXBCdWZmZXJbKDRVICogaSkgKyAxVV07CisgICAgICBwUmVnID0gKF9fSU8gdWludDE2X3QgKikoX19JTyB2b2lkICopKCZoY3JjLT5JbnN0YW5jZS0+RFIpOyAgICAgICAgICAgICAgICAgICAgLyogRGVyb2dhdGlvbiBNaXNyYUMyMDEyIFIuMTEuNSAqLworICAgICAgKnBSZWcgPSBkYXRhOworICAgIH0KKyAgICBpZiAoKEJ1ZmZlckxlbmd0aCAlIDRVKSA9PSAzVSkKKyAgICB7CisgICAgICBkYXRhID0gKCh1aW50MTZfdCkocEJ1ZmZlcls0VSAqIGldKSA8PCA4VSkgfCAodWludDE2X3QpcEJ1ZmZlclsoNFUgKiBpKSArIDFVXTsKKyAgICAgIHBSZWcgPSAoX19JTyB1aW50MTZfdCAqKShfX0lPIHZvaWQgKikoJmhjcmMtPkluc3RhbmNlLT5EUik7ICAgICAgICAgICAgICAgICAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgICAqcFJlZyA9IGRhdGE7CisKKyAgICAgICooX19JTyB1aW50OF90ICopKF9fSU8gdm9pZCAqKSgmaGNyYy0+SW5zdGFuY2UtPkRSKSA9IHBCdWZmZXJbKDRVICogaSkgKyAyVV07ICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIHRoZSBDUkMgY29tcHV0ZWQgdmFsdWUgKi8KKyAgcmV0dXJuIGhjcmMtPkluc3RhbmNlLT5EUjsKK30KKworLyoqCisgICogQGJyaWVmICBFbnRlciAxNi1iaXQgaW5wdXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IuCisgICogICAgICAgICBTcGVjaWZpYyBkYXRhIGhhbmRsaW5nIHRvIG9wdGltaXplIHByb2Nlc3NpbmcgdGltZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgQnVmZmVyTGVuZ3RoIGlucHV0IGRhdGEgYnVmZmVyIGxlbmd0aAorICAqIEByZXR2YWwgdWludDMyX3QgQ1JDIChyZXR1cm5lZCB2YWx1ZSBMU0JzIGZvciBDUkMgc2hvcnRlciB0aGFuIDMyIGJpdHMpCisgICovCitzdGF0aWMgdWludDMyX3QgQ1JDX0hhbmRsZV8xNihDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDE2X3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpCit7CisgIHVpbnQzMl90IGk7ICAvKiBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICBfX0lPIHVpbnQxNl90ICpwUmVnOworCisgIC8qIFByb2Nlc3NpbmcgdGltZSBvcHRpbWl6YXRpb246IDIgSGFsZldvcmRzIGFyZSBlbnRlcmVkIGluIGEgcm93IHdpdGggYSBzaW5nbGUgd29yZCB3cml0ZSwKKyAgICogaW4gY2FzZSBvZiBvZGQgbGVuZ3RoLCBsYXN0IEhhbGZXb3JkIG11c3QgYmUgY2FyZWZ1bGx5IGZlZCB0byB0aGUgQ1JDIGNhbGN1bGF0b3IgdG8gZW5zdXJlCisgICAqIGEgY29ycmVjdCB0eXBlIGhhbmRsaW5nIGJ5IHRoZSBwZXJpcGhlcmFsICovCisgIGZvciAoaSA9IDBVOyBpIDwgKEJ1ZmZlckxlbmd0aCAvIDJVKTsgaSsrKQorICB7CisgICAgaGNyYy0+SW5zdGFuY2UtPkRSID0gKCh1aW50MzJfdClwQnVmZmVyWzJVICogaV0gPDwgMTZVKSB8ICh1aW50MzJfdClwQnVmZmVyWygyVSAqIGkpICsgMVVdOworICB9CisgIGlmICgoQnVmZmVyTGVuZ3RoICUgMlUpICE9IDBVKQorICB7CisgICAgcFJlZyA9IChfX0lPIHVpbnQxNl90ICopKF9fSU8gdm9pZCAqKSgmaGNyYy0+SW5zdGFuY2UtPkRSKTsgICAgICAgICAgICAgICAgIC8qIERlcm9nYXRpb24gTWlzcmFDMjAxMiBSLjExLjUgKi8KKyAgICAqcFJlZyA9IHBCdWZmZXJbMlUgKiBpXTsKKyAgfQorCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovCisgIHJldHVybiBoY3JjLT5JbnN0YW5jZS0+RFI7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfY3JjX2V4LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9jcmNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU3OTZkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfY3JjX2V4LmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2NyY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDUkMgcGVyaXBoZXJhbC4KKyAgKgorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICgrKSBTZXQgdXNlci1kZWZpbmVkIGdlbmVyYXRpbmcgcG9seW5vbWlhbCB0aHJ1IEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldCgpCisgICAgICAgICAoKykgQ29uZmlndXJlIElucHV0IG9yIE91dHB1dCBkYXRhIGludmVyc2lvbgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ0V4IENSQ0V4CisgICogQGJyaWVmIENSQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgZ2VuZXJhdGluZyBwb2x5bm9taWFsCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBpbnB1dCBkYXRhIGludmVyc2lvbgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgb3V0cHV0IGRhdGEgaW52ZXJzaW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUkMgcG9seW5vbWlhbCBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0IG9uZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgUG9sIENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKDcsIDgsIDE2IG9yIDMyLWJpdCBsb25nKS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHdyaXR0ZW4gaW4gbm9ybWFsIHJlcHJlc2VudGF0aW9uLCBlLmcuCisgICogICAgICAgICBAYXJnIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDcsIFheNyArIFheNiArIFheNSArIFheMiArIDEgaXMgd3JpdHRlbiAweDY1CisgICogICAgICAgICBAYXJnIGZvciBhIHBvbHlub21pYWwgb2YgZGVncmVlIDE2LCBYXjE2ICsgWF4xMiArIFheNSArIDEgaXMgd3JpdHRlbiAweDEwMjEKKyAgKiBAcGFyYW0gIFBvbHlMZW5ndGggQ1JDIHBvbHlub21pYWwgbGVuZ3RoLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfN0IgIDctYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDcpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzhCICA4LWJpdCBsb25nIENSQyAoZ2VuZXJhdGluZyBwb2x5bm9taWFsIG9mIGRlZ3JlZSA4KQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF8xNkIgMTYtYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDE2KQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF8zMkIgMzItYml0IGxvbmcgQ1JDIChnZW5lcmF0aW5nIHBvbHlub21pYWwgb2YgZGVncmVlIDMyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X1BvbHlub21pYWxfU2V0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBQb2wsIHVpbnQzMl90IFBvbHlMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgbXNiID0gMzFVOyAvKiBwb2x5bm9taWFsIGRlZ3JlZSBpcyAzMiBhdCBtb3N0LCBzbyBtc2IgaXMgaW5pdGlhbGl6ZWQgdG8gbWF4IHZhbHVlICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19QT0xfTEVOR1RIKFBvbHlMZW5ndGgpKTsKKworICAvKiBjaGVjayBwb2x5bm9taWFsIGRlZmluaXRpb24gdnMgcG9seW5vbWlhbCBzaXplOgorICAgKiBwb2x5bm9taWFsIGxlbmd0aCBtdXN0IGJlIGFsaWduZWQgd2l0aCBwb2x5bm9taWFsCisgICAqIGRlZmluaXRpb24uIEhBTF9FUlJPUiBpcyByZXBvcnRlZCBpZiBQb2wgZGVncmVlIGlzCisgICAqIGxhcmdlciB0aGFuIHRoYXQgaW5kaWNhdGVkIGJ5IFBvbHlMZW5ndGguCisgICAqIExvb2sgZm9yIE1TQiBwb3NpdGlvbjogbXNiIHdpbGwgY29udGFpbiB0aGUgZGVncmVlIG9mCisgICAqICB0aGUgc2Vjb25kIHRvIHRoZSBsYXJnZXN0IHBvbHlub21pYWwgbWVtYmVyLiBFLmcuLCBmb3IKKyAgICogIFheNyArIFheNiArIFheNSArIFheMiArIDEsIG1zYiA9IDYuICovCisgIHdoaWxlICgobXNiLS0gPiAwVSkgJiYgKChQb2wgJiAoKHVpbnQzMl90KSgweDFVKSA8PCAobXNiICYgMHgxRlUpKSkgPT0gMFUpKQorICB7CisgIH0KKworICBzd2l0Y2ggKFBvbHlMZW5ndGgpCisgIHsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzdCOgorICAgICAgaWYgKG1zYiA+PSBIQUxfQ1JDX0xFTkdUSF83QikKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gICBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzhCOgorICAgICAgaWYgKG1zYiA+PSBIQUxfQ1JDX0xFTkdUSF84QikKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gICBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENSQ19QT0xZTEVOR1RIXzE2QjoKKyAgICAgIGlmIChtc2IgPj0gSEFMX0NSQ19MRU5HVEhfMTZCKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSAgIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF8zMkI6CisgICAgICAvKiBubyBwb2x5bm9taWFsIGRlZmluaXRpb24gdnMuIHBvbHlub21pYWwgbGVuZ3RoIGlzc3VlIHBvc3NpYmxlICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogc2V0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+UE9MLCBQb2wpOworCisgICAgLyogc2V0IGdlbmVyYXRpbmcgcG9seW5vbWlhbCBzaXplICovCisgICAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9QT0xZU0laRSwgUG9seUxlbmd0aCk7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUmV2ZXJzZSBJbnB1dCBkYXRhIG1vZGUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIElucHV0UmV2ZXJzZU1vZGUgSW5wdXQgRGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX05PTkUgICAgIG5vIGNoYW5nZSBpbiBiaXQgb3JkZXIgKGRlZmF1bHQgdmFsdWUpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUgICAgIEJ5dGUtd2lzZSBiaXQgcmV2ZXJzYWwKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQgSGFsZldvcmQtd2lzZSBiaXQgcmV2ZXJzYWwKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgV29yZC13aXNlIGJpdCByZXZlcnNhbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X0lucHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgSW5wdXRSZXZlcnNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19JTlBVVERBVEFfSU5WRVJTSU9OX01PREUoSW5wdXRSZXZlcnNlTW9kZSkpOworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICAvKiBzZXQgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZSAqLworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9JTiwgSW5wdXRSZXZlcnNlTW9kZSk7CisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUmV2ZXJzZSBPdXRwdXQgZGF0YSBtb2RlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRSZXZlcnNlTW9kZSBPdXRwdXQgRGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFIG5vIENSQyBpbnZlcnNpb24gKGRlZmF1bHQgdmFsdWUpCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUgIGJpdC1sZXZlbCBpbnZlcnNpb24gKGUuZy4gZm9yIGEgOC1iaXQgQ1JDOiAweEI1IGJlY29tZXMgMHhBRCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBPdXRwdXRSZXZlcnNlTW9kZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKE91dHB1dFJldmVyc2VNb2RlKSk7CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOworCisgIC8qIHNldCBvdXRwdXQgZGF0YSBpbnZlcnNpb24gbW9kZSAqLworICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1JFVl9PVVQsIE91dHB1dFJldmVyc2VNb2RlKTsKKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfY3J5cC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfY3J5cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmQ5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9jcnlwLmMKQEAgLTAsMCArMSw1MzAyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jcnlwLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ3J5cHRvZ3JhcGh5IChDUllQKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiwgc2V0IGNvbmZpZyBhbmQgZ2V0IGNvbmZpZyAgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgREVTL1RERVMsIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIERNQSBjYWxsYmFjayBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIENSWVAgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBpbiBDUllQIG9yIFRpbnlBRVMgcGVyaXBoZXJhbCBhcyBmb2xsb3dzOgorCisgICAgICAoIylJbml0aWFsaXplIHRoZSBDUllQIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfQ1JZUF9Nc3BJbml0KCk6CisgICAgICAgICAoIyMpIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0NSWVBfQ0xLX0VOQUJMRSgpb3IgX19IQUxfUkNDX0FFU19DTEtfRU5BQkxFIGZvciBUaW55QUVTIHBlcmlwaGVyYWwKKyAgICAgICAgICgjIykgSW4gY2FzZSBvZiB1c2luZyBpbnRlcnJ1cHRzIChlLmcuIEhBTF9DUllQX0VuY3J5cHRfSVQoKSkKKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIENSWVAgaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIENSWVAgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKKyAgICAgICAgICAgICAoKysrKSBJbiBDUllQIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9DUllQX0lSUUhhbmRsZXIoKQorICAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIERNQSB0byBjb250cm9sIGRhdGEgdHJhbnNmZXIgKGUuZy4gSEFMX0NSWVBfRW5jcnlwdF9ETUEoKSkKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fUkNDX0RNQXhfQ0xLX0VOQUJMRSgpCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIGFuZCBlbmFibGUgdHdvIERNQSBzdHJlYW1zIG9uZSBmb3IgbWFuYWdpbmcgZGF0YSB0cmFuc2ZlciBmcm9tCisgICAgICAgICAgICAgICAgIG1lbW9yeSB0byBwZXJpcGhlcmFsIChpbnB1dCBzdHJlYW0pIGFuZCBhbm90aGVyIHN0cmVhbSBmb3IgbWFuYWdpbmcgZGF0YQorICAgICAgICAgICAgICAgICB0cmFuc2ZlciBmcm9tIHBlcmlwaGVyYWwgdG8gbWVtb3J5IChvdXRwdXQgc3RyZWFtKQorICAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgQ1JZUCBETUEgaGFuZGxlCisgICAgICAgICAgICAgICAgIHVzaW5nICBfX0hBTF9MSU5LRE1BKCkKKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZQorICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgb24gdGhlIHR3byBETUEgU3RyZWFtcy4gVGhlIG91dHB1dCBzdHJlYW0gc2hvdWxkIGhhdmUgaGlnaGVyCisgICAgICAgICAgICAgICAgIHByaW9yaXR5IHRoYW4gdGhlIGlucHV0IHN0cmVhbSBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGFuZCBIQUxfTlZJQ19FbmFibGVJUlEoKQorCisgICAgICAoIylJbml0aWFsaXplIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgOgorICAgICAgICAgKCMjKSBUaGUgZGF0YSB0eXBlOiAxLWJpdCwgOC1iaXQsIDE2LWJpdCBvciAzMi1iaXQuCisgICAgICAgICAoIyMpIFRoZSBrZXkgc2l6ZTogMTI4LCAxOTIgb3IgMjU2LgorICAgICAgICAgKCMjKSBUaGUgQWxnb01vZGUgREVTLyBUREVTIEFsZ29yaXRobSBFQ0IvQ0JDIG9yIEFFUyBBbGdvcml0aG0gRUNCL0NCQy9DVFIvR0NNIG9yIENDTS4KKyAgICAgICAgICgjIykgVGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoY291bnRlcikuIEl0IGlzIG5vdCB1c2VkIGluIEVDQiBtb2RlLgorICAgICAgICAgKCMjKSBUaGUga2V5IGJ1ZmZlciB1c2VkIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCisgICAgICAgICAgICAgKCsrKykgSW4gc29tZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucywgdGhlIGtleSBpcyB3cml0dGVuIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgIGNvZGUgb3V0IG9mIHRoZSBIQUwgc2NvcGUuIEluIHRoYXQgY2FzZSwgdXNlciBjYW4gc3RpbGwgcmVzb3J0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgIEhBTCBBUElzIGFzIHVzdWFsIGJ1dCBtdXN0IG1ha2Ugc3VyZSB0aGF0IHBLZXkgcG9pbnRlciBpcyBzZXQgdG8gTlVMTC4KKyAgICAgICAgICgjIykgVGhlIEhlYWRlciB1c2VkIG9ubHkgaW4gQUVTIEdDTSBhbmQgQ0NNIEFsZ29yaXRobSBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgICAoIyMpIFRoZSBIZWFkZXJTaXplIFRoZSBzaXplIG9mIGhlYWRlciBidWZmZXIgaW4gd29yZC4KKyAgICAgICAgICgjIykgVGhlIEIwIGJsb2NrIGlzIHRoZSBmaXJzdCBhdXRoZW50aWNhdGlvbiBibG9jayB1c2VkIG9ubHkgIGluIEFFUyBDQ00gbW9kZS4KKworICAgICAgKCMpVGhyZWUgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbi9kZWNyeXB0aW9uKSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAgICAgICAgICgjIykgUG9sbGluZyBtb2RlOiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEFQSXMgYXJlIGJsb2NraW5nIGZ1bmN0aW9ucworICAgICAgICAgICAgICBpLmUuIHRoZXkgcHJvY2VzcyB0aGUgZGF0YSBhbmQgd2FpdCB0aWxsIHRoZSBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLAorICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0VuY3J5cHQgJiBIQUxfQ1JZUF9EZWNyeXB0CisgICAgICAgICAoIyMpIEludGVycnVwdCBtb2RlOiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEFQSXMgYXJlIG5vdCBibG9ja2luZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgdW5kZXIgaW50ZXJydXB0LAorICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0VuY3J5cHRfSVQgJiBIQUxfQ1JZUF9EZWNyeXB0X0lUCisgICAgICAgICAoIyMpIERNQSBtb2RlOiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEFQSXMgYXJlIG5vdCBibG9ja2luZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgaS5lLiB0aGUgZGF0YSB0cmFuc2ZlciBpcyBlbnN1cmVkIGJ5IERNQSwKKyAgICAgICAgICAgICAgZS5nLiBIQUxfQ1JZUF9FbmNyeXB0X0RNQSAmIEhBTF9DUllQX0RlY3J5cHRfRE1BCisKKyAgICAgICgjKVdoZW4gdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IGZpcnN0IHRpbWUgYWZ0ZXIgSEFMX0NSWVBfSW5pdCgpCisgICAgICAgICB0aGUgQ1JZUCBwZXJpcGhlcmFsIGlzIGNvbmZpZ3VyZWQgYW5kIHByb2Nlc3NlcyB0aGUgYnVmZmVyIGluIGlucHV0LgorICAgICAgICAgQXQgc2Vjb25kIGNhbGwsIG5vIG5lZWQgdG8gSW5pdGlhbGl6ZSB0aGUgQ1JZUCwgdXNlciBoYXZlIHRvIGdldCBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdmlhCisgICAgICAgICBIQUxfQ1JZUF9HZXRDb25maWcoKSBBUEksIHRoZW4gb25seSAgSEFMX0NSWVBfU2V0Q29uZmlnKCkgaXMgcmVxdWVzdGVkIHRvIHNldAorICAgICAgICAgbmV3IHBhcmFtZXRyZXMsIGZpbmFsbHkgdXNlciBjYW4gIHN0YXJ0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4KKworICAgICAgICgjKUNhbGwgSEFMX0NSWVBfRGVJbml0KCkgdG8gZGVpbml0aWFsaXplIHRoZSBDUllQIHBlcmlwaGVyYWwuCisKKyAgICAgICAoIylUbyBwcm9jZXNzIGEgc2luZ2xlIG1lc3NhZ2Ugd2l0aCBjb25zZWN1dGl2ZSBjYWxscyB0byBIQUxfQ1JZUF9FbmNyeXB0KCkgb3IgSEFMX0NSWVBfRGVjcnlwdCgpCisgICAgICAgICAgd2l0aG91dCBoYXZpbmcgdG8gY29uZmlndXJlIGFnYWluIHRoZSBLZXkgb3IgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciBiZXR3ZWVuIGVhY2ggQVBJIGNhbGwsCisgICAgICAgICAgdGhlIGZpZWxkIEtleUlWQ29uZmlnU2tpcCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlIG11c3QgYmUgc2V0IHRvIENSWVBfS0VZSVZDT05GSUdfT05DRS4KKyAgICAgICAgICBTYW1lIGlzIHRydWUgZm9yIGNvbnNlY3V0aXZlIGNhbGxzIG9mIEhBTF9DUllQX0VuY3J5cHRfSVQoKSwgSEFMX0NSWVBfRGVjcnlwdF9JVCgpLCBIQUxfQ1JZUF9FbmNyeXB0X0RNQSgpCisgICAgICAgICAgb3IgSEFMX0NSWVBfRGVjcnlwdF9ETUEoKS4KKworICAgIFsuLl0KKyAgICAgIFRoZSBjcnlwdG9ncmFwaGljIHByb2Nlc3NvciBzdXBwb3J0cyBmb2xsb3dpbmcgc3RhbmRhcmRzOgorICAgICAgKCMpIFRoZSBkYXRhIGVuY3J5cHRpb24gc3RhbmRhcmQgKERFUykgYW5kIFRyaXBsZS1ERVMgKFRERVMpIHN1cHBvcnRlZCBvbmx5IGJ5IENSWVAxIHBlcmlwaGVyYWw6CisgICAgICAgICAoIyMpNjQtYml0IGRhdGEgYmxvY2sgcHJvY2Vzc2luZworICAgICAgICAgKCMjKSBjaGFpbmluZyBtb2RlcyBzdXBwb3J0ZWQgOgorICAgICAgICAgICAgICgrKyspICBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCisgICAgICAgICAgICAgKCsrKykgIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQorICAgICAgICAgKCMjKSBrZXlzIGxlbmd0aCBzdXBwb3J0ZWQgOjY0LWJpdCwgMTI4LWJpdCBhbmQgMTkyLWJpdC4KKyAgICAgICgjKSBUaGUgYWR2YW5jZWQgZW5jcnlwdGlvbiBzdGFuZGFyZCAoQUVTKSBzdXBwb3J0ZWQgIGJ5IENSWVAxICYgVGlueUFFUyBwZXJpcGhlcmFsOgorICAgICAgICAgKCMjKTEyOC1iaXQgZGF0YSBibG9jayBwcm9jZXNzaW5nCisgICAgICAgICAoIyMpIGNoYWluaW5nIG1vZGVzIHN1cHBvcnRlZCA6CisgICAgICAgICAgICAgKCsrKykgIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKKyAgICAgICAgICAgICAoKysrKSAgQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCisgICAgICAgICAgICAgKCsrKykgIENvdW50ZXIgbW9kZSAoQ1RSKQorICAgICAgICAgICAgICgrKyspICBHYWxvaXMvY291bnRlciBtb2RlIChHQ00vR01BQykKKyAgICAgICAgICAgICAoKysrKSAgQ291bnRlciB3aXRoIENpcGhlciBCbG9jayBDaGFpbmluZy1NZXNzYWdlKENDTSkKKyAgICAgICAgICgjIykga2V5cyBsZW5ndGggU3VwcG9ydGVkIDoKKyAgICAgICAgICAgICAoKysrKSBmb3IgQ1JZUDEgcGVyaXBoZXJhbDogMTI4LWJpdCwgMTkyLWJpdCBhbmQgMjU2LWJpdC4KKyAgICAgICAgICAgICAoKysrKSBmb3IgVGlueUFFUyBwZXJpcGhlcmFsOiAgMTI4LWJpdCBhbmQgMjU2LWJpdAorCisgICAgWy4uXQorICAgIChAKSBTcGVjaWZpYyBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZm9ybWF0IHRoZSBrZXkgYW5kIHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYhCisKKyAgICBbLi5dIElmIHRoZSBrZXkgaXMgZGVmaW5lZCBhcyBhIDEyOC1iaXQgbG9uZyBhcnJheSBrZXlbMTI3Li4wXSA9IHtiMTI3IC4uLiBiMH0gd2hlcmUKKyAgICAgICAgIGIxMjcgaXMgdGhlIE1TQiBhbmQgYjAgdGhlIExTQiwgdGhlIGtleSBtdXN0IGJlIHN0b3JlZCBpbiBNQ1UgbWVtb3J5CisgICAgICAgICAoKykgYXMgYSBzZXF1ZW5jZSBvZiB3b3JkcyB3aGVyZSB0aGUgTVNCIHdvcmQgY29tZXMgZmlyc3QgKG9jY3VwaWVzIHRoZQorICAgICAgICAgICBsb3dlc3QgbWVtb3J5IGFkZHJlc3MpCisgICAgICAgICAgKCsrKSAgIGFkZHJlc3MgbiswIDogMGIgYjEyNyAuLiBiMTIwIGIxMTkgLi4gYjExMiBiMTExIC4uIGIxMDQgYjEwMyAuLiBiOTYKKyAgICAgICAgICAoKyspICAgYWRkcmVzcyBuKzQgOiAwYiBiOTUgLi4gYjg4IGI4NyAuLiBiODAgYjc5IC4uIGI3MiBiNzEgLi4gYjY0CisgICAgICAgICAgKCsrKSAgIGFkZHJlc3Mgbis4IDogMGIgYjYzIC4uIGI1NiBiNTUgLi4gYjQ4IGI0NyAuLiBiNDAgYjM5IC4uIGIzMgorICAgICAgICAgICgrKykgICBhZGRyZXNzIG4rQyA6IDBiIGIzMSAuLiBiMjQgYjIzIC4uIGIxNiBiMTUgLi4gYjggYjcgLi4gYjAKKyAgICAgWy4uXSBIZXJlYWZ0ZXIsIGFub3RoZXIgaWxsdXN0cmF0aW9uIHdoZW4gY29uc2lkZXJpbmcgYSAxMjgtYml0IGxvbmcga2V5IG1hZGUgb2YgMTYgYnl0ZXMge0IxNS4uQjB9LgorICAgICAgICAgVGhlIDQgMzItYml0IHdvcmRzIHRoYXQgbWFrZSB0aGUga2V5IG11c3QgYmUgc3RvcmVkIGFzIGZvbGxvd3MgaW4gTUNVIG1lbW9yeToKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzAgOiAweCBCMTUgQjE0IEIxMyBCMTIKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzQgOiAweCBCMTEgQjEwIEI5IEI4CisgICAgICAgICAgKCspICAgIGFkZHJlc3Mgbis4IDogMHggQjcgQjYgQjUgQjQKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuK0MgOiAweCBCMyBCMiBCMSBCMAorICAgICBbLi5dICB3aGljaCBsZWFkcyB0byB0aGUgZXhwZWN0ZWQgc2V0dGluZworICAgICAgICgrKSAgICAgICBBRVNfS0VZUjMgPSAweCBCMTUgQjE0IEIxMyBCMTIKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIyID0gMHggQjExIEIxMCBCOSBCOAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjEgPSAweCBCNyBCNiBCNSBCNAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjAgPSAweCBCMyBCMiBCMSBCMAorCisgICAgWy4uXSAgU2FtZSBmb3JtYXQgbXVzdCBiZSBhcHBsaWVkIGZvciBhIDI1Ni1iaXQgbG9uZyBrZXkgbWFkZSBvZiAzMiBieXRlcyB7QjMxLi5CMH0uCisgICAgICAgICAgVGhlIDggMzItYml0IHdvcmRzIHRoYXQgbWFrZSB0aGUga2V5IG11c3QgYmUgc3RvcmVkIGFzIGZvbGxvd3MgaW4gTUNVIG1lbW9yeToKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzAwIDogMHggQjMxIEIzMCBCMjkgQjI4CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswNCA6IDB4IEIyNyBCMjYgQjI1IEIyNAorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMDggOiAweCBCMjMgQjIyIEIyMSBCMjAKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzBDIDogMHggQjE5IEIxOCBCMTcgQjE2CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbisxMCA6IDB4IEIxNSBCMTQgQjEzIEIxMgorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMTQgOiAweCBCMTEgQjEwIEI5IEI4CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbisxOCA6IDB4IEI3IEI2IEI1IEI0CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbisxQyA6IDB4IEIzIEIyIEIxIEIwCisgICAgIFsuLl0gIHdoaWNoIGxlYWRzIHRvIHRoZSBleHBlY3RlZCBzZXR0aW5nCisgICAgICAgKCspICAgICAgIEFFU19LRVlSNyA9IDB4IEIzMSBCMzAgQjI5IEIyOAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjYgPSAweCBCMjcgQjI2IEIyNSBCMjQKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVI1ID0gMHggQjIzIEIyMiBCMjEgQjIwCisgICAgICAgKCspICAgICAgIEFFU19LRVlSNCA9IDB4IEIxOSBCMTggQjE3IEIxNgorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjMgPSAweCBCMTUgQjE0IEIxMyBCMTIKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIyID0gMHggQjExIEIxMCBCOSBCOAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjEgPSAweCBCNyBCNiBCNSBCNAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjAgPSAweCBCMyBCMiBCMSBCMAorCisgICAgWy4uXSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYgKDQgMzItYml0IHdvcmRzKSBmb3JtYXQgbXVzdCBmb2xsb3cgdGhlIHNhbWUgYXMKKyAgICAgICAgIHRoYXQgb2YgYSAxMjgtYml0IGxvbmcga2V5LgorCisgICAgWy4uXSBOb3RlIHRoYXQga2V5IGFuZCBJViByZWdpc3RlcnMgYXJlIG5vdCBzZW5zaXRpdmUgdG8gc3dhcCBtb2RlIHNlbGVjdGlvbi4KKworICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIEFFUyBHYWxvaXMvY291bnRlciBtb2RlIChHQ00pIHN1cHBvcnRlZCBieSBib3RoIENSWVAxIGFuZCBUaW55QUVTIHBlcmlwaGVyYWxzOgorICAgICAgKCMpICBBbGdvcml0aG0gc3VwcG9ydGVkIDoKKyAgICAgICAgICgjIykgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQorICAgICAgICAgKCMjKSBHYWxvaXMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIChHTUFDKSA6aXMgZXhhY3RseSB0aGUgc2FtZSBhcworICAgICAgICAgICAgICBHQ00gYWxnb3JpdGhtIGNvbXBvc2VkIG9ubHkgYnkgYW4gaGVhZGVyLgorICAgICAgKCMpICBGb3VyIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGluIEdDTSA6CisgICAgICAgICAoIyMpIEluaXQgcGhhc2U6IHBlcmlwaGVyYWwgcHJlcGFyZXMgdGhlIEdDTSBoYXNoIHN1YmtleSAoSCkgYW5kIGRvIHRoZSBJViBwcm9jZXNzaW5nCisgICAgICAgICAoIyMpIEhlYWRlciBwaGFzZTogcGVyaXBoZXJhbCBwcm9jZXNzZXMgdGhlIEFkZGl0aW9uYWwgQXV0aGVudGljYXRlZCBEYXRhIChBQUQpLCB3aXRoIGhhc2gKKyAgICAgICAgICBjb21wdXRhdGlvbiBvbmx5LgorICAgICAgICAgKCMjKSBQYXlsb2FkIHBoYXNlOiBwZXJpcGhlcmFsIHByb2Nlc3NlcyB0aGUgcGxhaW50ZXh0IChQKSB3aXRoIGhhc2ggY29tcHV0YXRpb24gKyBrZXlzdHJlYW0KKyAgICAgICAgICBlbmNyeXB0aW9uICsgZGF0YSBYT1JpbmcuIEl0IHdvcmtzIGluIGEgc2ltaWxhciB3YXkgZm9yIGNpcGhlcnRleHQgKEMpLgorICAgICAgICAgKCMjKSBGaW5hbCBwaGFzZTogcGVyaXBoZXJhbCBnZW5lcmF0ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgdGFnIChUKSB1c2luZyB0aGUgbGFzdCBibG9jayBvZiBkYXRhLgorICAgICAgKCMpICBzdHJ1Y3R1cmUgb2YgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gaW4gR0NNIGlzIGRlZmluZWQgYXMgYmVsb3cgIDoKKyAgICAgICAgICgjIykgMTYgYnl0ZXMgSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpY29tcG9zZWQgb2YgSVYgYW5kIGNvdW50ZXIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDQgorICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgIHwgICAgICAgSW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgICAgICB8ICBDb3VudGVyICAgICAgfAorICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfAorICAgICAgICAgMTI3ICAgICAgICAgICAgICA5NSAgICAgICAgICAgICAgICA2MyAgICAgICAgICAgIDMxICAgICAgIDAKKworCisgICAgICAgICAgICAgIEJpdCBOdW1iZXIgICAgUmVnaXN0ZXIgICAgICAgICAgIENvbnRlbnRzCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgMTI3IC4uLjk2ICAgIENSWVBfSVYxUlszMTowXSAgICAgSUNCWzEyNzo5Nl0KKyAgICAgICAgICAgICAgOTUgIC4uLjY0ICAgIENSWVBfSVYxTFszMTowXSAgICAgQjBbOTU6NjRdCisgICAgICAgICAgICAgIDYzIC4uLiAzMiAgICBDUllQX0lWMFJbMzE6MF0gICAgIElDQls2MzozMl0KKyAgICAgICAgICAgICAgMzEgLi4uIDAgICAgIENSWVBfSVYwTFszMTowXSAgICAgSUNCWzMxOjBdLCB3aGVyZSAzMi1iaXQgY291bnRlcj0gMHgyCisKKworCisgICAgICAgICAoIyMpIFRoZSBhdXRoZW50aWNhdGVkIGhlYWRlciBBIChhbHNvIGtub3dzIGFzIEFkZGl0aW9uYWwgQXV0aGVudGljYXRpb24gRGF0YSBBQUQpCisgICAgICAgICAgdGhpcyBwYXJ0IG9mIHRoZSBtZXNzYWdlIGlzIG9ubHkgYXV0aGVudGljYXRlZCwgbm90IGVuY3J5cHRlZC4KKyAgICAgICAgICgjIykgVGhlIHBsYWludGV4dCBtZXNzYWdlIFAgaXMgYm90aCBhdXRoZW50aWNhdGVkIGFuZCBlbmNyeXB0ZWQgYXMgY2lwaGVydGV4dC4KKyAgICAgICAgICBHQ00gc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgY2lwaGVydGV4dCBoYXMgc2FtZSBiaXQgbGVuZ3RoIGFzIHRoZSBwbGFpbnRleHQuCisgICAgICAgICAoIyMpIFRoZSBsYXN0IGJsb2NrIGlzIGNvbXBvc2VkIG9mIHRoZSBsZW5ndGggb2YgQSAob24gNjQgYml0cykgYW5kIHRoZSBsZW5ndGggb2YgY2lwaGVydGV4dAorICAgICAgICAgIChvbiA2NCBiaXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NNIGxhc3QgYmxvY2sgZGVmaW5pdGlvbgorICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgIHwgIEJpdFswXSAgIHwgIEJpdFszMl0gICAgICAgICAgIHwgIEJpdFs2NF0gIHwgQml0Wzk2XSAgICAgICAgICAgICAgfAorICAgICAgICAgIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgIHwgICAweDAgICAgIHwgSGVhZGVyIGxlbmd0aFszMTowXXwgICAgIDB4MCAgIHwgUGF5bG9hZCBsZW5ndGhbMzE6MF0gfAorICAgICAgICAgIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlIFRoZSBBRVMgQ291bnRlciB3aXRoIENpcGhlciBCbG9jayBDaGFpbmluZy1NZXNzYWdlCisgICAgICAgICAgQXV0aGVudGljYXRpb24gQ29kZSAoQ0NNKSBzdXBwb3J0ZWQgYnkgYm90aCBDUllQMSBhbmQgVGlueUFFUyBwZXJpcGhlcmFsOgorICAgICAgKCMpICBTcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciBDQ00gIDoKKworICAgICAgICAgKCMjKSBCMCBibG9jayAgOiBBY2NvcmRpbmcgdG8gTklTVCBTcGVjaWFsIFB1YmxpY2F0aW9uIDgwMC0zOEMsCisgICAgICAgICAgICBUaGUgZmlyc3QgYmxvY2sgQjAgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3MsIHdoZXJlIGwobSkgaXMgZW5jb2RlZCBpbgorICAgICAgICAgICAgbW9zdC1zaWduaWZpY2FudC1ieXRlIGZpcnN0IG9yZGVyOgorCisgICAgICAgICAgICAgICAgT2N0ZXQgTnVtYmVyICAgQ29udGVudHMKKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICBGbGFncworICAgICAgICAgICAgICAgIDEgLi4uIDE1LXEgICAgIE5vbmNlIE4KKyAgICAgICAgICAgICAgICAxNi1xIC4uLiAxNSAgICBRCisKKyAgICAgICAgICAgIHRoZSBGbGFncyBmaWVsZCBpcyBmb3JtYXR0ZWQgYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgIEJpdCBOdW1iZXIgICBDb250ZW50cworICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgNyAgICAgICAgICAgIFJlc2VydmVkIChhbHdheXMgemVybykKKyAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgQWRhdGEKKyAgICAgICAgICAgICAgICA1IC4uLiAzICAgICAgKHQtMikvMgorICAgICAgICAgICAgICAgIDIgLi4uIDAgICAgICBbcS0xXTMKKworICAgICAgICAgICAgICAtIFE6IGEgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2N0ZXQgbGVuZ3RoIG9mIFAgKHBsYWludGV4dCkKKyAgICAgICAgICAgICAgLSBxIFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2N0ZXQgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkCisgICAgICAgICAgICAgIC0gQSBub25jZSAoTiksIG4gVGhlIG9jdGV0IGxlbmd0aCBvZiB0aGUgd2hlcmUgbitxPTE1LgorICAgICAgICAgICAgICAtIEZsYWdzOiBtb3N0IHNpZ25pZmljYW50IG9jdGV0IGNvbnRhaW5pbmcgZm91ciBmbGFncyBmb3IgY29udHJvbCBpbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgLSB0IFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIE1BQy4KKyAgICAgICAgICgjIykgQjEgYmxvY2sgKGhlYWRlcikgOiBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoKGEpIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkKKyAgICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIChhKSBkZWZpbmVkIGFzIGJlbG93OgorICAgICAgICAgICAgLSBJZiAwIDwgYSA8IDIxNi0yOCwgdGhlbiBpdCBpcyBlbmNvZGVkIGFzIFthXTE2LCBpLmUuIHR3byBvY3RldHMKKyAgICAgICAgICAgIC0gSWYgMjE2LTI4IDwgYSA8IDIzMiwgdGhlbiBpdCBpcyBlbmNvZGVkIGFzIDB4ZmYgfHwgMHhmZSB8fCBbYV0zMiwgaS5lLiBzaXggb2N0ZXRzCisgICAgICAgICAgICAtIElmIDIzMiA8IGEgPCAyNjQsIHRoZW4gaXQgaXMgZW5jb2RlZCBhcyAweGZmIHx8IDB4ZmYgfHwgW2FdNjQsIGkuZS4gdGVuIG9jdGV0cworICAgICAgICAgKCMjKSBDVFJ4IGJsb2NrICA6IGNvbnRyb2wgYmxvY2tzCisgICAgICAgICAgICAtIEdlbmVyYXRpb24gb2YgQ1RSMSBmcm9tIGZpcnN0IGJsb2NrIEIwIGluZm9ybWF0aW9uIDoKKyAgICAgICAgICAgICAgZXF1YWwgdG8gQjAgd2l0aCBmaXJzdCA1IGJpdHMgemVyb2VkIGFuZCBtb3N0IHNpZ25pZmljYW50IGJpdHMgc3RvcmluZyBvY3RldAorICAgICAgICAgICAgICBsZW5ndGggb2YgUCBhbHNvIHplcm9lZCwgdGhlbiBpbmNyZW1lbnRlZCBieSBvbmUKKworICAgICAgICAgICAgICAgIEJpdCBOdW1iZXIgICAgUmVnaXN0ZXIgICAgICAgICAgIENvbnRlbnRzCisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIDEyNyAuLi45NiAgICBDUllQX0lWMVJbMzE6MF0gICAgIEIwWzEyNzo5Nl0sIHdoZXJlIFEgbGVuZ3RoIGJpdHMgYXJlIHNldCB0byAwLCBleGNlcHQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgdGhhdCBpcyBzZXQgdG8gMQorICAgICAgICAgICAgICAgIDk1ICAuLi42NCAgICBDUllQX0lWMUxbMzE6MF0gICAgIEIwWzk1OjY0XQorICAgICAgICAgICAgICAgIDYzIC4uLiAzMiAgICBDUllQX0lWMFJbMzE6MF0gICAgIEIwWzYzOjMyXQorICAgICAgICAgICAgICAgIDMxIC4uLiAwICAgICBDUllQX0lWMExbMzE6MF0gICAgIEIwWzMxOjBdLCB3aGVyZSBmbGFnIGJpdHMgc2V0IHRvIDAKKworICAgICAgICAgICAgLSBHZW5lcmF0aW9uIG9mIENUUjA6IHNhbWUgYXMgQ1RSMSB3aXRoIGJpdFswXSBzZXQgdG8gemVyby4KKworICAgICAgKCMpICBGb3VyIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGluIENDTSBmb3IgQ1JZUDEgcGVyaXBoZXJhbDoKKyAgICAgICAgICgjIykgSW5pdCBwaGFzZTogcGVyaXBoZXJhbCBwcmVwYXJlcyB0aGUgR0NNIGhhc2ggc3Via2V5IChIKSBhbmQgZG8gdGhlIElWIHByb2Nlc3NpbmcKKyAgICAgICAgICgjIykgSGVhZGVyIHBoYXNlOiBwZXJpcGhlcmFsIHByb2Nlc3NlcyB0aGUgQWRkaXRpb25hbCBBdXRoZW50aWNhdGVkIERhdGEgKEFBRCksIHdpdGggaGFzaAorICAgICAgICAgIGNvbXB1dGF0aW9uIG9ubHkuCisgICAgICAgICAoIyMpIFBheWxvYWQgcGhhc2U6IHBlcmlwaGVyYWwgcHJvY2Vzc2VzIHRoZSBwbGFpbnRleHQgKFApIHdpdGggaGFzaCBjb21wdXRhdGlvbiArIGtleXN0cmVhbQorICAgICAgICAgIGVuY3J5cHRpb24gKyBkYXRhIFhPUmluZy4gSXQgd29ya3MgaW4gYSBzaW1pbGFyIHdheSBmb3IgY2lwaGVydGV4dCAoQykuCisgICAgICAgICAoIyMpIEZpbmFsIHBoYXNlOiBwZXJpcGhlcmFsIGdlbmVyYXRlcyB0aGUgYXV0aGVudGljYXRlZCB0YWcgKFQpIHVzaW5nIHRoZSBsYXN0IGJsb2NrIG9mIGRhdGEuCisgICAgICAoIykgICAgQ0NNIGluIFRpbnlBRVMgcGVyaXBoZXJhbDoKKyAgICAgICAgICgjIykgVG8gcGVyZm9ybSBtZXNzYWdlIHBheWxvYWQgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIEFFUyBpcyBjb25maWd1cmVkIGluIENUUiBtb2RlLgorICAgICAgICAgKCMjKSBGb3IgYXV0aGVudGljYXRpb24gdHdvIHBoYXNlcyBhcmUgcGVyZm9ybWVkIDoKKyAgICAgICAgICAtIEhlYWRlciBwaGFzZTogcGVyaXBoZXJhbCBwcm9jZXNzZXMgdGhlIEFkZGl0aW9uYWwgQXV0aGVudGljYXRlZCBEYXRhIChBQUQpIGZpcnN0LCB0aGVuIHRoZSBjbGVhcnRleHQgbWVzc2FnZQorICAgICAgICAgIG9ubHkgY2xlYXJ0ZXh0IHBheWxvYWQgKG5vdCB0aGUgY2lwaGVydGV4dCBwYXlsb2FkKSBpcyB1c2VkIGFuZCBubyBvdXRwb3V0LgorICAgICAgICAgKCMjKSBGaW5hbCBwaGFzZTogcGVyaXBoZXJhbCBnZW5lcmF0ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgdGFnIChUKSB1c2luZyB0aGUgbGFzdCBibG9jayBvZiBkYXRhLgorCisgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXQorICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soKSBvciBIQUxfQ1JZUF9SZWdpc3RlclhYWENhbGxiYWNrKCkKKyAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorCisgIFsuLl0KKyAgRnVuY3Rpb24gQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEluQ3BsdENhbGxiYWNrICAgICA6ICBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgICAoKykgT3V0Q3BsdENhbGxiYWNrICAgIDogT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBDUllQIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IENSWVAgTXNwRGVJbml0LgorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgWy4uXQorICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgIHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICBhbmQgdGhlIENhbGxiYWNrIElELgorICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBJbkNwbHRDYWxsYmFjayAgICAgOiAgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICAgKCspIE91dENwbHRDYWxsYmFjayAgICA6IE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogQ1JZUCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBDUllQIE1zcERlSW5pdC4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9DUllQX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX0NSWVBfU1RBVEVfUkVTRVQKKyAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zIDoKKyAgZXhhbXBsZXMgQHJlZiBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjaygpICwgQHJlZiBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soKS4KKyAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9uIGluIHRoZSBAcmVmIEhBTF9DUllQX0luaXQoKS8gQHJlZiBIQUxfQ1JZUF9EZUluaXQoKSBvbmx5IHdoZW4KKyAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgaWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9DUllQX0luaXQoKSAvIEByZWYgSEFMX0NSWVBfRGVJbml0KCkKKyAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQorCisgIFsuLl0KKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfQ1JZUF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgaW4gSEFMX0NSWVBfU1RBVEVfUkVBRFkgb3IgSEFMX0NSWVBfU1RBVEVfUkVTRVQgc3RhdGUsCisgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgdXNpbmcgQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQ1JZUF9EZUluaXQoKQorICBvciBAcmVmIEhBTF9DUllQX0luaXQoKSBmdW5jdGlvbi4KKworICBbLi5dCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisKKyAgKioqIFN1c3BlbmQvUmVzdW1lIGZlYXR1cmUgKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgd2hlbiBzZXQgdG8gMQorICBhbGxvd3MgdGhlIHVzZXIgdG8gcmVzb3J0IHRvIHRoZSBzdXNwZW5kL3Jlc3VtZSBmZWF0dXJlLgorICBBIGxvdyBwcmlvcml0eSBibG9jayBwcm9jZXNzaW5nIGNhbiBiZSBzdXNwZW5kZWQgdG8gcHJvY2VzcyBhIGhpZ2ggcHJpb3JpdHkgYmxvY2sKKyAgaW5zdGVhZC4gV2hlbiB0aGUgaGlnaCBwcmlvcml0eSBibG9jayBwcm9jZXNzaW5nIGlzIG92ZXIsIHRoZSBsb3cgcHJpb3JpdHkgYmxvY2sKKyAgcHJvY2Vzc2luZyBjYW4gYmUgcmVzdW1lZCwgcmVzdGFydGluZyBmcm9tIHRoZSBwb2ludCB3aGVyZSBpdCB3YXMgc3VzcGVuZGVkLiBUaGlzCisgIGZlYXR1cmUgaXMgYXBwbGljYWJsZSBvbmx5IGluIG5vbi1ibG9ja2luZyBpbnRlcnJ1cHQgbW9kZS4KKworICBbLi5dIFVzZXIgbXVzdCByZXNvcnQgdG8gSEFMX0NSWVBfU3VzcGVuZCgpIHRvIHN1c3BlbmQgdGhlIGxvdyBwcmlvcml0eSBibG9jaworICBwcm9jZXNzaW5nLiBUaGlzIEFQSSBtYW5hZ2VzIHRoZSBoYXJkd2FyZSBibG9jayBwcm9jZXNzaW5nIHN1c3BlbnNpb24gYW5kIHNhdmVzIGFsbCB0aGUKKyAgaW50ZXJuYWwgZGF0YSB0aGF0IHdpbGwgYmUgbmVlZGVkIHRvIHJlc3RhcnQgbGF0ZXIgb24uIFVwb24gSEFMX0NSWVBfU3VzcGVuZCgpIGNvbXBsZXRpb24sCisgIHRoZSB1c2VyIGNhbiBsYXVuY2ggdGhlIHByb2Nlc3Npbmcgb2YgYW55IG90aGVyIGJsb2NrIChoaWdoIHByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcpLgorCisgIFsuLl0gV2hlbiB0aGUgaGlnaCBwcmlvcml0eSBibG9jayBwcm9jZXNzaW5nIGlzIG92ZXIsIHVzZXIgbXVzdCBpbnZva2UgSEFMX0NSWVBfUmVzdW1lKCkKKyAgdG8gcmVzdW1lIHRoZSBsb3cgcHJpb3JpdHkgYmxvY2sgcHJvY2Vzc2luZy4gQ2lwaGVyaW5nIChvciBkZWNpcGhlcmluZykgcmVzdGFydHMgZnJvbQorICB0aGUgc3VzcGVuc2lvbiBwb2ludCBhbmQgZW5kcyBhcyB1c3VhbC4KKworICBbLi5dIEhBTF9DUllQX1N1c3BlbmQoKSByZXBvcnRzIGFuIGVycm9yIHdoZW4gdGhlIHN1c3BlbnNpb24gcmVxdWVzdCBpcyBzZW50IHRvbyBsYXRlCisgIChpLmUgd2hlbiB0aGUgbG93IHByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcgaXMgYWJvdXQgdG8gZW5kKS4gVGhlcmUgaXMgbm8gdXNlIHRvCisgIHN1c3BlbmQgdGhlIHRhZyBnZW5lcmF0aW9uIHByb2Nlc3NpbmcgZm9yIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMuCisKKyAgICBbLi5dCisgICAgKEApIElmIHRoZSBrZXkgaXMgd3JpdHRlbiBvdXQgb2YgSEFMIHNjb3BlIChjYXNlIHBLZXkgcG9pbnRlciBzZXQgdG8gTlVMTCBieSB0aGUgdXNlciksCisgICAgICAgIHRoZSBibG9jayBwcm9jZXNzaW5nIHN1c3BlbnNpb24vcmVzdW1wdGlvbiBtZWNoYW5pc20gaXMgTk9UIGFwcGxpY2FibGUuCisKKyAgICBbLi5dCisgICAgKEApIElmIHRoZSBLZXkgYW5kIEluaXRpYWxpemF0aW9uIFZlY3RvciBhcmUgY29uZmlndXJlZCBvbmx5IG9uY2UgYW5kIGNvbmZpZ3VyYXRpb24gaXMKKyAgICAgICAgc2tpcHBlZCBmb3IgY29uc2VjdXRpdmUgcHJvY2Vzc2luZ3MgKGNhc2UgS2V5SVZDb25maWdTa2lwIHNldCB0byBDUllQX0tFWUlWQ09ORklHX09OQ0UpLAorICAgICAgICB0aGUgYmxvY2sgcHJvY2Vzc2luZyBzdXNwZW5zaW9uL3Jlc3VtcHRpb24gbWVjaGFuaXNtIGlzIE5PVCBhcHBsaWNhYmxlLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUAorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKEFFUykKKyNpZmRlZiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfRGVmaW5lcworICAqIEB7CisgICovCisjZGVmaW5lIENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTiAgICAgIDgyVSAgICAgICAgIC8qIFRoZSBsYXRlbmN5IG9mIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpb24gaXMgODIgY2xvY2sgY3ljbGVzLiovCisjZGVmaW5lIENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0UgICAgIDI5OVUgICAgICAgIC8qIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGluaXQgcGhhc2UgdG8gcHJlcGFyZSBoYXNoIHN1YmtleSBpcyAyOTkgY2xvY2sgY3ljbGVzLiovCisjZGVmaW5lIENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRSAgIDI5MFUgICAgICAgIC8qIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGhlYWRlciBwaGFzZSBpcyAyOTAgY2xvY2sgY3ljbGVzLiovCisKKyNkZWZpbmUgQ1JZUF9QSEFTRV9SRUFEWSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgcmVhZHkgZm9yIGluaXRpYWxpemF0aW9uLiAqLworI2RlZmluZSBDUllQX1BIQVNFX1BST0NFU1MgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyNkZWZpbmUgIENSWVBfUEhBU0VfSEVBREVSX1NVU1BFTkRFRCAgICAgMHgwMDAwMDAwNFUgICAgLyohPCBHQ00vR01BQy9DQ00gaGVhZGVyIHBoYXNlIGlzIHN1c3BlbmRlZCAqLworI2RlZmluZSAgQ1JZUF9QSEFTRV9QQVlMT0FEX1NVU1BFTkRFRCAgICAweDAwMDAwMDA1VSAgICAvKiE8IEdDTS9DQ00gcGF5bG9hZCBwaGFzZSBpcyBzdXNwZW5kZWQgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisKKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlKE1vZGUgMSkgICovCisjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OICAgICAgICAgICAgIEFFU19DUl9NT0RFXzAgICAvKiE8IEtleSBkZXJpdmF0aW9uIG1vZGUgIG9ubHkgdXNlZCB3aGVuIHBlcmZvcm1pbmcgRUNCIGFuZCBDQkMgZGVjcnlwdGlvbnMgKE1vZGUgMikgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgQUVTX0NSX01PREVfMSAgIC8qITwgRGVjcnlwdGlvbiAgICAoTW9kZSAzKSAgICAqLworI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUICAgICBBRVNfQ1JfTU9ERSAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBhbmQgZGVjcnlwdGlvbiBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zIChNb2RlIDQpICovCisjZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IEdDTS9HTUFDIChvciBDQ00pIGluaXQgcGhhc2UgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICAgICovCisjZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSCAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSAgZmluYWwgcGhhc2UgKi8KKworLyogIENUUjEgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KKyNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8wICAgICAgICAgICAgICAgICAgMHgwN0ZGRkZGRlUKKyNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8xICAgICAgICAgICAgICAgICAgMHhGRkZGRkYwMFUKKyNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUllQX1NFVF9QSEFTRShfX0hBTkRMRV9fLCBfX1BIQVNFX18pICBkb3soX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5BRVNfQ1JfR0NNUEgpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KShfX1BIQVNFX18pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgc3RydWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKK3N0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcik7CitzdGF0aWMgdm9pZCBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBDUllQX0RNQU91dENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBLZXlTaXplKTsKK3N0YXRpYyB2b2lkIENSWVBfQUVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgdm9pZCBDUllQX0FFU19Qcm9jZXNzRGF0YShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwdCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbkNDRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKKyNpZiAoVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FID09IDFVKQorc3RhdGljIHZvaWQgQ1JZUF9SZWFkX0lWUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQpOworc3RhdGljIHZvaWQgQ1JZUF9Xcml0ZV9JVlJlZ2lzdGVycyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCogSW5wdXQpOworc3RhdGljIHZvaWQgQ1JZUF9SZWFkX1N1c3BlbmRSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIE91dHB1dCk7CitzdGF0aWMgdm9pZCBDUllQX1dyaXRlX1N1c3BlbmRSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0KTsKK3N0YXRpYyB2b2lkIENSWVBfUmVhZF9LZXlSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIE91dHB1dCwgdWludDMyX3QgS2V5U2l6ZSk7CitzdGF0aWMgdm9pZCBDUllQX1dyaXRlX0tleVJlZ2lzdGVycyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCogSW5wdXQsIHVpbnQzMl90IEtleVNpemUpOworc3RhdGljIHZvaWQgQ1JZUF9QaGFzZVByb2Nlc3NpbmdSZXN1bWUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiwgZGUtaW5pdGlhbGl6YXRpb24gYW5kIFNldCBhbmQgR2V0IGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIENSWVAKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSWVAKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQIE1TUAorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKKyAgICAgICgrKSBjb25maWd1cmUgQ1JZUCAoSEFMX0NSWVBfU2V0Q29uZmlnKSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmCisgICAgICAgICAgUGFyYW1ldGVycyB3aGljaCBhcmUgY29uZmlndXJlZCBpbiBUaGlzIHNlY3Rpb24gYXJlIDoKKyAgICAgICAgICAoKykgS2V5IHNpemUKKyAgICAgICAgICAoKykgRGF0YSBUeXBlIDogMzIsMTYsIDggb3IgMWJpdAorICAgICAgICAgICgrKSBBbGdvTW9kZSA6CisgICAgICAgICAgICAgIC0gZm9yIENSWVAxIHBlcmlwaGVyYWwgOgorICAgICAgICAgICAgICAgICBFQ0IgYW5kIENCQyBpbiBERVMvVERFUyBTdGFuZGFyZAorICAgICAgICAgICAgICAgICBFQ0IsQ0JDLENUUixHQ00vR01BQyBhbmQgQ0NNIGluIEFFUyBTdGFuZGFyZC4KKyAgICAgICAgICAgICAgLSBmb3IgVGlueUFFUzIgcGVyaXBoZXJhbCwgb25seSBFQ0IsQ0JDLENUUixHQ00vR01BQyBhbmQgQ0NNIGluIEFFUyBTdGFuZGFyZCBhcmUgc3VwcG9ydGVkLgorICAgICAgKCspIEdldCBDUllQIGNvbmZpZ3VyYXRpb24gKEhBTF9DUllQX0dldENvbmZpZykgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfSGFuZGxlVHlwZURlZgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoY3J5cCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfS0VZU0laRShoY3J5cC0+SW5pdC5LZXlTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0RBVEFUWVBFKGhjcnlwLT5Jbml0LkRhdGFUeXBlKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0FMR09SSVRITShoY3J5cC0+SW5pdC5BbGdvcml0aG0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfSU5JVChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXApKTsKKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjcnlwLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrICA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgSW5DcGx0Q2FsbGJhY2sgICAqLworICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgKi8KKyAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayAgID0gSEFMX0NSWVBfRXJyb3JDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICovCisKKyAgICBpZiAoaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2soaGNyeXApOworICB9CisjZWxzZQorICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjcnlwLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0NSWVBfTXNwSW5pdChoY3J5cCk7CisgIH0KKyNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKworICAvKiBTZXQgdGhlIGtleSBzaXplIChUaGlzIGJpdCBmaWVsZCBpcyBkbyBub3QgY2FyZSBpbiB0aGUgREVTIG9yIFRERVMgbW9kZXMpLCBkYXRhIHR5cGUgYW5kIEFsZ29yaXRobSAqLworICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSB8IEFFU19DUl9LRVlTSVpFIHwgQUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisgIC8qIFJlc2V0IEVycm9yIENvZGUgZmllbGQgKi8KKyAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7CisKKyAgLyogUmVzZXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gZmxhZyAqLworICBoY3J5cC0+S2V5SVZDb25maWcgPSAwVTsKKworICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KKyAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZXMgdGhlIENSWVAgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNyeXAgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOworCisgIC8qIFJlc2V0IENyeXBJbkNvdW50IGFuZCBDcnlwT3V0Q291bnQgKi8KKyAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDA7CisgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwOworCisgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisKKyAgaWYgKGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrKGhjcnlwKTsKKworI2Vsc2UKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgSEFMX0NSWVBfTXNwRGVJbml0KGhjcnlwKTsKKworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgcENvbmYgcG9pbnRlciB0byBhIENSWVBfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZikKK3sKKyAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKChoY3J5cCA9PSBOVUxMKSB8fCAocENvbmYgPT0gTlVMTCkpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKHBDb25mLT5LZXlTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0RBVEFUWVBFKHBDb25mLT5EYXRhVHlwZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0ocENvbmYtPkFsZ29yaXRobSkpOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qIFNldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLworICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlICAgPSBwQ29uZi0+RGF0YVR5cGU7CisgICAgaGNyeXAtPkluaXQucEtleSAgICAgICA9IHBDb25mLT5wS2V5OworICAgIGhjcnlwLT5Jbml0LkFsZ29yaXRobSAgPSBwQ29uZi0+QWxnb3JpdGhtOworICAgIGhjcnlwLT5Jbml0LktleVNpemUgICAgPSBwQ29uZi0+S2V5U2l6ZTsKKyAgICBoY3J5cC0+SW5pdC5wSW5pdFZlY3QgID0gcENvbmYtPnBJbml0VmVjdDsKKyAgICBoY3J5cC0+SW5pdC5IZWFkZXIgICAgID0gcENvbmYtPkhlYWRlcjsKKyAgICBoY3J5cC0+SW5pdC5IZWFkZXJTaXplID0gcENvbmYtPkhlYWRlclNpemU7CisgICAgaGNyeXAtPkluaXQuQjAgICAgICAgICA9IHBDb25mLT5CMDsKKyAgICBoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID0gcENvbmYtPkRhdGFXaWR0aFVuaXQ7CisKKyAgICAvKiBTZXQgdGhlIGtleSBzaXplIChUaGlzIGJpdCBmaWVsZCBpcyBkbyBub3QgY2FyZSBpbiB0aGUgREVTIG9yIFRERVMgbW9kZXMpLCBkYXRhIHR5cGUgYW5kIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSB8IEFFU19DUl9LRVlTSVpFIHwgQUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisgICAgLypjbGVhciBlcnJvciBmbGFncyovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0VSUl9DTEVBUik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIFJlc2V0IEVycm9yIENvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KKyAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOworCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDUllQIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBDb25mIHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKQoreworICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoKGhjcnlwID09IE5VTEwpIHx8IChwQ29uZiA9PSBOVUxMKSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBHZXQgIENSWVAgcGFyYW1ldGVycyAgKi8KKyAgICBwQ29uZi0+RGF0YVR5cGUgICAgICAgID0gaGNyeXAtPkluaXQuRGF0YVR5cGU7CisgICAgcENvbmYtPnBLZXkgICAgICAgICAgICA9IGhjcnlwLT5Jbml0LnBLZXk7CisgICAgcENvbmYtPkFsZ29yaXRobSAgICAgICA9IGhjcnlwLT5Jbml0LkFsZ29yaXRobTsKKyAgICBwQ29uZi0+S2V5U2l6ZSAgICAgICAgID0gaGNyeXAtPkluaXQuS2V5U2l6ZSA7CisgICAgcENvbmYtPnBJbml0VmVjdCAgICAgICA9IGhjcnlwLT5Jbml0LnBJbml0VmVjdDsKKyAgICBwQ29uZi0+SGVhZGVyICAgICAgICAgID0gaGNyeXAtPkluaXQuSGVhZGVyIDsKKyAgICBwQ29uZi0+SGVhZGVyU2l6ZSAgICAgID0gaGNyeXAtPkluaXQuSGVhZGVyU2l6ZTsKKyAgICBwQ29uZi0+QjAgICAgICAgICAgICAgID0gaGNyeXAtPkluaXQuQjA7CisgICAgcENvbmYtPkRhdGFXaWR0aFVuaXQgICAgPSBoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0OworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgTVNQLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9Nc3BJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcnlwKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgQ1JZUCBNU1AuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQX01zcERlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUllQX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBDUllQIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBoY3J5cCBjcnlwIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0lOUFVUX0NPTVBMRVRFX0NCX0lEIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcENSWVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DUllQX0lOUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIENSWVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIENSWVAgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhjcnlwIGNyeXAgaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1VuUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DUllQX0lOUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrID0gSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayAgSW5DcGx0Q2FsbGJhY2sgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgT3V0Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgPSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBDUllQIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiB3aGVuIGluIGludGVycnVwdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEBub3RlICAgU2V0IHRoZSBoYW5kbGUgZmllbGQgU3VzcGVuZFJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHNvIHRoYXQKKyAgKiAgICAgICAgIHRoZSBvbi1nb2luZyBDUllQIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkIGFzIHNvb24gYXMgdGhlIHJlcXVpcmVkCisgICogICAgICAgICBjb25kaXRpb25zIGFyZSBtZXQuCisgICogQG5vdGUgICBIQUxfQ1JZUF9Qcm9jZXNzU3VzcGVuZCgpIGNhbiBvbmx5IGJlIGludm9rZWQgd2hlbiB0aGUgcHJvY2Vzc2luZyBpcyBkb25lCisgICogICAgICAgICBpbiBub24tYmxvY2tpbmcgaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBJdCBpcyBhZHZpc2VkIG5vdCB0byBzdXNwZW5kIHRoZSBDUllQIHByb2Nlc3Npbmcgd2hlbiB0aGUgRE1BIGNvbnRyb2xsZXIKKyAgKiAgICAgICAgIGlzIG1hbmFnaW5nIHRoZSBkYXRhIHRyYW5zZmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ1JZUF9Qcm9jZXNzU3VzcGVuZChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBTZXQgSGFuZGxlIFN1c3BlbmRSZXF1ZXN0IGZpZWxkICovCisgIGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9IEhBTF9DUllQX1NVU1BFTkQ7Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgIENSWVAgcHJvY2Vzc2luZyBzdXNwZW5zaW9uIGFuZCBwZXJpcGhlcmFsIGludGVybmFsIHBhcmFtZXRlcnMgc3RvcmFnZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBub3RlICAgcGVyaXBoZXJhbCBpbnRlcm5hbCBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgdG8gYmUgcmVhZGlseSBhdmFpbGFibGUgd2hlbgorICAqICAgICAgICAgc3VzcGVuZGVkIHByb2Nlc3NpbmcgaXMgcmVzdW1lZCBsYXRlciBvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1N1c3BlbmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUmVxdWVzdCBzdXNwZW5zaW9uICovCisgIEhBTF9DUllQX1Byb2Nlc3NTdXNwZW5kKGhjcnlwKTsKKworICB3aGlsZSAoKEhBTF9DUllQX0dldFN0YXRlKGhjcnlwKSAhPSBIQUxfQ1JZUF9TVEFURV9TVVNQRU5ERUQpICYmIFwKKyAgICAgICAgICAoSEFMX0NSWVBfR2V0U3RhdGUoaGNyeXApICE9IEhBTF9DUllQX1NUQVRFX1JFQURZKSk7CisKKyAgaWYgKEhBTF9DUllQX0dldFN0YXRlKGhjcnlwKSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3Npbmcgd2FzIGFscmVhZHkgb3ZlciBvciB3YXMgYWJvdXQgdG8gZW5kLiBObyBzdXNwZW5zaW9uIGRvbmUgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFN1c3BlbmQgUHJvY2Vzc2luZyAqLworCisgICAgLyogSWYgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyBvbi1nb2luZywgY2Fycnkgb3V0IGZpcnN0IHNhdmluZyBzdGVwcworICAgICAgIGJlZm9yZSBkaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpIHx8IFwKKyAgICAgICAgIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkKKyAgICB7CisgICAgICAgIC8qIFNhdmUgU3VzcGVuc2lvbiByZWdpc3RlcnMgKi8KKyAgICAgICAgQ1JZUF9SZWFkX1N1c3BlbmRSZWdpc3RlcnMoaGNyeXAsIGhjcnlwLT5TVVNQeFJfc2F2ZWQpOworICAgICAgICAvKiBTYXZlIEtleSAqLworICAgICAgICBDUllQX1JlYWRfS2V5UmVnaXN0ZXJzKGhjcnlwLCBoY3J5cC0+S2V5X3NhdmVkLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKyAgICAgICAgLyogU2F2ZSBJViAqLworICAgICAgICBDUllQX1JlYWRfSVZSZWdpc3RlcnMoaGNyeXAsIGhjcnlwLT5JVl9zYXZlZCk7CisgICAgfQorICAgIC8qIERpc2FibGUgQUVTICovCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgIC8qIFNhdmUgbG93LXByaW9yaXR5IGJsb2NrIENSWVAgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgICBoY3J5cC0+SW5pdF9zYXZlZCAgICAgICAgICAgICAgPSBoY3J5cC0+SW5pdDsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHJfc2F2ZWQgICAgPSBoY3J5cC0+cENyeXBJbkJ1ZmZQdHI7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0cl9zYXZlZCAgID0gaGNyeXAtPnBDcnlwT3V0QnVmZlB0cjsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnRfc2F2ZWQgICAgICAgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudF9zYXZlZCAgICAgID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgICBoY3J5cC0+UGhhc2Vfc2F2ZWQgICAgICAgICAgICAgPSBoY3J5cC0+UGhhc2U7CisgICAgaGNyeXAtPlN0YXRlX3NhdmVkICAgICAgICAgICAgID0gaGNyeXAtPlN0YXRlOworICAgIGhjcnlwLT5TaXplX3NhdmVkICAgICAgICAgICAgICA9ICggKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpID8gaGNyeXAtPlNpemUgLzQgOiBoY3J5cC0+U2l6ZSk7CisgICAgaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uX3NhdmVkID0gaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnRfc2F2ZWQgICA9IGhjcnlwLT5DcnlwSGVhZGVyQ291bnQ7CisgICAgaGNyeXAtPlN1c3BlbmRSZXF1ZXN0ICAgICAgICAgID0gSEFMX0NSWVBfU1VTUEVORF9OT05FOworCisgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0JDKSB8fCBcCisgICAgICAgIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKKyAgICB7CisgICAgICAvKiBTYXZlIEluaXRpYWxpc2F0aW9uIFZlY3RvciByZWdpc3RlcnMgKi8KKyAgICAgIENSWVBfUmVhZF9JVlJlZ2lzdGVycyhoY3J5cCwgaGNyeXAtPklWX3NhdmVkKTsKKyAgICB9CisKKyAgICAvKiBTYXZlIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICBoY3J5cC0+Q1Jfc2F2ZWQgPSBoY3J5cC0+SW5zdGFuY2UtPkNSOworCisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENSWVAgcHJvY2Vzc2luZyByZXN1bXB0aW9uLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQG5vdGUgICBQcm9jZXNzaW5nIHJlc3RhcnRzIGF0IHRoZSBleGFjdCBwb2ludCB3aGVyZSBpdCB3YXMgc3VzcGVuZGVkLCBiYXNlZAorICAqICAgICAgICAgb24gdGhlIHBhcmFtZXRlcnMgc2F2ZWQgYXQgc3VzcGVuc2lvbiB0aW1lLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVzdW1lKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIGlmIChoY3J5cC0+U3RhdGVfc2F2ZWQgIT0gSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEKQorICB7CisgICAgLyogQ1JZUCB3YXMgbm90IHN1c3BlbmRlZCAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisKKyAgICAvKiBSZXN0b3JlIGxvdy1wcmlvcml0eSBibG9jayBDUllQIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgICAgaGNyeXAtPkluaXQgICAgICAgICAgICA9IGhjcnlwLT5Jbml0X3NhdmVkOworICAgIGhjcnlwLT5TdGF0ZSAgICAgICAgICAgPSBoY3J5cC0+U3RhdGVfc2F2ZWQ7CisKKyAgICAvKiBDaGFpbmluZyBhbGdvcml0aG1zIGNhc2UgKi8KKyAgICBpZiAoKGhjcnlwLT5Jbml0X3NhdmVkLkFsZ29yaXRobSA9PSBDUllQX0FFU19FQ0IpIHx8IFwKKyAgICAgICAgKGhjcnlwLT5Jbml0X3NhdmVkLkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpIHx8IFwKKyAgICAgICAgKGhjcnlwLT5Jbml0X3NhdmVkLkFsZ29yaXRobSA9PSBDUllQX0FFU19DVFIpKQorICAgIHsKKyAgICAgIC8qIFJlc3RvcmUgbG93LXByaW9yaXR5IGJsb2NrIENSWVAgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbl9zYXZlZDsKKworICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0JDKSB8fCBcCisgICAgICAgIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluaXQucEluaXRWZWN0ICAgICA9IGhjcnlwLT5JVl9zYXZlZDsKKyAgICAgIH0KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisgICAgICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgIC8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgY2FzZSAqLworICAgIHsKKyAgICAgIC8qIFJlc3RvcmUgbG93LXByaW9yaXR5IGJsb2NrIENSWVAgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSAgICAgICAgICAgPSBoY3J5cC0+UGhhc2Vfc2F2ZWQ7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gaGNyeXAtPkNyeXBIZWFkZXJDb3VudF9zYXZlZDsKKworICAgICAgLyogRGlzYWJsZSBBRVMgYW5kIHdyaXRlLWJhY2sgU1VTUHhSIHJlZ2lzdGVycyAqLzsKKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisgICAgICAvKiBSZXN0b3JlIEFFUyBTdXNwZW5kIFJlZ2lzdGVycyAqLworICAgICAgQ1JZUF9Xcml0ZV9TdXNwZW5kUmVnaXN0ZXJzKGhjcnlwLCBoY3J5cC0+U1VTUHhSX3NhdmVkKTsKKyAgICAgIC8qIFJlc3RvcmUgQ29udHJvbCwgIEtleSBhbmQgSVYgUmVnaXN0ZXJzLCB0aGVuIGVuYWJsZSBBRVMgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+Q1IgPSBoY3J5cC0+Q1Jfc2F2ZWQ7CisgICAgICBDUllQX1dyaXRlX0tleVJlZ2lzdGVycyhoY3J5cCwgaGNyeXAtPktleV9zYXZlZCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisgICAgICBDUllQX1dyaXRlX0lWUmVnaXN0ZXJzKGhjcnlwLCBoY3J5cC0+SVZfc2F2ZWQpOworICAgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAvKiBBdCB0aGUgc2FtZSB0aW1lLCBzZXQgaGFuZGxlIHN0YXRlIGJhY2sgdG8gUkVBRFkgdG8gYmUgYWJsZSB0byByZXN1bWUgdGhlIEFFUyBjYWxjdWxhdGlvbnMKKyAgICAgIHdpdGhvdXQgdGhlIHByb2Nlc3NpbmcgQVBJcyByZXR1cm5pbmcgSEFMX0JVU1kgd2hlbiBjYWxsZWQuICovCisgICAgICBoY3J5cC0+U3RhdGUgICAgICAgID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgfQorCisKKyAgICAvKiBSZXN1bWUgbG93LXByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcgdW5kZXIgSVQgKi8KKyAgICBoY3J5cC0+UmVzdW1pbmdGbGFnID0gMVU7CisgICAgaWYgKFJFQURfQklUKGhjcnlwLT5DUl9zYXZlZCwgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICAgIHsKKyAgICAgIGlmIChIQUxfQ1JZUF9FbmNyeXB0X0lUKGhjcnlwLCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHJfc2F2ZWQsIGhjcnlwLT5TaXplX3NhdmVkLCBoY3J5cC0+cENyeXBPdXRCdWZmUHRyX3NhdmVkKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoSEFMX0NSWVBfRGVjcnlwdF9JVChoY3J5cCwgaGNyeXAtPnBDcnlwSW5CdWZmUHRyX3NhdmVkLCBoY3J5cC0+U2l6ZV9zYXZlZCwgaGNyeXAtPnBDcnlwT3V0QnVmZlB0cl9zYXZlZCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIGRlZmluZWQgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRW5jcnlwdGlvbiBEZWNyeXB0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFbmNyeXB0aW9uIERlY3J5cHRpb24gZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRW5jcnlwdCBEZWNyeXB0ICBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEFQSSBhbGxvd2luZyB0byBFbmNyeXB0L0RlY3J5cHQgRGF0YSBmb2xsb3dpbmcKKyAgICAgICAgICBTdGFuZGFyZCBERVMvVERFUyBvciBBRVMsIGFuZCBBbGdvcml0aG0gY29uZmlndXJlZCBieSB0aGUgdXNlcjoKKyAgICAgICgrKSBTdGFuZGFyZCBERVMvVERFUyBvbmx5IHN1cHBvcnRlZCBieSBDUllQMSBwZXJpcGhlcmFsLCBiZWxvdyBsaXN0IG9mIEFsZ29yaXRobSBzdXBwb3J0ZWQgOgorICAgICAgICAgICAtIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKKyAgICAgICAgICAgLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKKyAgICAgICgrKSBTdGFuZGFyZCBBRVMgIHN1cHBvcnRlZCBieSBDUllQMSBwZXJpcGhlcmFsICYgVGlueUFFUywgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkOgorICAgICAgICAgICAtIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKKyAgICAgICAgICAgLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKKyAgICAgICAgICAgLSBDb3VudGVyIG1vZGUgKENUUikKKyAgICAgICAgICAgLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKKyAgICAgICAgICAgLSBDb3VudGVyIG1vZGUgKENUUikKKyAgICAgICAgICAgLSBHYWxvaXMvY291bnRlciBtb2RlIChHQ00pCisgICAgICAgICAgIC0gQ291bnRlciB3aXRoIENpcGhlciBCbG9jayBDaGFpbmluZy1NZXNzYWdlKENDTSkKKyAgICBbLi5dICBUaHJlZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlOgorICAgICAgKCspIFBvbGxpbmcgbW9kZSA6IEhBTF9DUllQX0VuY3J5cHQgJiBIQUxfQ1JZUF9EZWNyeXB0CisgICAgICAoKykgSW50ZXJydXB0IG1vZGUgOiBIQUxfQ1JZUF9FbmNyeXB0X0lUICYgSEFMX0NSWVBfRGVjcnlwdF9JVAorICAgICAgKCspIERNQSBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9ETUEgJiBIQUxfQ1JZUF9EZWNyeXB0X0RNQQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkLgorICAqIEBwYXJhbSAgT3V0cHV0IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIoY2lwaGVydGV4dCkKKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgYWxnbzsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKKworICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorCisgICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlY3J5cHRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihwbGFpbnRleHQpCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgYWxnbzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgIHBhcmFtZXRlcnMqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgRGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorCisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIElucHV0IFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAocGxhaW50ZXh0KQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZAorICAqIEBwYXJhbSAgT3V0cHV0IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIoY2lwaGVydGV4dCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90IGFsZ287CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisgICBpZiAoaGNyeXAtPlJlc3VtaW5nRmxhZyA9PSAxVSkKKyAgIHsKKyAgICAgaGNyeXAtPlJlc3VtaW5nRmxhZyA9IDBVOworICAgICBpZiAoaGNyeXAtPlBoYXNlICE9IENSWVBfUEhBU0VfSEVBREVSX1NVU1BFTkRFRCkKKyAgICAgeworICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudF9zYXZlZDsKKyAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudF9zYXZlZDsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CisgICAgIH0KKyAgIH0KKyAgIGVsc2UKKyNlbmRpZiAgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisgICB7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOworICAgfQorCisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKKworICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0VuY3J5cHRfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKKworICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIElucHV0IFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoY2lwaGVydGV4dCApCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkLgorICAqIEBwYXJhbSAgT3V0cHV0IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIocGxhaW50ZXh0KQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgYWxnbzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgIGlmIChoY3J5cC0+UmVzdW1pbmdGbGFnID09IDFVKQorICAgeworICAgICBoY3J5cC0+UmVzdW1pbmdGbGFnID0gMFU7CisgICAgIGlmIChoY3J5cC0+UGhhc2UgIT0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEKQorICAgICB7CisgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50X3NhdmVkOworICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50X3NhdmVkOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICAgfQorICAgfQorICAgZWxzZQorI2VuZGlmICAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKyAgIHsKKyAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgIH0KKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorCisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkLgorICAqIEBwYXJhbSAgT3V0cHV0IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIoY2lwaGVydGV4dCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0VuY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCBhbGdvOworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKKworICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgICAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCisgICAgICAgICAgeworICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDJVKTsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgQUVTICovCisgICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICAgIHN0YXR1cyA9IEhBTF9PSzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIElucHV0IFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoY2lwaGVydGV4dCApCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihwbGFpbnRleHQpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgYWxnbzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIsIHBDcnlwT3V0QnVmZlB0ciBhbmQgU2l6ZSBwYXJhbWV0ZXJzKi8KKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKKworICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfRE1BKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgQ1JZUCBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogQGJyaWVmICAgIENSWVAgSVJRIGhhbmRsZXIuCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQ1JZUCBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zLgorICAgICAgKCspIEhBTF9DUllQX0lSUUhhbmRsZXIgQ1JZUCBpbnRlcnJ1cHQgcmVxdWVzdAorICAgICAgKCspIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICgrKSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgb3V0cHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICgrKSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrICBDUllQIGVycm9yIGNhbGxiYWNrCisgICAgICAoKykgSEFMX0NSWVBfR2V0U3RhdGUgcmV0dXJuIHRoZSBDUllQIHN0YXRlCisgICAgICAoKykgSEFMX0NSWVBfR2V0RXJyb3IgcmV0dXJuIHRoZSBDUllQIGVycm9yIGNvZGUKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGNyeXB0b2dyYXBoaWMgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworCisgIC8qIENoZWNrIGlmIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsQ1JZUF9JVF9FUlJJRSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBJZiB3cml0ZSBFcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLENSWVBfSVRfV1JFUlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfV1JJVEU7CisgICAgfQorICAgIC8qIElmIHJlYWQgRXJyb3Igb2NjdXJyZWQgKi8KKyAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCxDUllQX0lUX1JERVJSKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1JFQUQ7CisgICAgfQorICB9CisKKyAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfSVRfQ0NGKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQorICAgIHsKKworICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCisgICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIpCisgICAgICB7CisgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KKyAgICAgIHsKKyAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKKyAgICB7CisgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KKyAgICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID49ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQorICAgICAgeworICAgICAgICBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChoY3J5cCk7CisgICAgICB9CisgICAgICBlbHNlICAgLyogaWYgcGF5bG9hZCBwaGFzZSAqLworICAgICAgeworICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKiBBRVMgQWxnb3JpdGhtIEVDQixDQkMgb3IgQ1RSKi8KKyAgICB7CisgICAgICBDUllQX0FFU19JVChoY3J5cCk7CisgICAgfQorICB9Cit9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDUllQIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgIENSWVAgcGVyaXBoZXJhbAorICAqIEByZXR2YWwgQ1JZUCBlcnJvciBjb2RlCisgICovCit1aW50MzJfdCBIQUxfQ1JZUF9HZXRFcnJvcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICByZXR1cm4gaGNyeXAtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBDUllQIHN0YXRlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgcmV0dXJuIGhjcnlwLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcnlwKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDUllQIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIEFsZ29yaXRobSB3aXRoIEFFUyBTdGFuZGFyZAorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgc3BlY2lmeSBUaW1lb3V0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MTZfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgIC8qIEVuYWJsZSBDUllQICovCisgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIHdoaWxlICgoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKKyAgeworICAgIC8qIFdyaXRlIHBsYWluIERkdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLworICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLCBUaW1lb3V0KTsKKyAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgfQorCisgIC8qIERpc2FibGUgQ1JZUCAqLworICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICB9CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDJVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICAvKiBTZXQgdGhlIHBoYXNlICovCisgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKworICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRUNCL0NCQyAmIENUUiBtb2RlIHdpdGggQUVTIFN0YW5kYXJkCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MTZfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKSAgIC8qRUNCIG9yIENCQyovCisgICAgeworICAgICAgaWYgKGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9PSBESVNBQkxFKS8qTW9kZSAyIEtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qIFNldCBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTik7CisKKyAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICYgZXJyb3IgY29kZSovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgICAvKiBSZXR1cm4gdG8gZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZShNb2RlIDMpKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworICAgICAgfQorICAgICAgZWxzZSAvKk1vZGUgNCA6IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24qLworICAgICAgeworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogU2V0IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCisgICAgeworICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKyAgICB9CisKKyAgICAvKiBTZXQgSVYgKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgIC8qIEVuYWJsZSBDUllQICovCisgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIHdoaWxlICgoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKKyAgeworICAgIC8qIFdyaXRlIHBsYWluIGRhdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLworICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLCBUaW1lb3V0KTsKKyAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgfQorCisgIC8qIERpc2FibGUgQ1JZUCAqLworICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRUNCL0NCQyAmIENUUiBtb2RlIHdpdGggQUVTIFN0YW5kYXJkIHVzaW5nIGludGVycnVwdCBtb2RlCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICB9CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0NUUikKKyAgICB7CisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKkFsZ29yaXRobSBDVFIgKi8KKyAgICB7CisgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworICAgIH0KKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDNVKTsKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgLyogU2V0IHRoZSBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisgIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKKyAgeworICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgRE1BIG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICB9CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0NUUikKKyAgICB7CisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKkFsZ29yaXRobSBDVFIgKi8KKyAgICB7CisgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworICAgIH0KKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDNVKTsKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgLyogU2V0IHRoZSBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQorICB7CisgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyICovCisgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplIC8gNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIENSWVAgaW5wdXQgZGF0YSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBTdG9wIHRoZSBETUEgdHJhbnNmZXJzIHRvIHRoZSBJTiBGSUZPIGJ5IGNsZWFyaW5nIHRvICIwIiB0aGUgRE1BSU5FTiAqLworICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQUlORU4pOworCisgIC8qIENhbGwgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBDUllQIG91dHB1dCBkYXRhIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfRE1BT3V0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgdWludDMyX3QgY291bnQ7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgbW9kZTsKKworICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIFN0b3AgdGhlIERNQSB0cmFuc2ZlcnMgdG8gdGhlIE9VVCBGSUZPIGJ5IGNsZWFyaW5nIHRvICIwIiB0aGUgRE1BT1VURU4gKi8KKyAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9ETUFPVVRFTik7CisKKyAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgLyogTGFzdCBibG9jayB0cmFuc2ZlciBpbiBjYXNlIG9mIEdDTSBvciBDQ00gd2l0aCBTaXplIG5vdCAlMTYqLworICBpZiAoKChoY3J5cC0+U2l6ZSkgJSAxNlUpICE9IDBVKQorICB7CisgICAgLyogc2V0IENyeXBJbkNvdW50IGFuZCBDcnlwT3V0Q291bnQgdG8gZXhhY3QgbnVtYmVyIG9mIHdvcmQgYWxyZWFkeSBjb21wdXRlZCB2aWEgRE1BICAqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IChoY3J5cC0+U2l6ZSAvIDE2VSkgKiA0VTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworCisgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgbnBibGIgPSAoKCgodWludDMyX3QpaGNyeXAtPlNpemUgLyAxNlUpICsgMVUpICogMTZVKSAtICgodWludDMyX3QpaGNyeXAtPlNpemUpOworCisgICAgbW9kZSA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERTsKKyAgICBpZiAoKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkgfHwKKyAgICAgICAgKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkpKQorICAgIHsKKyAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgfQorCisgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgfQorCisgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgZm9yIChjb3VudCA9IDBVOyBjb3VudCA8IGxhc3R3b3Jkc2l6ZTsgY291bnQrKykKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50IDwgNFUpCisgICAgeworICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICAvKldhaXQgb24gQ0NGIGZsYWcqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKlJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyAqLworICAgIGZvciAoY291bnQgPSAwVTsgY291bnQgPCA0VTsgY291bnQrKykKKyAgICB7CisgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKworICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgfQorICB9CisKKyAgaWYgKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKSAmJiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgIT0gQ1JZUF9BRVNfQ0NNKSkKKyAgeworICAgIC8qIERpc2FibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSkqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgIC8qIENhbGwgb3V0cHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIENSWVAgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLworICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsKKworICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgRE1BIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXJ0IHRoZSBETUEgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgaW5wdXRhZGRyIGFkZHJlc3Mgb2YgdGhlIGlucHV0IGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KKyAgKiBAcGFyYW0gIG91dHB1dGFkZHIgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9TZXRETUFDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgaW5wdXRhZGRyLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBvdXRwdXRhZGRyKQoreworICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhjcnlwLT5oZG1haW4tPlhmZXJDcGx0Q2FsbGJhY2sgPSBDUllQX0RNQUluQ3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBpbnB1dCBlcnJvciBjYWxsYmFjayAqLworICBoY3J5cC0+aGRtYWluLT5YZmVyRXJyb3JDYWxsYmFjayA9IENSWVBfRE1BRXJyb3I7CisKKyAgLyogU2V0IHRoZSBDUllQIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoY3J5cC0+aGRtYW91dC0+WGZlckNwbHRDYWxsYmFjayA9IENSWVBfRE1BT3V0Q3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBvdXRwdXQgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaGNyeXAtPmhkbWFvdXQtPlhmZXJFcnJvckNhbGxiYWNrID0gQ1JZUF9ETUFFcnJvcjsKKworICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKKyAgeworICAgIC8qIEVuYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNICYgQ0NNKSovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBETUEgaW5wdXQgc3RyZWFtICovCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1haW4sIGlucHV0YWRkciwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRJTlIsIFNpemUpICE9IEhBTF9PSykKKyAgeworICAgIC8qIERNQSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CisKKyAgICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgLyogRW5hYmxlIHRoZSBETUEgb3V0cHV0IHN0cmVhbSAqLworICBpZiAoSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYW91dCwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRPVVRSLCBvdXRwdXRhZGRyLCBTaXplKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCisgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIC8qIEVuYWJsZSBJbiBhbmQgT3V0IERNQSByZXF1ZXN0cyAqLworICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTiB8IEFFU19DUl9ETUFPVVRFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2Nlc3MgRGF0YTogV3JpdGUgSW5wdXQgZGF0YSBpbiBwb2xsaW5nIG1vZGUgYW5kIHVzZWQgaW4gQUVTIGZ1bmN0aW9ucy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfQUVTX1Byb2Nlc3NEYXRhKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCit7CisKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworCisgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKyAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIENSWVAgYmxvY2sgaW5wdXQvb3V0cHV0IGRhdGEgaGFuZGxpbmcgdW5kZXIgaW50ZXJydXB0aW9uLgorICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfQ1JZUF9FbmNyeXB0X0lUIG9yIEhBTF9DUllQX0RlY3J5cHRfSVQuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQorICB7CisgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovCisgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKworICAgIGlmIChoY3J5cC0+Q3J5cE91dENvdW50ID09ICAoaGNyeXAtPlNpemUgLyA0VSkpCisgICAgeworICAgICAgLyogRGlzYWJsZSBDb21wdXRhdGlvbiBDb21wbGV0ZSBmbGFnIGFuZCBlcnJvcnMgaW50ZXJydXB0cyAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIERpc2FibGUgQ1JZUCAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgICAgLyogQ2FsbCBPdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisgICAgICAvKiBJZiBzdXNwZW5zaW9uIGZsYWcgaGFzIGJlZW4gcmFpc2VkLCBzdXNwZW5kIHByb2Nlc3NpbmcKKyAgICAgICAgIG9ubHkgaWYgbm90IGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgcGF5bG9hZCAqLworICAgICAgaWYgKGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9PSBIQUxfQ1JZUF9TVVNQRU5EKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgICAvKiByZXNldCBTdXNwZW5kUmVxdWVzdCAqLworICAgICAgICBoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPSBIQUxfQ1JZUF9TVVNQRU5EX05PTkU7CisgICAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBhbmQgRXJyb3JzIEludGVycnVwdHMgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEOworICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIHBheWxvYWQgcGhhc2UgaXMgc3VzcGVuZGVkICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUEFZTE9BRF9TVVNQRU5ERUQ7CisKKyAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUgLyA0VSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgS2V5IGluIEtleSByZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIEtleVNpemUgU2l6ZSBvZiBLZXkKKyAgKiBAbm90ZSAgIElmIHBLZXkgaXMgTlVMTCwgdGhlIEtleSByZWdpc3RlcnMgYXJlIG5vdCB3cml0dGVuLiBUaGlzIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgIG9jY3VycyB3aGVuIHRoZSBrZXkgaXMgd3JpdHRlbiBvdXQgb2YgSEFMIHNjb3BlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9TZXRLZXkoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgS2V5U2l6ZSkKK3sKKyAgaWYgKGhjcnlwLT5Jbml0LnBLZXkgIT0gTlVMTCkKKyAgeworICAgIHN3aXRjaCAoS2V5U2l6ZSkKKyAgICB7CisgICAgICBjYXNlIENSWVBfS0VZU0laRV8yNTZCOgorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI3ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDFVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDJVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDNVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDRVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDVVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDZVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDdVKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOgorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDFVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDJVKTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDNVKTsKKworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB3b3Jkc2l6ZSA9ICgodWludDMyX3QpaGNyeXAtPlNpemUgLyA0VSkgOworICB1aW50MzJfdCBucGJsYjsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBpbmRleDsKKyAgdWludDMyX3QgbGFzdHdvcmRzaXplOworICB1aW50MzJfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgIHVpbnQzMl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworCisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsICBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKlBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKKworICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKKyAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KKyAgICB3b3Jkc2l6ZSA9ICgod29yZHNpemUgLyA0VSkgKiA0VSkgOworICB9CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IERhdGEgKi8KKyAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKKyAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB3aGlsZSAoKGluY291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQorICB7CisgICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworCisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICYgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKKyAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIH0KKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgeworICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KWhjcnlwLT5TaXplIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAoKHVpbnQzMl90KWhjcnlwLT5TaXplKTsKKworICAgIC8qICBTZXQgTnBibGIgaW4gY2FzZSBvZiBBRVMgR0NNIHBheWxvYWQgZW5jcnlwdGlvbiB0byBnZXQgcmlnaHQgdGFnKi8KKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCisgICAgeworICAgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgfQorICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgIH0KKyAgICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIH0KKyAgICB3aGlsZSAoaW5kZXggPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAwVTsKKyAgICAgIGluZGV4Kys7CisgICAgfQorICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorCisgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPICovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgIHsKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHByb2Nlc3MgaW4gQUVTIEdDTSBtb2RlIGFuZCBwcmVwYXJlIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOworICB1aW50MzJfdCBsb29wY291bnRlcjsKKyAgdWludDMyX3QgbGFzdHdvcmRzaXplOworICB1aW50MzJfdCBucGJsYjsKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisgIGlmICgoaGNyeXAtPlBoYXNlID09IENSWVBfUEhBU0VfSEVBREVSX1NVU1BFTkRFRCkgfHwgKGhjcnlwLT5QaGFzZSA9PSBDUllQX1BIQVNFX1BBWUxPQURfU1VTUEVOREVEKSkKKyAgeworICAgIENSWVBfUGhhc2VQcm9jZXNzaW5nUmVzdW1lKGhjcnlwKTsKKyAgICByZXR1cm4gSEFMX09LOworICB9CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgIHsKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBLZXksIElWIGFuZCBwcm9jZXNzIG1lc3NhZ2UgKGhlYWRlciBhbmQgcGF5bG9hZCkgKi8KKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gMFUpIC8qaGVhZGVyIHBoYXNlIGlzICBza2lwcGVkKi8KKyAgICB7CisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgICAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGlmIChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIC8qIFNpemUgPCAxNkJ5dGVzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICAgIHsKKyAgICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQgZm9yIFRpbnlBRVMyKi8KKyAgICAgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbjoKKyAgICAgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICAgICAgcGF5bG9hZCA8MTI4Yml0IGRvIG5vdCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gKi8KKworCisgICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgICBucGJsYiA9IDE2VSAtICgodWludDMyX3QpaGNyeXAtPlNpemUpOworCisgICAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgICAgfQorCisgICAgICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplIDsgbG9vcGNvdW50ZXIrKykKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgPCA0VSkKKyAgICB7CisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA7IGxvb3Bjb3VudGVyKyspCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICB9CisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KKyAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgICAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICB9CisKKyAgfSAvKiBlbmQgb2YgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisgIGVsc2UgIC8qIEtleSBhbmQgSVYgaGF2ZSBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwKKyAgICAgICAgICBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQ7CisgICAgICAgICAgb25seSBwcm9jZXNzIGhlcmUgbWVzc2FnZSBwYXlsb2FkICovCisgIHsKKworICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGlmIChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFNpemUgPCAxNkJ5dGVzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICB7CisgICAgICAvKiBXb3JrYXJvdW5kIG5vdCBpbXBsZW1lbnRlZCBmb3IgVGlueUFFUzIqLworICAgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbjoKKyAgICAgIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mCisgICAgICBwYXlsb2FkIDwxMjhiaXQgZG8gbm90IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLworCisKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAxNlUgLSAoKHVpbnQzMl90KWhjcnlwLT5TaXplKTsKKworICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICAgICAgeworICAgICAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMFUpOworICAgICAgfQorCisgICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgICAgfQorCisgICAgICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemUgOyBsb29wY291bnRlcisrKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHIHVzaW5nIERNQQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudDsKKyAgdWludDE2X3Qgd29yZHNpemUgPSBoY3J5cC0+U2l6ZSAvIDRVIDsKKyAgdWludDMyX3QgaW5kZXg7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKGhjcnlwKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICB7CisgICAgLyogUHJvY2VzcyB1bkxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICB7CisgICAgLypETUEgdHJhbnNmZXIgbXVzdCBub3QgaW5jbHVkZSB0aGUgbGFzdCBibG9jayBpbiBjYXNlIG9mIFNpemUgaXMgbm90ICUxNiAqLworICAgIHdvcmRzaXplID0gd29yZHNpemUgLSAod29yZHNpemUgJSA0VSk7CisKKyAgICAvKkRNQSB0cmFuc2ZlciAqLworICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIHdvcmRzaXplLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgfQorICBlbHNlIC8qIGxlbmd0aCBvZiBpbnB1dCBkYXRhIGlzIDwgMTYgKi8KKyAgeworICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgIG5wYmxiID0gMTZVIC0gKHVpbnQzMl90KWhjcnlwLT5TaXplOworCisgICAgLyogU2V0IE5wYmxiIGluIGNhc2Ugb2YgQUVTIEdDTSBwYXlsb2FkIGVuY3J5cHRpb24gdG8gZ2V0IHJpZ2h0IHRhZyovCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICAgIHsKKyAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgfQorCisgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGxhc3QgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisgICAgd2hpbGUgKGluZGV4IDwgNFUpCisgICAgeworICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPICovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgIHsKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2Vzc2luZyBpbiBwb2xsaW5nIG1vZGUKKyAgKiAgICAgICAgIGZvciBUaW55QUVTIHBlcmlwaGVyYWwsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB3b3Jkc2l6ZSA9ICgodWludDMyX3QpaGNyeXAtPlNpemUgLyA0VSkgOworICB1aW50MzJfdCBsb29wY291bnRlcjsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgIHVpbnQzMl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQjAgKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMVUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDNVKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCisgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEhlYWRlciBibG9jayhCMSkgOiBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGV4cHJlc3NlZCBpbiBieXRlcyBjb25jYXRlbmF0ZWQKKyAgICB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgeworICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLworICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CisgIH0KKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IGRhdGEgKi8KKyAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKKyAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB3aGlsZSAoKGluY291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQorICB7CisgICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworCisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB9CisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9ICgoKCh1aW50MzJfdCloY3J5cC0+U2l6ZSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSk7CisKKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpCisgICAgeworICAgICAgLyogU2V0IE5wYmxiIGluIGNhc2Ugb2YgQUVTIENDTSBwYXlsb2FkIGRlY3J5cHRpb24gdG8gZ2V0IHJpZ2h0IHRhZyAgKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMCk7CisKKyAgICB9CisgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgfQorCisgICAgLyogV3JpdGUgdGhlIGxhc3QgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlciArKykKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgfQorCisgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOworICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICB9CisgICAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCisgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgNFU7IGxvb3Bjb3VudGVyKyspCisgICAgeworICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzIGluIGludGVycnVwdCBtb2RlCisgICogICAgICAgICBmb3IgVGlueUFFUyBwZXJpcGhlcmFsLCBubyBlbmNyeXB0L2RlY3J5cHQgcGVyZm9ybWVkLCBvbmx5IGF1dGhlbnRpY2F0aW9uIHByZXBhcmF0aW9uLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CisgIHVpbnQzMl90IGxvb3Bjb3VudGVyOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBtb2RlOworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgaWYgKChoY3J5cC0+UGhhc2UgPT0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEKSB8fCAoaGNyeXAtPlBoYXNlID09IENSWVBfUEhBU0VfUEFZTE9BRF9TVVNQRU5ERUQpKQorICB7CisgICAgQ1JZUF9QaGFzZVByb2Nlc3NpbmdSZXN1bWUoaGNyeXApOworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgLyogQ29uZmlndXJlIEtleSwgSVYgYW5kIHByb2Nlc3MgbWVzc2FnZSAoaGVhZGVyIGFuZCBwYXlsb2FkKSAqLworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQjAgKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMVUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDNVKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAgIDBVKSAvKmhlYWRlciBwaGFzZSBpcyAgc2tpcHBlZCovCisgICAgeworICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisgICAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKKyAgICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IENyeXBIZWFkZXJDb3VudCB0byBwYXNzIGluIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVCAqLworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICB9CisgICAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisKKyAgICAgICAgaWYgKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgLyogU2l6ZSA8IDQgd29yZHMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLworICAgICAgeworICAgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICAgICAgbnBibGIgPSAxNlUgLSAodWludDMyX3QpaGNyeXAtPlNpemU7CisKKyAgICAgICAgbW9kZSA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERTsKKyAgICAgICAgaWYgKCgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpIHx8CisgICAgICAgICAgICAoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgICAgfQorCisgICAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKSAvKkhlYWRlclNpemUgPCA0ICovCisgICAgeworICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSk7IGxvb3Bjb3VudGVyKyspCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICB9CisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIH0KKworICB9IC8qIGVuZCBvZiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgZWxzZSAgLyogS2V5IGFuZCBJViBoYXZlIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLAorICAgICAgICAgIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZDsKKyAgICAgICAgICBvbmx5IHByb2Nlc3MgaGVyZSBtZXNzYWdlIHBheWxvYWQgKi8KKyAgeworICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisKKyAgICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUgLyA0VSkpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFNpemUgPCA0IHdvcmRzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICB7CisgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICAgIG5wYmxiID0gMTZVIC0gKHVpbnQzMl90KWhjcnlwLT5TaXplOworCisgICAgICBtb2RlID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFOworICAgICAgaWYgKCgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpIHx8CisgICAgICAgICAgKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkpKQorICAgICAgeworICAgICAgICAvKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgICB9CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgICB9CisKKyAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBETUEgbW9kZQorICAqICAgICAgICAgZm9yIFRpbnlBRVMgcGVyaXBoZXJhbCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIF9fSU8gdWludDMyX3QgY291bnQgICAgPSAwVTsKKyAgdWludDE2X3Qgd29yZHNpemUgPSBoY3J5cC0+U2l6ZSAvIDRVIDsKKyAgdWludDMyX3QgaW5kZXg7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBCMCAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDJVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgM1UpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKGhjcnlwKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIDBVKTsKKworICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKKworICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgeworICAgIC8qIFByb2Nlc3MgdW5Mb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIGFuZCBwaGFzZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICB9CisgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKKyAgeworICAgIC8qRE1BIHRyYW5zZmVyIG11c3Qgbm90IGluY2x1ZGUgdGhlIGxhc3QgYmxvY2sgaW4gY2FzZSBvZiBTaXplIGlzIG5vdCAlMTYgKi8KKyAgICB3b3Jkc2l6ZSA9IHdvcmRzaXplIC0gKHdvcmRzaXplICUgNFUpOworCisgICAgLypETUEgdHJhbnNmZXIgKi8KKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCB3b3Jkc2l6ZSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgIH0KKyAgZWxzZSAvKiBsZW5ndGggb2YgaW5wdXQgZGF0YSBpcyA8IDE2ICovCisgIHsKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9IDE2VSAtICh1aW50MzJfdCloY3J5cC0+U2l6ZTsKKworICAgIC8qIFNldCBOcGJsYiBpbiBjYXNlIG9mIEFFUyBDQ00gcGF5bG9hZCBkZWNyeXB0aW9uIHRvIGdldCByaWdodCB0YWcqLworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkKKyAgICB7CisgICAgICAvKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMFUpOworICAgIH0KKworICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgIH0KKworICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IDRVKQorICAgIHsKKyAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOworICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKlJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyAqLworICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKKyAgICB7CisgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKworICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIHRvIHJlYWR5ICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBwYXlsb2FkIHBoYXNlIGluIGludGVycnVwdCBtb2RlCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIHN0YXRlCisgICovCitzdGF0aWMgdm9pZCBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisgIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgbGFzdHdvcmRzaXplOworICB1aW50MzJfdCBucGJsYjsKKyAgdWludDMyX3QgbW9kZTsKKyAgdWludDE2X3QgaW5jb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLworICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIqLworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisKKyAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKKyAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICBpZiAoKG91dGNvdW50ID49ICAoaGNyeXAtPlNpemUgLyA0VSkpICYmICgoaW5jb3VudCAqIDRVKSA+PSAgaGNyeXAtPlNpemUpKQorICB7CisKKyAgICAgLyogV2hlbiBpbiBDQ00gd2l0aCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gc2tpcHBlZCwgZG9uJ3QgZGlzYWJsZSBpbnRlcnJ1cHRpb25zICovCisgICAgIGlmICghKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSAmJiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKSkpCisgICAgIHsKKyAgICAgIC8qIERpc2FibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3JzIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworICAgICB9CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGVsc2UgaWYgKCgoaGNyeXAtPlNpemUgLyA0VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCisgIHsKKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisgICAgLyogSWYgc3VzcGVuc2lvbiBmbGFnIGhhcyBiZWVuIHJhaXNlZCwgc3VzcGVuZCBwcm9jZXNzaW5nCisgICAgICAgb25seSBpZiBub3QgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBwYXlsb2FkICovCisgICAgaWYgKGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9PSBIQUxfQ1JZUF9TVVNQRU5EKQorICAgIHsKKyAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgLyogcmVzZXQgU3VzcGVuZFJlcXVlc3QgKi8KKyAgICAgIGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9IEhBTF9DUllQX1NVU1BFTkRfTk9ORTsKKyAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBhbmQgRXJyb3JzIEludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXxDUllQX0lUX0VSUklFKTsKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEOworICAgICAgLyogTWFyayB0aGF0IHRoZSBwYXlsb2FkIHBoYXNlIGlzIHN1c3BlbmRlZCAqLworICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QQVlMT0FEX1NVU1BFTkRFRDsKKworICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisgICAgeworICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaWYgKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIGhjcnlwLT5TaXplKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkKKyAgICB7CisgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgfQorICBlbHNlIC8qIExhc3QgYmxvY2sgb2YgcGF5bG9hZCA8IDEyOGJpdCovCisgIHsKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9ICgoKCh1aW50MzJfdCloY3J5cC0+U2l6ZSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSk7CisKKyAgICBtb2RlID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFOworICAgIGlmICgoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKSB8fAorICAgICAgICAoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgeworICAgICAgLyogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICB9CisKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKKyAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIH0KKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICBsb29wY291bnRlcisrOworICAgIH0KKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIGluIHBvbGxpbmcgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlKEhlYWRlciAmIEhlYWRlclNpemUpCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIHN0YXRlCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSBmb3IgR0NNL0dNQUMgb3IgQ0NNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpKQorICB7CisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICAgIH0KKyAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICB9CisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLypQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKworICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKKyAgICB7CisgICAgICAvKldvcmthcm91bmQgMTogb25seSBBRVMsIGJlZm9yZSByZS1lbmFibGluZyB0aGUgcGVyaXBoZXJhbCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7CisKKyAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgICAgfQorICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2Ugd2hlbiB1c2luZyBETUEgaW4gcHJvY2VzcworICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlKEhlYWRlciAmIEhlYWRlclNpemUpCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIF9fSU8gdWludDMyX3QgY291bnQgID0gMFU7CisgIHVpbnQzMl90IGxvb3Bjb3VudGVyOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgZm9yIEdDTS9HTUFDIG9yIENDTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCisgIHsKKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KKyAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICBjb3VudC0tIDsKKyAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qV3JpdGUgaGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgICAgfQorICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKworICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KKyAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgY291bnQtLSA7CisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIGhlYWRlciBwaGFzZSBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlKEhlYWRlciAmIEhlYWRlclNpemUpCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCBsb29wY291bnRlcjsKKyAgdWludDMyX3QgbGFzdHdvcmRzaXplOworICB1aW50MzJfdCBucGJsYjsKKyAgdWludDMyX3QgbW9kZTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgIHsKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKKyAgICB7CisgICAgICAvKiBJbmNyZW1lbnQgQ3J5cEhlYWRlckNvdW50IHRvIHBhc3MgaW4gQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUICovCisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgfQorICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisKKyAgICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUgLyA0VSkpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFNpemUgPCA0IHdvcmRzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICB7CisgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICAgIG5wYmxiID0gMTZVIC0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSk7CisgICAgICBtb2RlID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFOworICAgICAgaWYgKCgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpIHx8CisgICAgICAgICAgKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkpKQorICAgICAgeworICAgICAgICAvKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgICB9CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgICB9CisKKyAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKCgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkpID49IDRVKSkKKyAgeworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgICAvKiBJZiBzdXNwZW5zaW9uIGZsYWcgaGFzIGJlZW4gcmFpc2VkLCBzdXNwZW5kIHByb2Nlc3NpbmcKKyAgICAgICBvbmx5IGlmIG5vdCBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciAqLworICAgIGlmIChoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPT0gSEFMX0NSWVBfU1VTUEVORCkKKyAgICB7CisgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgIC8qIHJlc2V0IFN1c3BlbmRSZXF1ZXN0ICovCisgICAgICBoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPSBIQUxfQ1JZUF9TVVNQRU5EX05PTkU7CisgICAgICAvKiBEaXNhYmxlIENvbXB1dGF0aW9uIENvbXBsZXRlIEZsYWcgYW5kIEVycm9ycyBJbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUV8Q1JZUF9JVF9FUlJJRSk7CisgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1NVU1BFTkRFRDsKKyAgICAgIC8qIE1hcmsgdGhhdCB0aGUgcGF5bG9hZCBwaGFzZSBpcyBzdXNwZW5kZWQgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfSEVBREVSX1NVU1BFTkRFRDsKKworICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCisgICAgeworICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgfQorICB9CisgIGVsc2UgLypIZWFkZXJTaXplIDwgNCBvciBIZWFkZXJTaXplID40ICYgSGVhZGVyU2l6ZSAlNCAhPSAwKi8KKyAgeworICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKTsgbG9vcGNvdW50ZXIrKykKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICB9CisgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgeworICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uQ0NGbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBHZXQgdGltZW91dCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIEluIGNhc2Ugb2YgbWVzc2FnZSBwcm9jZXNzaW5nIHN1c3BlbnNpb24sIHJlYWQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3Rvci4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcGFyYW0gIE91dHB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQgSW5pdGlhbGl6YXRpb24gVmVjdG9yLgorICAqIEBub3RlICAgVGhpcyB2YWx1ZSBoYXMgdG8gYmUgc3RvcmVkIGZvciByZXVzZSBieSB3cml0aW5nIHRoZSBBRVNfSVZSeCByZWdpc3RlcnMKKyAgKiAgICAgICAgIGFzIHNvb24gYXMgdGhlIHN1c3BlbmRlZCBwcm9jZXNzaW5nIGhhcyB0byBiZSByZXN1bWVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9SZWFkX0lWUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQpCit7CisgIHVpbnQzMl90IG91dHB1dGFkZHIgPSAodWludDMyX3QpT3V0cHV0OworCisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+SVZSMzsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+SVZSMjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+SVZSMTsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+SVZSMDsKK30KKworLyoqCisgICogQGJyaWVmICBJbiBjYXNlIG9mIG1lc3NhZ2UgcHJvY2Vzc2luZyByZXN1bXB0aW9uLCByZXdyaXRlIHRoZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgVmVjdG9yIGluIHRoZSBBRVNfSVZSeCByZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIHRvCisgICogICAgICAgICB3cml0ZSBiYWNrIGluIHRoZSBDUllQIGhhcmR3YXJlIGJsb2NrLgorICAqIEBub3RlICAgQUVTIG11c3QgYmUgZGlzYWJsZWQgd2hlbiByZWNvbmZpZ3VyaW5nIHRoZSBJViB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1dyaXRlX0lWUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBJbnB1dCkKK3sKKyAgdWludDMyX3QgaXZhZGRyID0gKHVpbnQzMl90KUlucHV0OworCisgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShpdmFkZHIpOworICBpdmFkZHIrPTRVOworICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QqKShpdmFkZHIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluIGNhc2Ugb2YgbWVzc2FnZSBHQ00vR01BQy9DQ00gcHJvY2Vzc2luZyBzdXNwZW5zaW9uLAorICAqICAgICAgICAgcmVhZCB0aGUgU3VzcGVuZCBSZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNhdmVkIFN1c3BlbmQgUmVnaXN0ZXJzLgorICAqIEBub3RlICAgVGhlc2UgdmFsdWVzIGhhdmUgdG8gYmUgc3RvcmVkIGZvciByZXVzZSBieSB3cml0aW5nIGJhY2sgdGhlIEFFU19TVVNQeFIgcmVnaXN0ZXJzCisgICogICAgICAgICBhcyBzb29uIGFzIHRoZSBzdXNwZW5kZWQgcHJvY2Vzc2luZyBoYXMgdG8gYmUgcmVzdW1lZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfUmVhZF9TdXNwZW5kUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQpCit7CisgIHVpbnQzMl90IG91dHB1dGFkZHIgPSAodWludDMyX3QpT3V0cHV0OworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CisKKyAgLyogSW4gY2FzZSBvZiBHQ00gcGF5bG9hZCBwaGFzZSBlbmNyeXB0aW9uLCBjaGVjayB0aGF0IHN1c3BlbnNpb24gY2FuIGJlIGNhcnJpZWQgb3V0ICovCisgIGlmIChSRUFEX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCAoQUVTX0NSX0NITU9EfEFFU19DUl9HQ01QSHxBRVNfQ1JfTU9ERSkpID09IChDUllQX0FFU19HQ01fR01BQ3xBRVNfQ1JfR0NNUEhfMXwweDApKQorICB7CisKKyAgICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSBjbGVhcmVkICovCisgICAgICBjb3VudCA9IDB4RkZGOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgY291bnQtLSA7CisgICAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQlVTWSkpOworCisgIH0KKworCisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+U1VTUDdSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQNlI7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPlNVU1A1UjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+U1VTUDRSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQM1I7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPlNVU1AyUjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+U1VTUDFSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQMFI7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW4gY2FzZSBvZiBtZXNzYWdlIEdDTS9HTUFDL0NDTSBwcm9jZXNzaW5nIHJlc3VtcHRpb24sIHJld3JpdGUgdGhlIFN1c3BlbmQKKyAgKiAgICAgICAgIFJlZ2lzdGVycyBpbiB0aGUgQUVTX1NVU1B4UiByZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQgc3VzcGVuZCByZWdpc3RlcnMgdG8KKyAgKiAgICAgICAgIHdyaXRlIGJhY2sgaW4gdGhlIENSWVAgaGFyZHdhcmUgYmxvY2suCisgICogQG5vdGUgICBBRVMgbXVzdCBiZSBkaXNhYmxlZCB3aGVuIHJlY29uZmlndXJpbmcgdGhlIHN1c3BlbmQgcmVnaXN0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9Xcml0ZV9TdXNwZW5kUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBJbnB1dCkKK3sKKyAgdWludDMyX3QgaXZhZGRyID0gKHVpbnQzMl90KUlucHV0OworCisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDdSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDZSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDVSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDRSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDNSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDJSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDFSID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+U1VTUDBSID0gKih1aW50MzJfdCopKGl2YWRkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW4gY2FzZSBvZiBtZXNzYWdlIEdDTS9HTUFDL0NDTSBwcm9jZXNzaW5nIHN1c3BlbnNpb24sIHJlYWQgdGhlIEtleSBSZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNhdmVkIEtleSBSZWdpc3RlcnMuCisgICogQHBhcmFtICBLZXlTaXplIEluZGljYXRlcyB0aGUga2V5IHNpemUgKDEyOCBvciAyNTYgYml0cykuCisgICogQG5vdGUgICBUaGVzZSB2YWx1ZXMgaGF2ZSB0byBiZSBzdG9yZWQgZm9yIHJldXNlIGJ5IHdyaXRpbmcgYmFjayB0aGUgQUVTX0tFWVJ4IHJlZ2lzdGVycworICAqICAgICAgICAgYXMgc29vbiBhcyB0aGUgc3VzcGVuZGVkIHByb2Nlc3NpbmcgaGFzIHRvIGJlIHJlc3VtZWQuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1JlYWRfS2V5UmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQsIHVpbnQzMl90IEtleVNpemUpCit7CisgIHVpbnQzMl90IGtleWFkZHIgPSAodWludDMyX3QpT3V0cHV0OworCisgIHN3aXRjaCAoS2V5U2l6ZSkKKyAgeworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzI1NkI6CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxVSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDJVKTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgM1UpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0VSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDVVKTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNlUpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA3VSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOgorICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMVUpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyVSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDNVKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluIGNhc2Ugb2YgbWVzc2FnZSBHQ00vR01BQyAoQ0NNL0NNQUMgd2hlbiBhcHBsaWNhYmxlKSBwcm9jZXNzaW5nIHJlc3VtcHRpb24sIHJld3JpdGUgdGhlIEtleQorICAqICAgICAgICAgUmVnaXN0ZXJzIGluIHRoZSBBRVNfS0VZUnggcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNhdmVkIGtleSByZWdpc3RlcnMgdG8KKyAgKiAgICAgICAgIHdyaXRlIGJhY2sgaW4gdGhlIENSWVAgaGFyZHdhcmUgYmxvY2suCisgICogQHBhcmFtICBLZXlTaXplIEluZGljYXRlcyB0aGUga2V5IHNpemUgKDEyOCBvciAyNTYgYml0cykKKyAgKiBAbm90ZSAgIEFFUyBtdXN0IGJlIGRpc2FibGVkIHdoZW4gcmVjb25maWd1cmluZyB0aGUgS2V5IHJlZ2lzdGVycy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfV3JpdGVfS2V5UmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBJbnB1dCwgdWludDMyX3QgS2V5U2l6ZSkKK3sKKyAgdWludDMyX3Qga2V5YWRkciA9ICh1aW50MzJfdClJbnB1dDsKKworICBpZiAoS2V5U2l6ZSA9PSBDUllQX0tFWVNJWkVfMjU2QikKKyAgeworICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSAqKHVpbnQzMl90Kikoa2V5YWRkcik7CisgICAga2V5YWRkcis9NDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI2ID0gKih1aW50MzJfdCopKGtleWFkZHIpOworICAgIGtleWFkZHIrPTQ7CisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNSA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKKyAgICBrZXlhZGRyKz00OworICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjQgPSAqKHVpbnQzMl90Kikoa2V5YWRkcik7CisgICAga2V5YWRkcis9NDsKKyAgfQorCisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKKyAgICBrZXlhZGRyKz00OworICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjIgPSAqKHVpbnQzMl90Kikoa2V5YWRkcik7CisgICAga2V5YWRkcis9NDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0gKih1aW50MzJfdCopKGtleWFkZHIpOworICAgIGtleWFkZHIrPTQ7CisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKK30KKworLyoqCisgICogQGJyaWVmICBBdXRoZW50aWNhdGlvbiBwaGFzZSByZXN1bXB0aW9uIGluIGNhc2Ugb2YgR0NNL0dNQUMvQ0NNIHByb2Nlc3MgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9QaGFzZVByb2Nlc3NpbmdSZXN1bWUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgdWludDMyX3QgbG9vcGNvdW50ZXIgPSAwVTsKKyAgdWludDMyX3QgbGFzdHdvcmRzaXplID0wOworICB1aW50MzJfdCBucGJsYiA9IDBVIDsKKworICAvKiBDYXNlIG9mIGhlYWRlciBwaGFzZSByZXN1bXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBfUEhBU0VfSEVBREVSX1NVU1BFTkRFRCkKKyAgeworICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgaWYgKCgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkgPj0gNFUpKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIH0KKyAgICBlbHNlIC8qSGVhZGVyU2l6ZSA8IDQgb3IgSGVhZGVyU2l6ZSA+NCAmIEhlYWRlclNpemUgJTQgIT0gMCovCisgICAgeworICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgfQorICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPDRVICkKKyAgICAgIHsKKyAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIENhc2Ugb2YgcGF5bG9hZCBwaGFzZSByZXN1bXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICBlbHNlIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUF9QSEFTRV9QQVlMT0FEX1NVU1BFTkRFRCkKKyAgeworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICBpZiAoKGhjcnlwLT5TaXplLzQpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkgPj0gNFUpCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaWYoKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgaGNyeXAtPlNpemUpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKQorICAgICAgeworICAgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogTGFzdCBibG9jayBvZiBwYXlsb2FkIDwgMTI4Yml0Ki8KKyAgICB7CisgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICAgIG5wYmxiID0gKChoY3J5cC0+U2l6ZS8xNlUpKzFVKSoxNlUtIChoY3J5cC0+U2l6ZSk7CisgICAgICBpZigoKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkgfHwKKyAgICAgICAgICgoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgICB7CisgICAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGI8PCAyMFUpOworICAgICAgfQorCisgICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgICAgaWYgKG5wYmxiICUgNFUgPT0wVSkKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVICsxVTsKKyAgICAgIH0KKworICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgfQorICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPCA0VSApCisgICAgICB7CisgICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIGRlZmluZWQgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKworI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCisKKyNlbmRpZiAvKiBBRVMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICogQH0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2NyeXBfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX2NyeXBfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTBjMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfY3J5cF9leC5jCkBAIC0wLDAgKzEsMzgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9jcnlwX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSWVBFeCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZXh0ZW5kZWQKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENyeXB0b2dyYXBoeSAoQ1JZUCkgcGVyaXBoZXJhbC4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4CisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQUVTKQorCisjaWZkZWYgSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRGVmaW5lcworICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLworCisjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLworI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgICAgICAgICAvKiE8IERlY3J5cHRpb24gICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCAgICAgQUVTX0NSX01PREUgICAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBhbmQgZGVjcnlwdGlvbiBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLworCisjZGVmaW5lICBDUllQRXhfUEhBU0VfUFJPQ0VTUyAgICAgICAweDAyVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLworI2RlZmluZSAgQ1JZUEV4X1BIQVNFX0ZJTkFMICAgICAgICAgMHgwM1UgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIGluIGZpbmFsIHBoYXNlIHRoaXMgaXMgcmVsZXZhbnQgb25seSB3aXRoIENDTSBhbmQgR0NNIG1vZGVzICovCisKKy8qICBDVFIwIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMCAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGdlbmVyYXRlIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICAgIFRBRyBpbiBQb2xsaW5nIG1vZGUKKyAgICAgICgjKUhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRworICAgICAgKCMpSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHCisgICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgZ2VuZXJhdGUgdGhlIEdDTSBhdXRoZW50aWNhdGlvbiBUQUcuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIEF1dGhUYWcgUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAqIDMyVTsgLyogSGVhZGVyIGxlbmd0aCBpbiBiaXRzICovCisgIHVpbnQ2NF90IGlucHV0bGVuZ3RoID0gKHVpbnQ2NF90KWhjcnlwLT5TaXplc1N1bSAqIDhVOyAvKiBpbnB1dCBsZW5ndGggaW4gYml0cyAqLworICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CisgICAgfQorICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKKyAgICAvKiBTZXQgdGhlIGVuY3J5cHQgb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qVGlueUFFUyBwZXJpcGhlcmFsIGZyb20gVjMuMS4xIDogZGF0YSBoYXMgdG8gYmUgaW5zZXJ0ZWQgbm9ybWFsbHkgKG5vIHN3YXBwaW5nKSovCisgICAgLyogV3JpdGUgaW50byB0aGUgQUVTX0RJTlIgcmVnaXN0ZXIgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykKKyAgICBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHBheWxvYWQgKi8KKworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAodWludDMyX3QpKGlucHV0bGVuZ3RoKTsKKworICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFFUyBDQ00gQXV0aGVudGljYXRpb24gVEFHIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIEF1dGhUYWcgUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGFnYWRkciA9ICh1aW50MzJfdClBdXRoVGFnOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgaW4gY2FzZSB0aGV5IHdlcmUga2VwdCBlbmFibGVkIHRvIHByb2NlZWQKKyAgICAgICBhIHNpbmdsZSBtZXNzYWdlIGluIHNldmVyYWwgaXRlcmF0aW9ucyAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KKyAgICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOworICAgIH0KKyAgICBlbHNlIC8qIEluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQqLworICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgIC8qIFNlcXVlbmNlIGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKKworICAgIC8qIFNldCBlbmNyeXB0ICBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIENsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBEaXNhYmxlIENSWVAgICovCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBBRVMgS2V5IERlcml2YXRpb25zIGZ1bmN0aW9ucworICAqIEBicmllZiAgIEV4dGVuZGVkIEtleSBEZXJpdmF0aW9ucyBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gRW5hYmxlIG9yIERpc2FibGUgdGhlCisgICAgICAgICAgdGhlIEF1dG9LZXlEZXJpdmF0aW9uIHBhcmFtZXRlciBpbiBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICAgICAgICAgVGhlc2UgZnVuY3Rpb24gYXJlIGFsbG93ZWQgb25seSBpbiBUaW55QUVTIHBlcmlwaGVyYWwuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEFFUyBlbmFibGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb25zCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKi8KK3ZvaWQgIEhBTF9DUllQRXhfRW5hYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IEVOQUJMRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBBRVMgZGlzYWJsZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbnMKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlLgorICAqLwordm9pZCAgSEFMX0NSWVBFeF9EaXNhYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IERJU0FCTEU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCisKKyNlbmRpZiAvKiBBRVMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9kYWMuYyBiL1NyYy9zdG0zMmcweHhfaGFsX2RhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmE0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9kYWMuYwpAQCAtMCwwICsxLDE1MDkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2RhYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBEQUMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIERpZ2l0YWwgdG8gQW5hbG9nIENvbnZlcnRlciAoREFDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBEQUMgUGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAqKiogREFDIENoYW5uZWxzICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgU1RNMzJHMCBkZXZpY2VzIGludGVncmF0ZSB0d28gMTItYml0IERpZ2l0YWwgQW5hbG9nIENvbnZlcnRlcnMKKworICAgIFRoZSAyIGNvbnZlcnRlcnMgKGkuZS4gY2hhbm5lbDEgJiBjaGFubmVsMikKKyAgICBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5IG9yIHNpbXVsdGFuZW91c2x5IChkdWFsIG1vZGUpOgorICAgICAgKCMpIERBQyBjaGFubmVsMSB3aXRoIERBQ19PVVQxIChQQTQpIGFzIG91dHB1dCBvciBjb25uZWN0ZWQgdG8gb24tY2hpcAorICAgICAgICAgIHBlcmlwaGVyYWxzIChleC4gdGltZXJzKS4KKyAgICAgICgjKSBEQUMgY2hhbm5lbDIgd2l0aCBEQUNfT1VUMiAoUEE1KSBhcyBvdXRwdXQgb3IgY29ubmVjdGVkIHRvIG9uLWNoaXAKKyAgICAgICAgICBwZXJpcGhlcmFscyAoZXguIHRpbWVycykuCisKKyAgICAgICoqKiBEQUMgVHJpZ2dlcnMgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBEaWdpdGFsIHRvIEFuYWxvZyBjb252ZXJzaW9uIGNhbiBiZSBub24tdHJpZ2dlcmVkIHVzaW5nIERBQ19UUklHR0VSX05PTkUKKyAgICBhbmQgREFDX09VVDEvREFDX09VVDIgaXMgYXZhaWxhYmxlIG9uY2Ugd3JpdGluZyB0byBESFJ4IHJlZ2lzdGVyLgorICAgIFsuLl0KKyAgICBEaWdpdGFsIHRvIEFuYWxvZyBjb252ZXJzaW9uIGNhbiBiZSB0cmlnZ2VyZWQgYnk6CisgICAgICAoIykgRXh0ZXJuYWwgZXZlbnQ6IEVYVEkgTGluZSA5IChhbnkgR1BJT3hfUElOXzkpIHVzaW5nIERBQ19UUklHR0VSX0VYVF9JVDkuCisgICAgICAgICAgVGhlIHVzZWQgcGluIChHUElPeF9QSU5fOSkgbXVzdCBiZSBjb25maWd1cmVkIGluIGlucHV0IG1vZGUuCisKKyAgICAgICgjKSBUaW1lcnMgVFJHTzogVElNMiwgVElNMywgVElNNCwgVElNNSwgVElNNiBhbmQgVElNNworICAgICAgICAgIChEQUNfVFJJR0dFUl9UMl9UUkdPLCBEQUNfVFJJR0dFUl9UM19UUkdPLi4uKQorCisgICAgICAoIykgU29mdHdhcmUgdXNpbmcgREFDX1RSSUdHRVJfU09GVFdBUkUKKworICAgICAgKioqIERBQyBCdWZmZXIgbW9kZSBmZWF0dXJlICoqKgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgWy4uXQorICAgICAgRWFjaCBEQUMgY2hhbm5lbCBpbnRlZ3JhdGVzIGFuIG91dHB1dCBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCB0bworICAgICAgcmVkdWNlIHRoZSBvdXRwdXQgaW1wZWRhbmNlLCBhbmQgdG8gZHJpdmUgZXh0ZXJuYWwgbG9hZHMgZGlyZWN0bHkKKyAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGFkZCBhbiBleHRlcm5hbCBvcGVyYXRpb25hbCBhbXBsaWZpZXIuCisgICAgICBUbyBlbmFibGUsIHRoZSBvdXRwdXQgYnVmZmVyIHVzZQorICAgICAgc0NvbmZpZy5EQUNfT3V0cHV0QnVmZmVyID0gREFDX09VVFBVVEJVRkZFUl9FTkFCTEU7CisgICAgICBbLi5dCisgICAgICAoQCkgUmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBvdXRwdXQKKyAgICAgICAgICBpbXBlZGFuY2UgdmFsdWUgd2l0aCBhbmQgd2l0aG91dCBvdXRwdXQgYnVmZmVyLgorCisgICAgICAqKiogREFDIGNvbm5lY3QgZmVhdHVyZSAqKioKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgIEVhY2ggREFDIGNoYW5uZWwgY2FuIGJlIGNvbm5lY3RlZCBpbnRlcm5hbGx5LgorICAgICAgVG8gY29ubmVjdCwgdXNlCisgICAgICBzQ29uZmlnLkRBQ19Db25uZWN0T25DaGlwUGVyaXBoZXJhbCA9IERBQ19DSElQQ09OTkVDVF9FTkFCTEU7CisKKyAgICAgICoqKiBHUElPIGNvbmZpZ3VyYXRpb25zIGd1aWRlbGluZXMgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgIFdoZW4gYSBEQUMgY2hhbm5lbCBpcyB1c2VkIChleCBjaGFubmVsMSBvbiBQQTQpIGFuZCB0aGUgb3RoZXIgaXMgbm90CisgICAgICAoZXggY2hhbm5lbDIgb24gUEE1IGlzIGNvbmZpZ3VyZWQgaW4gQW5hbG9nIGFuZCBkaXNhYmxlZCkuCisgICAgICBDaGFubmVsMSBtYXkgZGlzdHVyYiBjaGFubmVsMiBhcyBjb3VwbGluZyBlZmZlY3QuCisgICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gY291cGxpbmcgb24gY2hhbm5lbDIgYXMgc29vbiBhcyBjaGFubmVsMiBpcyB0dXJuZWQgb24uCisgICAgICBDb3VwbGluZyBvbiBhZGphY2VudCBjaGFubmVsIGNvdWxkIGJlIGF2b2lkZWQgYXMgZm9sbG93czoKKyAgICAgIHdoZW4gdW51c2VkIFBBNSBpcyBjb25maWd1cmVkIGFzIElOUFVUIFBVTEwtVVAgb3IgRE9XTi4KKyAgICAgIFBBNSBpcyBjb25maWd1cmVkIGluIEFOQUxPRyBqdXN0IGJlZm9yZSBpdCBpcyB0dXJuZWQgb24uCisKKyAgICAgICoqKiBEQUMgU2FtcGxlIGFuZCBIb2xkIGZlYXR1cmUgKioqCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgIEZvciBlYWNoIGNvbnZlcnRlciwgMiBtb2RlcyBhcmUgc3VwcG9ydGVkOiBub3JtYWwgbW9kZSBhbmQKKyAgICAgICJzYW1wbGUgYW5kIGhvbGQiIG1vZGUgKGkuZS4gbG93IHBvd2VyIG1vZGUpLgorICAgICAgSW4gdGhlIHNhbXBsZSBhbmQgaG9sZCBtb2RlLCB0aGUgREFDIGNvcmUgY29udmVydHMgZGF0YSwgdGhlbiBob2xkcyB0aGUKKyAgICAgIGNvbnZlcnRlZCB2b2x0YWdlIG9uIGEgY2FwYWNpdG9yLiBXaGVuIG5vdCBjb252ZXJ0aW5nLCB0aGUgREFDIGNvcmVzIGFuZAorICAgICAgYnVmZmVyIGFyZSBjb21wbGV0ZWx5IHR1cm5lZCBvZmYgYmV0d2VlbiBzYW1wbGVzIGFuZCB0aGUgREFDIG91dHB1dCBpcworICAgICAgdHJpLXN0YXRlZCwgdGhlcmVmb3JlICByZWR1Y2luZyB0aGUgb3ZlcmFsbCBwb3dlciBjb25zdW1wdGlvbi4gQSBuZXcKKyAgICAgIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzIG5lZWRlZCBiZWZvcmUgZWFjaCBuZXcgY29udmVyc2lvbi4KKworICAgICAgVGhlIHNhbXBsZSBhbmQgaG9sZCBhbGxvdyBzZXR0aW5nIGludGVybmFsIG9yIGV4dGVybmFsIHZvbHRhZ2UgQAorICAgICAgbG93IHBvd2VyIGNvbnN1bXB0aW9uIGNvc3QgKG91dHB1dCB2YWx1ZSBjYW4gYmUgYXQgYW55IGdpdmVuIHJhdGUgZWl0aGVyCisgICAgICBieSBDUFUgb3IgRE1BKS4KKworICAgICAgVGhlIFNhbXBsZSBhbmQgaG9sZCBibG9jayBhbmQgcmVnaXN0ZXJzIHVzZXMgZWl0aGVyIExTSSAmIHJ1biBpbgorICAgICAgc2V2ZXJhbCBwb3dlciBtb2RlczogcnVuIG1vZGUsIHNsZWVwIG1vZGUsIGxvdyBwb3dlciBydW4sIGxvdyBwb3dlciBzbGVlcAorICAgICAgbW9kZSAmIHN0b3AxIG1vZGUuCisKKyAgICAgIExvdyBwb3dlciBzdG9wMSBtb2RlIGFsbG93cyBvbmx5IHN0YXRpYyBjb252ZXJzaW9uLgorCisgICAgICBUbyBlbmFibGUgU2FtcGxlIGFuZCBIb2xkIG1vZGUKKyAgICAgIEVuYWJsZSBMU0kgdXNpbmcgSEFMX1JDQ19Pc2NDb25maWcgd2l0aCBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJICYKKyAgICAgIFJDQ19MU0lfT04gcGFyYW1ldGVycy4KKworICAgICAgVXNlIERBQ19Jbml0U3RydWN0dXJlLkRBQ19TYW1wbGVBbmRIb2xkID0gREFDX1NBTVBMRUFOREhPTERfRU5BQkxFOworICAgICAgICAgJiBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmLkRBQ19TYW1wbGVBbmRIb2xkQ29uZmlnLkRBQ19TYW1wbGVUaW1lLAorICAgICAgICAgICBEQUNfSG9sZFRpbWUgJiBEQUNfUmVmcmVzaFRpbWU7CisKKyAgICAgICAqKiogREFDIGNhbGlicmF0aW9uIGZlYXR1cmUgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFsuLl0KKyAgICAgICAoIykgIFRoZSAyIGNvbnZlcnRlcnMgKGNoYW5uZWwxICYgY2hhbm5lbDIpIHByb3ZpZGUgY2FsaWJyYXRpb24gY2FwYWJpbGl0aWVzLgorICAgICAgICgrKykgQ2FsaWJyYXRpb24gYWltcyBhdCBjb3JyZWN0aW5nIHNvbWUgb2Zmc2V0IG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKCsrKSBUaGUgREFDIHVzZXMgZWl0aGVyIGZhY3RvcnkgY2FsaWJyYXRpb24gc2V0dGluZ3MgT1IgdXNlciBkZWZpbmVkCisgICAgICAgICAgIGNhbGlicmF0aW9uICh0cmltbWluZykgc2V0dGluZ3MgKGkuZS4gdHJpbW1pbmcgbW9kZSkuCisgICAgICAgKCsrKSBUaGUgdXNlciBkZWZpbmVkIHNldHRpbmdzIGNhbiBiZSBmaWd1cmVkIG91dCB1c2luZyBzZWxmIGNhbGlicmF0aW9uCisgICAgICAgICAgIGhhbmRsZWQgYnkgSEFMX0RBQ0V4X1NlbGZDYWxpYnJhdGUuCisgICAgICAgKCsrKSBIQUxfREFDRXhfU2VsZkNhbGlicmF0ZToKKyAgICAgICAoKysrKSBSdW5zIGF1dG9tYXRpY2FsbHkgdGhlIGNhbGlicmF0aW9uLgorICAgICAgICgrKyspIEVuYWJsZXMgdGhlIHVzZXIgdHJpbW1pbmcgbW9kZQorICAgICAgICgrKyspIFVwZGF0ZXMgYSBzdHJ1Y3R1cmUgd2l0aCB0cmltbWluZyB2YWx1ZXMgd2l0aCBmcmVzaCBjYWxpYnJhdGlvbgorICAgICAgICAgICAgcmVzdWx0cy4KKyAgICAgICAgICAgIFRoZSB1c2VyIG1heSBzdG9yZSB0aGUgY2FsaWJyYXRpb24gcmVzdWx0cyBmb3IgbGFyZ2VyCisgICAgICAgICAgICAoZXggbW9uaXRvcmluZyB0aGUgdHJpbW1pbmcgYXMgYSBmdW5jdGlvbiBvZiB0ZW1wZXJhdHVyZQorICAgICAgICAgICAgZm9yIGluc3RhbmNlKQorCisgICAgICAgKioqIERBQyB3YXZlIGdlbmVyYXRpb24gZmVhdHVyZSAqKioKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIFsuLl0KKyAgICAgICBCb3RoIERBQyBjaGFubmVscyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZQorICAgICAgICAgKCMpIE5vaXNlIHdhdmUKKyAgICAgICAgICgjKSBUcmlhbmdsZSB3YXZlCisKKyAgICAgICAqKiogREFDIGRhdGEgZm9ybWF0ICoqKgorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXQorICAgICAgIFRoZSBEQUMgZGF0YSBmb3JtYXQgY2FuIGJlOgorICAgICAgICAgKCMpIDgtYml0IHJpZ2h0IGFsaWdubWVudCB1c2luZyBEQUNfQUxJR05fOEJfUgorICAgICAgICAgKCMpIDEyLWJpdCBsZWZ0IGFsaWdubWVudCB1c2luZyBEQUNfQUxJR05fMTJCX0wKKyAgICAgICAgICgjKSAxMi1iaXQgcmlnaHQgYWxpZ25tZW50IHVzaW5nIERBQ19BTElHTl8xMkJfUgorCisgICAgICAgKioqIERBQyBkYXRhIHZhbHVlIHRvIHZvbHRhZ2UgY29ycmVzcG9uZGVuY2UgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXQorICAgICAgIFRoZSBhbmFsb2cgb3V0cHV0IHZvbHRhZ2Ugb24gZWFjaCBEQUMgY2hhbm5lbCBwaW4gaXMgZGV0ZXJtaW5lZAorICAgICAgIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb246CisgICAgICAgWy4uXQorICAgICAgIERBQ19PVVR4ID0gVlJFRisgKiBET1IgLyA0MDk1CisgICAgICAgKCspIHdpdGggIERPUiBpcyB0aGUgRGF0YSBPdXRwdXQgUmVnaXN0ZXIKKyAgICAgICBbLi5dCisgICAgICAgICAgVkVGKyBpcyB0aGUgaW5wdXQgdm9sdGFnZSByZWZlcmVuY2UgKHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0KQorICAgICAgIFsuLl0KKyAgICAgICAgZS5nLiBUbyBzZXQgREFDX09VVDEgdG8gMC43ViwgdXNlCisgICAgICAgKCspIEFzc3VtaW5nIHRoYXQgVlJFRisgPSAzLjNWLCBEQUNfT1VUMSA9ICgzLjMgKiA4NjgpIC8gNDA5NSA9IDAuN1YKKworICAgICAgICoqKiBETUEgcmVxdWVzdHMgKioqCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09CisgICAgICAgWy4uXQorICAgICAgIEEgRE1BMSByZXF1ZXN0IGNhbiBiZSBnZW5lcmF0ZWQgd2hlbiBhbiBleHRlcm5hbCB0cmlnZ2VyIChidXQgbm90IGEgc29mdHdhcmUgdHJpZ2dlcikKKyAgICAgICBvY2N1cnMgaWYgRE1BMSByZXF1ZXN0cyBhcmUgZW5hYmxlZCB1c2luZyBIQUxfREFDX1N0YXJ0X0RNQSgpLgorICAgICAgIERNQSByZXF1ZXN0cyBhcmUgbWFwcGVkIGFzIGZvbGxvd2luZzoKKyAgICAgICgjKSBEQUMgY2hhbm5lbDE6IG1hcHBlZCBvbiBETUEgY2hhbm5lbDEgcmVxdWVzdCA4CisgICAgICAoIykgREFDIGNoYW5uZWwyOiBtYXBwZWQgb24gRE1BIGNoYW5uZWwyIHJlcXVlc3QgOQorCisgICAgIFsuLl0KKyAgICAoQCkgRm9yIER1YWwgbW9kZSBhbmQgc3BlY2lmaWMgc2lnbmFsIChUcmlhbmdsZSBhbmQgbm9pc2UpIGdlbmVyYXRpb24gcGxlYXNlCisgICAgICAgIHJlZmVyIHRvIEV4dGVuZGVkIEZlYXR1cmVzIERyaXZlciBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgREFDIEFQQiBjbG9jayBtdXN0IGJlIGVuYWJsZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byBEQUMKKyAgICAgICAgICByZWdpc3RlcnMgdXNpbmcgSEFMX0RBQ19Jbml0KCkKKyAgICAgICgrKSBDb25maWd1cmUgREFDX09VVHggKERBQ19PVVQxOiBQQTQsIERBQ19PVVQyOiBQQTUpIGluIGFuYWxvZyBtb2RlLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgREFDIGNoYW5uZWwgdXNpbmcgSEFMX0RBQ19Db25maWdDaGFubmVsKCkgZnVuY3Rpb24uCisgICAgICAoKykgRW5hYmxlIHRoZSBEQUMgY2hhbm5lbCB1c2luZyBIQUxfREFDX1N0YXJ0KCkgb3IgSEFMX0RBQ19TdGFydF9ETUEoKSBmdW5jdGlvbnMuCisKKyAgICAgKioqIENhbGlicmF0aW9uIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFJldHJpZXZlIHRoZSBmYWN0b3J5IHRyaW1taW5nIChjYWxpYnJhdGlvbiBzZXR0aW5ncykgdXNpbmcgSEFMX0RBQ0V4X0dldFRyaW1PZmZzZXQoKQorICAgICAgICgrKSBSdW4gdGhlIGNhbGlicmF0aW9uIHVzaW5nIEhBTF9EQUNFeF9TZWxmQ2FsaWJyYXRlKCkKKyAgICAgICAoKykgVXBkYXRlIHRoZSB0cmltbWluZyB3aGlsZSBEQUMgcnVubmluZyB1c2luZyBIQUxfREFDRXhfU2V0VXNlclRyaW1taW5nKCkKKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU3RhcnQgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RhcnQoKQorICAgICAgICgrKSBUbyByZWFkIHRoZSBEQUMgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSwgdXNlIHRoZSBIQUxfREFDX0dldFZhbHVlKCkgZnVuY3Rpb24uCisgICAgICAgKCspIFN0b3AgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RvcCgpCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU3RhcnQgdGhlIERBQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9EQUNfU3RhcnRfRE1BKCksIGF0IHRoaXMgc3RhZ2UgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGVuZ3RoCisgICAgICAgICAgIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgYXQgZWFjaCBlbmQgb2YgY29udmVyc2lvbgorICAgICAgICAgICBGaXJzdCBpc3N1ZWQgdHJpZ2dlciB3aWxsIHN0YXJ0IHRoZSBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwcmV2aW91c2x5IHNldCBieSBIQUxfREFDX1NldFZhbHVlKCkuCisgICAgICAgKCspIEF0IHRoZSBtaWRkbGUgb2YgZGF0YSB0cmFuc2ZlciBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKCkKKyAgICAgICAgICAgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyCisgICAgICAgICAgIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoKSBvciBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDIoKQorICAgICAgICgrKSBBdCBUaGUgZW5kIG9mIGRhdGEgdHJhbnNmZXIgSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKCkKKyAgICAgICAgICAgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyCisgICAgICAgICAgIEhBTF9EQUNfQ29udkNwbHRDYWxsYmFja0NoMSgpIG9yIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMigpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9EQUNfRXJyb3JDYWxsYmFja0NoMSgpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxCisgICAgICAgKCspIEluIGNhc2Ugb2YgRE1BIHVuZGVycnVuLCBEQUMgaW50ZXJydXB0aW9uIHRyaWdnZXJzIGFuZCBleGVjdXRlIGludGVybmFsIGZ1bmN0aW9uIEhBTF9EQUNfSVJRSGFuZGxlci4KKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoKQorICAgICAgICAgICBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKCkgb3IgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIoKSBhbmQKKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxKCkKKyAgICAgICAoKykgU3RvcCB0aGUgREFDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0RBQ19TdG9wX0RNQSgpCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9EQUNfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjaywKKyAgICAgIGl0IGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDEgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMS4KKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMSA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gxLgorICAgICAgKCspIEVycm9yQ2FsbGJhY2tDaDEgICAgICAgIDogY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDEgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDIgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMi4KKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMiA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gyLgorICAgICAgKCspIEVycm9yQ2FsbGJhY2tDaDIgICAgICAgIDogY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gQ2gyLgorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDIgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gyLgorICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgIDogREFDIE1zcEluaXQuCisgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgOiBEQUMgTXNwZGVJbml0LgorICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9EQUNfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uIEl0IGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDEgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMS4KKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMSA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gxLgorICAgICAgKCspIEVycm9yQ2FsbGJhY2tDaDEgICAgICAgIDogY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDEgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gxLgorICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2tDaDIgICAgIDogY2FsbGJhY2sgd2hlbiBhIGhhbGYgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9uIENoMi4KKyAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFja0NoMiA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb24gQ2gyLgorICAgICAgKCspIEVycm9yQ2FsbGJhY2tDaDIgICAgICAgIDogY2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gQ2gyLgorICAgICAgKCspIERNQVVuZGVycnVuQ2FsbGJhY2tDaDIgIDogY2FsbGJhY2sgd2hlbiBhbiB1bmRlcnJ1biBlcnJvciBvY2N1cnMgb24gQ2gyLgorICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgIDogREFDIE1zcEluaXQuCisgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgOiBEQUMgTXNwZGVJbml0LgorICAgICAgKCspIEFsbCBDYWxsYmFja3MKKyAgICAgIFRoaXMgZnVuY3Rpb24pIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgorCisgICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfREFDX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfREFDX1NUQVRFX1JFU0VUCisgICAgICBhbGwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zLgorICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfREFDX0luaXQKKyAgICAgIGFuZCBAcmVmICBIQUxfREFDX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfREFDX0luaXQgYW5kIEByZWYgSEFMX0RBQ19EZUluaXQKKyAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgorICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCisgICAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICAgdXNpbmcgQHJlZiBIQUxfREFDX1JlZ2lzdGVyQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfREFDX0RlSW5pdAorICAgICAgb3IgQHJlZiBIQUxfREFDX0luaXQgZnVuY3Rpb24uCisKKyAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgICAgICoqKiBEQUMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIERBQyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgX19IQUxfREFDX0VOQUJMRSA6IEVuYWJsZSB0aGUgREFDIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9EQUNfRElTQUJMRSA6IERpc2FibGUgdGhlIERBQyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfREFDX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBEQUMncyBwZW5kaW5nIGZsYWdzCisgICAgICAoKykgX19IQUxfREFDX0dFVF9GTEFHOiBHZXQgdGhlIHNlbGVjdGVkIERBQydzIGZsYWcgc3RhdHVzCisKKyAgICAgWy4uXQorICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIERBQyBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0RBQ19NT0RVTEVfRU5BQkxFRAorI2lmIGRlZmluZWQoREFDMSkKKworLyoqIEBkZWZncm91cCBEQUMgREFDCisgICogQGJyaWVmIERBQyBkcml2ZXIgbW9kdWxlcworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBEQUNfUHJpdmF0ZV9Db25zdGFudHMgREFDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNRU9VVF9EQUNfQ0FMSUJDT05GSUcgICAgICAgIDFVICAgICAgICAgLyogMSAgIG1zICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9ucyBEQUMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBEQUMuCisgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgREFDLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERBQyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBEQUNfSW5pdFN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Jbml0KERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKQoreworICAvKiBDaGVjayBEQUMgaGFuZGxlICovCisgIGlmIChoZGFjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQUxMX0lOU1RBTkNFKGhkYWMtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhkYWMtPlN0YXRlID09IEhBTF9EQUNfU1RBVEVfUkVTRVQpCisgIHsKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogSW5pdCB0aGUgREFDIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgaGRhYy0+Q29udkNwbHRDYWxsYmFja0NoMSAgICAgICAgICAgPSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDE7CisgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDEgICAgICAgPSBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxOworICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDEgICAgICAgICAgICAgID0gSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxOworICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDEgICAgICAgID0gSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxOworCisgICAgaGRhYy0+Q29udkNwbHRDYWxsYmFja0NoMiAgICAgICAgICAgPSBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMjsKKyAgICBoZGFjLT5Db252SGFsZkNwbHRDYWxsYmFja0NoMiAgICAgICA9IEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMjsKKyAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gyICAgICAgICAgICAgICA9IEhBTF9EQUNFeF9FcnJvckNhbGxiYWNrQ2gyOworICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDIgICAgICAgID0gSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDI7CisKKyAgICBpZiAoaGRhYy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgID0gSEFMX0RBQ19Nc3BJbml0OworICAgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoZGFjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhkYWMtPk1zcEluaXRDYWxsYmFjayhoZGFjKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0RBQ19Nc3BJbml0KGhkYWMpOworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgREFDIHN0YXRlKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaGRhYy0+RXJyb3JDb2RlID0gSEFMX0RBQ19FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERBQyBzdGF0ZSovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBEQUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19EZUluaXQoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIENoZWNrIERBQyBoYW5kbGUgKi8KKyAgaWYgKGhkYWMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMTF9JTlNUQU5DRShoZGFjLT5JbnN0YW5jZSkpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGRhYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfREFDX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayhoZGFjKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9EQUNfTXNwRGVJbml0KGhkYWMpOworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIFNldCBEQUMgZXJyb3IgY29kZSB0byBub25lICovCisgIGhkYWMtPkVycm9yQ29kZSA9IEhBTF9EQUNfRVJST1JfTk9ORTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkYWMpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBEQUMgTVNQLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNfTXNwSW5pdChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgREFDIE1TUC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX01zcERlSW5pdChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24uCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIGNvbnZlcnNpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyBEQUMgYW5kIHN0YXJ0cyBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdGFydChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0RBQ19FTkFCTEUoaGRhYywgQ2hhbm5lbCk7CisKKyAgaWYgKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIENoZWNrIGlmIHNvZnR3YXJlIHRyaWdnZXIgZW5hYmxlZCAqLworICAgIGlmICgoaGRhYy0+SW5zdGFuY2UtPkNSICYgKERBQ19DUl9URU4xIHwgREFDX0NSX1RTRUwxKSkgPT0gREFDX1RSSUdHRVJfU09GVFdBUkUpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgc29mdHdhcmUgY29udmVyc2lvbiAqLworICAgICAgU0VUX0JJVChoZGFjLT5JbnN0YW5jZS0+U1dUUklHUiwgREFDX1NXVFJJR1JfU1dUUklHMSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIGlmIHNvZnR3YXJlIHRyaWdnZXIgZW5hYmxlZCAqLworICAgIGlmICgoaGRhYy0+SW5zdGFuY2UtPkNSICYgKERBQ19DUl9URU4yIHwgREFDX0NSX1RTRUwyKSkgPT0gKERBQ19UUklHR0VSX1NPRlRXQVJFIDw8IENoYW5uZWwpKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgREFDIHNvZnR3YXJlIGNvbnZlcnNpb24qLworICAgICAgU0VUX0JJVChoZGFjLT5JbnN0YW5jZS0+U1dUUklHUiwgREFDX1NXVFJJR1JfU1dUUklHMik7CisgICAgfQorICB9CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdG9wKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0RJU0FCTEUoaGRhYywgQ2hhbm5lbCk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgREFDIGFuZCBzdGFydHMgY29udmVyc2lvbiBvZiBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBwZXJpcGhlcmFsIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBEQUMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQWxpZ25tZW50IFNwZWNpZmllcyB0aGUgZGF0YSBhbGlnbm1lbnQgZm9yIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1N0YXJ0X0RNQShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MzJfdCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbm1lbnQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgaWYgKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIFNldCB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMSAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUxLT5YZmVyQ3BsdENhbGxiYWNrID0gREFDX0RNQUNvbnZDcGx0Q2gxOworCisgICAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBmb3IgY2hhbm5lbDEgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBEQUNfRE1BSGFsZkNvbnZDcGx0Q2gxOworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgZm9yIGNoYW5uZWwxICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTEtPlhmZXJFcnJvckNhbGxiYWNrID0gREFDX0RNQUVycm9yQ2gxOworCisgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDEgRE1BIHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhkYWMtPkluc3RhbmNlLT5DUiwgREFDX0NSX0RNQUVOMSk7CisKKyAgICAvKiBDYXNlIG9mIHVzZSBvZiBjaGFubmVsIDEgKi8KKyAgICBzd2l0Y2ggKEFsaWdubWVudCkKKyAgICB7CisgICAgICBjYXNlIERBQ19BTElHTl8xMkJfUjoKKyAgICAgICAgLyogR2V0IERIUjEyUjEgYWRkcmVzcyAqLworICAgICAgICB0bXByZWcgPSAodWludDMyX3QpJmhkYWMtPkluc3RhbmNlLT5ESFIxMlIxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9MOgorICAgICAgICAvKiBHZXQgREhSMTJMMSBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyTDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fOEJfUjoKKyAgICAgICAgLyogR2V0IERIUjhSMSBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjhSMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgZm9yIGNoYW5uZWwyICovCisgICAgaGRhYy0+RE1BX0hhbmRsZTItPlhmZXJDcGx0Q2FsbGJhY2sgPSBEQUNfRE1BQ29udkNwbHRDaDI7CisKKyAgICAvKiBTZXQgdGhlIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGZvciBjaGFubmVsMiAqLworICAgIGhkYWMtPkRNQV9IYW5kbGUyLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IERBQ19ETUFIYWxmQ29udkNwbHRDaDI7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayBmb3IgY2hhbm5lbDIgKi8KKyAgICBoZGFjLT5ETUFfSGFuZGxlMi0+WGZlckVycm9yQ2FsbGJhY2sgPSBEQUNfRE1BRXJyb3JDaDI7CisKKyAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMiBETUEgcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfRE1BRU4yKTsKKworICAgIC8qIENhc2Ugb2YgdXNlIG9mIGNoYW5uZWwgMiAqLworICAgIHN3aXRjaCAoQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGNhc2UgREFDX0FMSUdOXzEyQl9SOgorICAgICAgICAvKiBHZXQgREhSMTJSMiBhZGRyZXNzICovCisgICAgICAgIHRtcHJlZyA9ICh1aW50MzJfdCkmaGRhYy0+SW5zdGFuY2UtPkRIUjEyUjI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQUNfQUxJR05fMTJCX0w6CisgICAgICAgIC8qIEdldCBESFIxMkwyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSMTJMMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERBQ19BTElHTl84Ql9SOgorICAgICAgICAvKiBHZXQgREhSOFIyIGFkZHJlc3MgKi8KKyAgICAgICAgdG1wcmVnID0gKHVpbnQzMl90KSZoZGFjLT5JbnN0YW5jZS0+REhSOFIyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgaWYgKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgREFDIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9EQUNfRU5BQkxFX0lUKGhkYWMsIERBQ19JVF9ETUFVRFIxKTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhkYWMtPkRNQV9IYW5kbGUxLCAodWludDMyX3QpcERhdGEsIHRtcHJlZywgTGVuZ3RoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIERBQyBETUEgdW5kZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfREFDX0VOQUJMRV9JVChoZGFjLCBEQUNfSVRfRE1BVURSMik7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoZGFjLT5ETUFfSGFuZGxlMiwgKHVpbnQzMl90KXBEYXRhLCB0bXByZWcsIExlbmd0aCk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RBQ19FTkFCTEUoaGRhYywgQ2hhbm5lbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfRE1BOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIERBQyBhbmQgc3RvcCBjb252ZXJzaW9uIG9mIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19TdG9wX0RNQShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgRE1BIHJlcXVlc3QgKi8KKyAgaGRhYy0+SW5zdGFuY2UtPkNSICY9IH4oREFDX0NSX0RNQUVOMSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfREFDX0RJU0FCTEUoaGRhYywgQ2hhbm5lbCk7CisKKyAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKworICAvKiBDaGFubmVsMSBpcyB1c2VkICovCisgIGlmIChDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaGRhYy0+RE1BX0hhbmRsZTEpOworCisgICAgLyogRGlzYWJsZSB0aGUgREFDIERNQSB1bmRlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9EQUNfRElTQUJMRV9JVChoZGFjLCBEQUNfSVRfRE1BVURSMSk7CisgIH0KKyAgZWxzZSAvKiBDaGFubmVsMiBpcyB1c2VkIGZvciAqLworICB7CisgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhkYWMtPkRNQV9IYW5kbGUyKTsKKworICAgIC8qIERpc2FibGUgdGhlIERBQyBETUEgdW5kZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfREFDX0RJU0FCTEVfSVQoaGRhYywgREFDX0lUX0RNQVVEUjIpOworICB9CisKKyAgLyogQ2hlY2sgaWYgRE1BIENoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBVcGRhdGUgREFDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIERBQyBpbnRlcnJ1cHQgcmVxdWVzdAorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBpbnRlcnJ1cHRpb24gb2YgRE1BCisgICogICAgICAgICB1bmRlcnJ1bi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQUNfSVJRSGFuZGxlcihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgaWYgKF9fSEFMX0RBQ19HRVRfSVRfU09VUkNFKGhkYWMsIERBQ19JVF9ETUFVRFIxKSkKKyAgeworICAgIC8qIENoZWNrIHVuZGVycnVuIGZsYWcgb2YgREFDIGNoYW5uZWwgMSAqLworICAgIGlmIChfX0hBTF9EQUNfR0VUX0ZMQUcoaGRhYywgREFDX0ZMQUdfRE1BVURSMSkpCisgICAgeworICAgICAgLyogQ2hhbmdlIERBQyBzdGF0ZSB0byBlcnJvciBzdGF0ZSAqLworICAgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0VSUk9SOworCisgICAgICAvKiBTZXQgREFDIGVycm9yIGNvZGUgdG8gY2hhbmVsMSBETUEgdW5kZXJydW4gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGRhYy0+RXJyb3JDb2RlLCBIQUxfREFDX0VSUk9SX0RNQVVOREVSUlVOQ0gxKTsKKworICAgICAgLyogQ2xlYXIgdGhlIHVuZGVycnVuIGZsYWcgKi8KKyAgICAgIF9fSEFMX0RBQ19DTEVBUl9GTEFHKGhkYWMsIERBQ19GTEFHX0RNQVVEUjEpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoZGFjLT5JbnN0YW5jZS0+Q1IsIERBQ19DUl9ETUFFTjEpOworCisgICAgICAvKiBFcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDEoaGRhYyk7CisjZWxzZQorICAgICAgSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxKGhkYWMpOworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIGlmIChfX0hBTF9EQUNfR0VUX0lUX1NPVVJDRShoZGFjLCBEQUNfSVRfRE1BVURSMikpCisgIHsKKyAgICAvKiBDaGVjayB1bmRlcnJ1biBmbGFnIG9mIERBQyBjaGFubmVsIDIgKi8KKyAgICBpZiAoX19IQUxfREFDX0dFVF9GTEFHKGhkYWMsIERBQ19GTEFHX0RNQVVEUjIpKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgdG8gZXJyb3Igc3RhdGUgKi8KKyAgICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9FUlJPUjsKKworICAgICAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIGNoYW5uZWwyIERNQSB1bmRlcnJ1biBlcnJvciAqLworICAgICAgU0VUX0JJVChoZGFjLT5FcnJvckNvZGUsIEhBTF9EQUNfRVJST1JfRE1BVU5ERVJSVU5DSDIpOworCisgICAgICAvKiBDbGVhciB0aGUgdW5kZXJydW4gZmxhZyAqLworICAgICAgX19IQUxfREFDX0NMRUFSX0ZMQUcoaGRhYywgREFDX0ZMQUdfRE1BVURSMik7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsMiBETUEgcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhkYWMtPkluc3RhbmNlLT5DUiwgREFDX0NSX0RNQUVOMik7CisKKyAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMihoZGFjKTsKKyNlbHNlCisgICAgICBIQUxfREFDRXhfRE1BVW5kZXJydW5DYWxsYmFja0NoMihoZGFjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmllZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgdmFsdWUgZm9yIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIEFsaWdubWVudCBTcGVjaWZpZXMgdGhlIGRhdGEgYWxpZ25tZW50LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl84Ql9SOiA4Yml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQUxJR05fMTJCX1I6IDEyYml0IHJpZ2h0IGRhdGEgYWxpZ25tZW50IHNlbGVjdGVkCisgICogQHBhcmFtICBEYXRhIERhdGEgdG8gYmUgbG9hZGVkIGluIHRoZSBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1NldFZhbHVlKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbGlnbm1lbnQsIHVpbnQzMl90IERhdGEpCit7CisgIF9fSU8gdWludDMyX3QgdG1wID0gMDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0FMSUdOKEFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX0RBVEEoRGF0YSkpOworCisgIHRtcCA9ICh1aW50MzJfdCloZGFjLT5JbnN0YW5jZTsKKyAgaWYgKENoYW5uZWwgPT0gREFDX0NIQU5ORUxfMSkKKyAgeworICAgIHRtcCArPSBEQUNfREhSMTJSMV9BTElHTk1FTlQoQWxpZ25tZW50KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXAgKz0gREFDX0RIUjEyUjJfQUxJR05NRU5UKEFsaWdubWVudCk7CisgIH0KKworICAvKiBTZXQgdGhlIERBQyBjaGFubmVsIHNlbGVjdGVkIGRhdGEgaG9sZGluZyByZWdpc3RlciAqLworICAqKF9fSU8gdWludDMyX3QgKikgdG1wID0gRGF0YTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZSBmb3IgQ2hhbm5lbDEKKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGhhbGYgRE1BIHRyYW5zZmVyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlIGZvciBDaGFubmVsMQorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRXJyb3IgREFDIGNhbGxiYWNrIGZvciBDaGFubmVsMS4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgdW5kZXJydW4gREFDIGNhbGxiYWNrIGZvciBjaGFubmVsMS4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDEoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDEgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzLgorICAgICAgKCspIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgREFDIGNoYW5uZWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgbGFzdCBkYXRhIG91dHB1dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHZhbHVlLgorICAqLwordWludDMyX3QgSEFMX0RBQ19HZXRWYWx1ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKworICAvKiBSZXR1cm5zIHRoZSBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCByZWdpc3RlciB2YWx1ZSAqLworICBpZiAoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICB7CisgICAgcmV0dXJuIGhkYWMtPkluc3RhbmNlLT5ET1IxOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBoZGFjLT5JbnN0YW5jZS0+RE9SMjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIHNDb25maWcgREFDIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19Db25maWdDaGFubmVsKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCBEQUNfQ2hhbm5lbENvbmZUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXByZWcxOworICB1aW50MzJfdCB0bXByZWcyOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwVTsKKworICAvKiBDaGVjayB0aGUgREFDIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19UUklHR0VSKHNDb25maWctPkRBQ19UcmlnZ2VyKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfT1VUUFVUX0JVRkZFUl9TVEFURShzQ29uZmlnLT5EQUNfT3V0cHV0QnVmZmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hJUF9DT05ORUNUSU9OKHNDb25maWctPkRBQ19Db25uZWN0T25DaGlwUGVyaXBoZXJhbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX1RSSU1NSU5HKHNDb25maWctPkRBQ19Vc2VyVHJpbW1pbmcpKTsKKyAgaWYgKChzQ29uZmlnLT5EQUNfVXNlclRyaW1taW5nKSA9PSBEQUNfVFJJTU1JTkdfVVNFUikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19EQUNfVFJJTU1JTkdWQUxVRShzQ29uZmlnLT5EQUNfVHJpbW1pbmdWYWx1ZSkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19EQUNfU0FNUExFQU5ESE9MRChzQ29uZmlnLT5EQUNfU2FtcGxlQW5kSG9sZCkpOworICBpZiAoKHNDb25maWctPkRBQ19TYW1wbGVBbmRIb2xkKSA9PSBEQUNfU0FNUExFQU5ESE9MRF9FTkFCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfREFDX1NBTVBMRVRJTUUoc0NvbmZpZy0+REFDX1NhbXBsZUFuZEhvbGRDb25maWcuREFDX1NhbXBsZVRpbWUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfREFDX0hPTERUSU1FKHNDb25maWctPkRBQ19TYW1wbGVBbmRIb2xkQ29uZmlnLkRBQ19Ib2xkVGltZSkpOworICAgIGFzc2VydF9wYXJhbShJU19EQUNfUkVGUkVTSFRJTUUoc0NvbmZpZy0+REFDX1NhbXBsZUFuZEhvbGRDb25maWcuREFDX1JlZnJlc2hUaW1lKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX0JVU1k7CisKKyAgaWYgKHNDb25maWctPkRBQ19TYW1wbGVBbmRIb2xkID09IERBQ19TQU1QTEVBTkRIT0xEX0VOQUJMRSkKKyAgICAvKiBTYW1wbGUgb24gb2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgeworICAgIC8qIFNhbXBsZVRpbWUgKi8KKyAgICBpZiAoQ2hhbm5lbCA9PSBEQUNfQ0hBTk5FTF8xKQorICAgIHsKKyAgICAgIC8qIEdldCB0aW1lb3V0ICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBTSFNSMSBjYW4gYmUgd3JpdHRlbiB3aGVuIEJXU1QxIGlzIGNsZWFyZWQgKi8KKyAgICAgIHdoaWxlICgoKGhkYWMtPkluc3RhbmNlLT5TUikgJiBEQUNfU1JfQldTVDEpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUSU1FT1VUX0RBQ19DQUxJQkNPTkZJRykKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgICAgU0VUX0JJVChoZGFjLT5FcnJvckNvZGUsIEhBTF9EQUNfRVJST1JfVElNRU9VVCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgICAgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9USU1FT1VUOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgICBIQUxfRGVsYXkoMSk7CisgICAgICBoZGFjLT5JbnN0YW5jZS0+U0hTUjEgPSBzQ29uZmlnLT5EQUNfU2FtcGxlQW5kSG9sZENvbmZpZy5EQUNfU2FtcGxlVGltZTsKKyAgICB9CisgICAgZWxzZSAvKiBDaGFubmVsIDIgKi8KKyAgICB7CisgICAgICAvKiBTSFNSMiBjYW4gYmUgd3JpdHRlbiB3aGVuIEJXU1QyIGlzIGNsZWFyZWQgKi8KKworICAgICAgd2hpbGUgKCgoaGRhYy0+SW5zdGFuY2UtPlNSKSAmIERBQ19TUl9CV1NUMikgIT0gMFVMKQorICAgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRJTUVPVVRfREFDX0NBTElCQ09ORklHKQorICAgICAgICB7CisgICAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICBTRVRfQklUKGhkYWMtPkVycm9yQ29kZSwgSEFMX0RBQ19FUlJPUl9USU1FT1VUKTsKKworICAgICAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICAgICAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEhBTF9EZWxheSgxVSk7CisgICAgICBoZGFjLT5JbnN0YW5jZS0+U0hTUjIgPSBzQ29uZmlnLT5EQUNfU2FtcGxlQW5kSG9sZENvbmZpZy5EQUNfU2FtcGxlVGltZTsKKyAgICB9CisKKyAgICAvKiBIb2xkVGltZSAqLworICAgIE1PRElGWV9SRUcoaGRhYy0+SW5zdGFuY2UtPlNISFIsIERBQ19TSEhSX1RIT0xEMSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCksIChzQ29uZmlnLT5EQUNfU2FtcGxlQW5kSG9sZENvbmZpZy5EQUNfSG9sZFRpbWUpIDw8IChDaGFubmVsICYgMHgxMFVMKSk7CisgICAgLyogUmVmcmVzaFRpbWUgKi8KKyAgICBNT0RJRllfUkVHKGhkYWMtPkluc3RhbmNlLT5TSFJSLCBEQUNfU0hSUl9UUkVGUkVTSDEgPDwgKENoYW5uZWwgJiAweDEwVUwpLCAoc0NvbmZpZy0+REFDX1NhbXBsZUFuZEhvbGRDb25maWcuREFDX1JlZnJlc2hUaW1lKSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworICB9CisKKyAgaWYgKHNDb25maWctPkRBQ19Vc2VyVHJpbW1pbmcgPT0gREFDX1RSSU1NSU5HX1VTRVIpCisgICAgLyogVVNFUiBUUklNTUlORyAqLworICB7CisgICAgLyogR2V0IHRoZSBEQUMgQ0NSIHZhbHVlICovCisgICAgdG1wcmVnMSA9IGhkYWMtPkluc3RhbmNlLT5DQ1I7CisgICAgLyogQ2xlYXIgdHJpbW1pbmcgdmFsdWUgKi8KKyAgICB0bXByZWcxICY9IH4oKCh1aW50MzJfdCkoREFDX0NDUl9PVFJJTTEpKSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworICAgIC8qIENvbmZpZ3VyZSBmb3IgdGhlIHNlbGVjdGVkIHRyaW1taW5nIG9mZnNldCAqLworICAgIHRtcHJlZzIgPSBzQ29uZmlnLT5EQUNfVHJpbW1pbmdWYWx1ZTsKKyAgICAvKiBDYWxjdWxhdGUgQ0NSIHJlZ2lzdGVyIHZhbHVlIGRlcGVuZGluZyBvbiBEQUNfQ2hhbm5lbCAqLworICAgIHRtcHJlZzEgfD0gdG1wcmVnMiA8PCAoQ2hhbm5lbCAmIDB4MTBVTCk7CisgICAgLyogV3JpdGUgdG8gREFDIENDUiAqLworICAgIGhkYWMtPkluc3RhbmNlLT5DQ1IgPSB0bXByZWcxOworICB9CisgIC8qIGVsc2UgZmFjdG9yeSB0cmltbWluZyBpcyB1c2VkIChmYWN0b3J5IHNldHRpbmcgYXJlIGF2YWlsYWJsZSBhdCByZXNldCkqLworICAvKiBTVyBOb3RoaW5nIGhhcyBub3RoaW5nIHRvIGRvICovCisKKyAgLyogR2V0IHRoZSBEQUMgTUNSIHZhbHVlICovCisgIHRtcHJlZzEgPSBoZGFjLT5JbnN0YW5jZS0+TUNSOworICAvKiBDbGVhciBEQUNfTUNSX01PREV4IGJpdHMgKi8KKyAgdG1wcmVnMSAmPSB+KCgodWludDMyX3QpKERBQ19NQ1JfTU9ERTEpKSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworICAvKiBDb25maWd1cmUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDogbW9kZSwgYnVmZmVyIG91dHB1dCAmIG9uIGNoaXAgcGVyaXBoZXJhbCBjb25uZWN0ICovCisgIHRtcHJlZzIgPSAoc0NvbmZpZy0+REFDX1NhbXBsZUFuZEhvbGQgfCBzQ29uZmlnLT5EQUNfT3V0cHV0QnVmZmVyIHwgc0NvbmZpZy0+REFDX0Nvbm5lY3RPbkNoaXBQZXJpcGhlcmFsKTsKKyAgLyogQ2FsY3VsYXRlIE1DUiByZWdpc3RlciB2YWx1ZSBkZXBlbmRpbmcgb24gREFDX0NoYW5uZWwgKi8KKyAgdG1wcmVnMSB8PSB0bXByZWcyIDw8IChDaGFubmVsICYgMHgxMFVMKTsKKyAgLyogV3JpdGUgdG8gREFDIE1DUiAqLworICBoZGFjLT5JbnN0YW5jZS0+TUNSID0gdG1wcmVnMTsKKworICAvKiBEQUMgaW4gbm9ybWFsIG9wZXJhdGluZyBtb2RlIGhlbmNlIGNsZWFyIERBQ19DUl9DRU54IGJpdCAqLworICBDTEVBUl9CSVQoaGRhYy0+SW5zdGFuY2UtPkNSLCBEQUNfQ1JfQ0VOMSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworCisgIC8qIEdldCB0aGUgREFDIENSIHZhbHVlICovCisgIHRtcHJlZzEgPSBoZGFjLT5JbnN0YW5jZS0+Q1I7CisgIC8qIENsZWFyIFRFTngsIFRTRUx4LCBXQVZFeCBhbmQgTUFNUHggYml0cyAqLworICB0bXByZWcxICY9IH4oKCh1aW50MzJfdCkoREFDX0NSX01BTVAxIHwgREFDX0NSX1dBVkUxIHwgREFDX0NSX1RTRUwxIHwgREFDX0NSX1RFTjEpKSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpOworICAvKiBDb25maWd1cmUgZm9yIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbDogdHJpZ2dlciAqLworICAvKiBTZXQgVFNFTHggYW5kIFRFTnggYml0cyBhY2NvcmRpbmcgdG8gREFDX1RyaWdnZXIgdmFsdWUgKi8KKyAgdG1wcmVnMiA9IHNDb25maWctPkRBQ19UcmlnZ2VyOworICAvKiBDYWxjdWxhdGUgQ1IgcmVnaXN0ZXIgdmFsdWUgZGVwZW5kaW5nIG9uIERBQ19DaGFubmVsICovCisgIHRtcHJlZzEgfD0gdG1wcmVnMiA8PCAoQ2hhbm5lbCAmIDB4MTBVTCk7CisgIC8qIFdyaXRlIHRvIERBQyBDUiAqLworICBoZGFjLT5JbnN0YW5jZS0+Q1IgPSB0bXByZWcxOworICAvKiBEaXNhYmxlIHdhdmUgZ2VuZXJhdGlvbiAqLworICBoZGFjLT5JbnN0YW5jZS0+Q1IgJj0gfihEQUNfQ1JfV0FWRTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBDaGVjayB0aGUgREFDIHN0YXRlLgorICAgICAgKCspIENoZWNrIHRoZSBEQUMgRXJyb3JzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIHJldHVybiB0aGUgREFDIGhhbmRsZSBzdGF0ZQorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0RBQ19TdGF0ZVR5cGVEZWYgSEFMX0RBQ19HZXRTdGF0ZShEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUmV0dXJuIERBQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhkYWMtPlN0YXRlOworfQorCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBEQUMgZXJyb3IgY29kZQorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIERBQyBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfREFDX0dldEVycm9yKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKQoreworICByZXR1cm4gaGRhYy0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgREFDIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkYWMgREFDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgREFDIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEICAgICAgIERBQyBDSDEgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDFfSEFMRl9DT01QTEVURV9DQl9JRCAgREFDIENIMSBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0VSUk9SX0lEICAgICAgICAgICAgIERBQyBDSDEgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDFfVU5ERVJSVU5fQ0JfSUQgICAgICAgREFDIENIMSBVbmRlclJ1biBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMl9DT01QTEVURV9DQl9JRCAgICAgICBEQUMgQ0gyIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gyX0hBTEZfQ09NUExFVEVfQ0JfSUQgIERBQyBDSDIgSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMl9FUlJPUl9JRCAgICAgICAgICAgICBEQUMgQ0gyIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gyX1VOREVSUlVOX0NCX0lEICAgICAgIERBQyBDSDIgVW5kZXJSdW4gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgREFDIE1TUCBJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfTVNQREVJTklUX0NCX0lEICAgICAgICAgIERBQyBNU1AgRGVJbml0IENhbGxiYWNrIElECisgICoKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDX1JlZ2lzdGVyQ2FsbGJhY2soREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwREFDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkYWMpOworCisgIGlmIChoZGFjLT5TdGF0ZSA9PSBIQUxfREFDX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gxID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfRVJST1JfSUQgOgorICAgICAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gxID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfVU5ERVJSVU5fQ0JfSUQgOgorICAgICAgICBoZGFjLT5ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDJfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gyID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDJfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDJfRVJST1JfSUQgOgorICAgICAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gyID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDJfVU5ERVJSVU5fQ0JfSUQgOgorICAgICAgICBoZGFjLT5ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoZGFjLT5TdGF0ZSA9PSBIQUxfREFDX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFVzZXIgREFDIENhbGxiYWNrCisgICogICAgICAgICBEQUMgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRhYyBEQUMgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gxX0NPTVBMRVRFX0NCX0lEICAgICAgICAgIERBQyBDSDEgdHJhbmZlciBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMV9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICBEQUMgQ0gxIEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDFfRVJST1JfSUQgICAgICAgICAgICAgICAgREFDIENIMSBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX0NIMV9VTkRFUlJVTl9DQl9JRCAgICAgICAgICBEQUMgQ0gxIFVuZGVyUnVuIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gyX0NPTVBMRVRFX0NCX0lEICAgICAgICAgIERBQyBDSDIgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgREFDIENIMiBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9EQUNfQ0gyX0VSUk9SX0lEICAgICAgICAgICAgICAgIERBQyBDSDIgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19DSDJfVU5ERVJSVU5fQ0JfSUQgICAgICAgICAgREFDIENIMiBVbmRlclJ1biBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfREFDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICBEQUMgTVNQIEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgREFDIE1TUCBEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0RBQ19BTExfQ0JfSUQgICAgICAgICAgICAgICAgICAgREFDIEFsbCBjYWxsYmFja3MKKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ19VblJlZ2lzdGVyQ2FsbGJhY2soREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIEhBTF9EQUNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgaWYgKGhkYWMtPlN0YXRlID09IEhBTF9EQUNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfREFDX0NIMV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEgPSBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfREFDX0NIMV9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDEgPSBIQUxfREFDX0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfRVJST1JfSUQgOgorICAgICAgICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gxID0gSEFMX0RBQ19FcnJvckNhbGxiYWNrQ2gxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDFfVU5ERVJSVU5fQ0JfSUQgOgorICAgICAgICBoZGFjLT5ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxID0gSEFMX0RBQ19ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19DSDJfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gyID0gSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfREFDX0NIMl9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfREFDX0NIMl9FUlJPUl9JRCA6CisgICAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9EQUNfQ0gyX1VOREVSUlVOX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMiA9IEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RBQ19Nc3BJbml0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9EQUNfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0RBQ19BTExfQ0JfSUQgOgorICAgICAgICBoZGFjLT5Db252Q3BsdENhbGxiYWNrQ2gxID0gSEFMX0RBQ19Db252Q3BsdENhbGxiYWNrQ2gxOworICAgICAgICBoZGFjLT5Db252SGFsZkNwbHRDYWxsYmFja0NoMSA9IEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDE7CisgICAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDEgPSBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDE7CisgICAgICAgIGhkYWMtPkRNQVVuZGVycnVuQ2FsbGJhY2tDaDEgPSBIQUxfREFDX0RNQVVuZGVycnVuQ2FsbGJhY2tDaDE7CisgICAgICAgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMjsKKyAgICAgICAgaGRhYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDI7CisgICAgICAgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDIgPSBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMjsKKyAgICAgICAgaGRhYy0+RE1BVW5kZXJydW5DYWxsYmFja0NoMiA9IEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyOworICAgICAgICBoZGFjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfREFDX01zcEluaXQ7CisgICAgICAgIGhkYWMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0RBQ19Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGRhYy0+U3RhdGUgPT0gSEFMX0RBQ19TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9EQUNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhkYWMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9EQUNfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9EQUNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGRhYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfREFDX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkYWMtPkVycm9yQ29kZSB8PSBIQUxfREFDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBEQUNfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERNQSBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBEQUNfRE1BQ29udkNwbHRDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmICpoZGFjID0gKERBQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDEoaGRhYyk7CisjZWxzZQorICBIQUxfREFDX0NvbnZDcGx0Q2FsbGJhY2tDaDEoaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBEQUNfRE1BSGFsZkNvbnZDcGx0Q2gxKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyA9IChEQUNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworICAvKiBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoZGFjLT5Db252SGFsZkNwbHRDYWxsYmFja0NoMShoZGFjKTsKKyNlbHNlCisgIEhBTF9EQUNfQ29udkhhbGZDcGx0Q2FsbGJhY2tDaDEoaGRhYyk7CisjZW5kaWYgIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBlcnJvciBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBEQUNfRE1BRXJyb3JDaDEoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmICpoZGFjID0gKERBQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogU2V0IERBQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBoZGFjLT5FcnJvckNvZGUgfD0gSEFMX0RBQ19FUlJPUl9ETUE7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkVycm9yQ2FsbGJhY2tDaDEoaGRhYyk7CisjZWxzZQorICBIQUxfREFDX0Vycm9yQ2FsbGJhY2tDaDEoaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogREFDMSAqLworCisjZW5kaWYgLyogSEFMX0RBQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfZGFjX2V4LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9kYWNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQwMGQyCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfZGFjX2V4LmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2RhY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBEQUMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEQUMgcGVyaXBoZXJhbC4KKyAgKgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgKioqIER1YWwgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgKCspIFdoZW4gRHVhbCBtb2RlIGlzIGVuYWJsZWQgKGkuZS4gREFDIENoYW5uZWwxIGFuZCBDaGFubmVsMiBhcmUgdXNlZCBzaW11bHRhbmVvdXNseSkgOgorICAgICAgICAgIFVzZSBIQUxfREFDRXhfRHVhbEdldFZhbHVlKCkgdG8gZ2V0IGRpZ2l0YWwgZGF0YSB0byBiZSBjb252ZXJ0ZWQgYW5kIHVzZQorICAgICAgICAgIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoKSB0byBzZXQgZGlnaXRhbCB2YWx1ZSB0byBjb252ZXJ0ZWQgc2ltdWx0YW5lb3VzbHkgaW4KKyAgICAgICAgICBDaGFubmVsIDEgYW5kIENoYW5uZWwgMi4KKworICAgICAqKiogU2lnbmFsIGdlbmVyYXRpb24gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgKCspIFVzZSBIQUxfREFDRXhfVHJpYW5nbGVXYXZlR2VuZXJhdGUoKSB0byBnZW5lcmF0ZSBUcmlhbmdsZSBzaWduYWwuCisgICAgICAoKykgVXNlIEhBTF9EQUNFeF9Ob2lzZVdhdmVHZW5lcmF0ZSgpIHRvIGdlbmVyYXRlIE5vaXNlIHNpZ25hbC4KKworICAgICAgKCspIEhBTF9EQUNFeF9TZWxmQ2FsaWJyYXRlIHRvIGNhbGlicmF0ZSBvbmUgREFDIGNoYW5uZWwuCisgICAgICAoKykgSEFMX0RBQ0V4X1NldFVzZXJUcmltbWluZyB0byBzZXQgdXNlciB0cmltbWluZyB2YWx1ZS4KKyAgICAgICgrKSBIQUxfREFDRXhfR2V0VHJpbU9mZnNldCB0byByZXRyaWV2ZSB0cmltbWluZyB2YWx1ZSAoZmFjdG9yeSBzZXR0aW5nCisgICAgICAgICAgYWZ0ZXIgcmVzZXQsIHVzZXIgc2V0dGluZyBpZiBIQUxfREFDRXhfU2V0VXNlclRyaW1taW5nIGhhdmUgYmVlbiB1c2VkCisgICAgICAgICAgYXQgbGVhc3Qgb25lIHRpbWUgYWZ0ZXIgcmVzZXQpLgorCisgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9EQUNfTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQoREFDMSkKKworLyoqIEBkZWZncm91cCBEQUNFeCBEQUNFeAorICAqIEBicmllZiBEQUMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIERBQ0V4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbi4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24uCisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIEdldCByZXN1bHQgb2YgY29udmVyc2lvbi4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIGR1YWwgbW9kZSBjb252ZXJzaW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCB3YXZlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEBwYXJhbSAgQW1wbGl0dWRlIFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8xOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxCisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8zOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAzCisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV83OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA3CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8xNTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgMTUKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzMxOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAzMQorICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfNjM6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDYzCisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8xMjc6IFNlbGVjdCBtYXggdHJpYW5nbGUgYW1wbGl0dWRlIG9mIDEyNworICAqICAgICAgICAgICAgQGFyZyBEQUNfVFJJQU5HTEVBTVBMSVRVREVfMjU1OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAyNTUKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX1RSSUFOR0xFQU1QTElUVURFXzUxMTogU2VsZWN0IG1heCB0cmlhbmdsZSBhbXBsaXR1ZGUgb2YgNTExCisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8xMDIzOiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAxMDIzCisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV8yMDQ3OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiAyMDQ3CisgICogICAgICAgICAgICBAYXJnIERBQ19UUklBTkdMRUFNUExJVFVERV80MDk1OiBTZWxlY3QgbWF4IHRyaWFuZ2xlIGFtcGxpdHVkZSBvZiA0MDk1CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfREFDRXhfVHJpYW5nbGVXYXZlR2VuZXJhdGUoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IEFtcGxpdHVkZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19MRlNSX1VOTUFTS19UUklBTkdMRV9BTVBMSVRVREUoQW1wbGl0dWRlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZGFjKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSB0aGUgdHJpYW5nbGUgd2F2ZSBnZW5lcmF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgKi8KKyAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q1IsICgoREFDX0NSX1dBVkUxKSB8IChEQUNfQ1JfTUFNUDEpKSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCksIChEQUNfQ1JfV0FWRTFfMSB8IEFtcGxpdHVkZSkgPDwgKENoYW5uZWwgJiAweDEwVUwpKTsKKworICAvKiBDaGFuZ2UgREFDIHN0YXRlICovCisgIGhkYWMtPlN0YXRlID0gSEFMX0RBQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsIHdhdmUgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkCisgICogQHBhcmFtICBBbXBsaXR1ZGUgVW5tYXNrIERBQyBjaGFubmVsIExGU1IgZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVQwOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXQwIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzFfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzE6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTMl8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMjowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMzXzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFszOjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzRfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0WzQ6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTNV8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbNTowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM2XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs2OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzdfMDogVW5tYXNrIERBQyBjaGFubmVsIExGU1IgYml0Wzc6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBEQUNfTEZTUlVOTUFTS19CSVRTOF8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbODowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFM5XzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFs5OjBdIGZvciBub2lzZSB3YXZlIGdlbmVyYXRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0xGU1JVTk1BU0tfQklUUzEwXzA6IFVubWFzayBEQUMgY2hhbm5lbCBMRlNSIGJpdFsxMDowXSBmb3Igbm9pc2Ugd2F2ZSBnZW5lcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIERBQ19MRlNSVU5NQVNLX0JJVFMxMV8wOiBVbm1hc2sgREFDIGNoYW5uZWwgTEZTUiBiaXRbMTE6MF0gZm9yIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X05vaXNlV2F2ZUdlbmVyYXRlKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBBbXBsaXR1ZGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19EQUNfQ0hBTk5FTChDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfTEZTUl9VTk1BU0tfVFJJQU5HTEVfQU1QTElUVURFKEFtcGxpdHVkZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfQlVTWTsKKworICAvKiBFbmFibGUgdGhlIG5vaXNlIHdhdmUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsICovCisgIE1PRElGWV9SRUcoaGRhYy0+SW5zdGFuY2UtPkNSLCAoKERBQ19DUl9XQVZFMSkgfCAoREFDX0NSX01BTVAxKSkgPDwgKENoYW5uZWwgJiAweDEwVUwpLCAoREFDX0NSX1dBVkUxXzAgfCBBbXBsaXR1ZGUpIDw8IChDaGFubmVsICYgMHgxMFVMKSk7CisKKyAgLyogQ2hhbmdlIERBQyBzdGF0ZSAqLworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRhYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSBmb3IgZHVhbCBEQUMgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGhkYWMgcG9pbnRlciB0byBhIERBQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBEQUMuCisgICogQHBhcmFtICBBbGlnbm1lbnQgU3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudCBmb3IgZHVhbCBjaGFubmVsIERBQy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgREFDX0FMSUdOXzhCX1I6IDhiaXQgcmlnaHQgZGF0YSBhbGlnbm1lbnQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIERBQ19BTElHTl8xMkJfTDogMTJiaXQgbGVmdCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqICAgICAgICAgICAgREFDX0FMSUdOXzEyQl9SOiAxMmJpdCByaWdodCBkYXRhIGFsaWdubWVudCBzZWxlY3RlZAorICAqIEBwYXJhbSAgRGF0YTEgRGF0YSBmb3IgREFDIENoYW5uZWwxIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgRGF0YTIgRGF0YSBmb3IgREFDIENoYW5uZWwyIHRvIGJlIGxvYWRlZCBpbiB0aGUgc2VsZWN0ZWQgZGF0YSAgaG9sZGluZyByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIEluIGR1YWwgbW9kZSwgYSB1bmlxdWUgcmVnaXN0ZXIgYWNjZXNzIGlzIHJlcXVpcmVkIHRvIHdyaXRlIGluIGJvdGgKKyAgKiAgICAgICAgICBEQUMgY2hhbm5lbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9EdWFsU2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIHVpbnQzMl90IEFsaWdubWVudCwgdWludDMyX3QgRGF0YTEsIHVpbnQzMl90IERhdGEyKQoreworICB1aW50MzJfdCBkYXRhOworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTElHTihBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19EQVRBKERhdGExKSk7CisgIGFzc2VydF9wYXJhbShJU19EQUNfREFUQShEYXRhMikpOworCisgIC8qIENhbGN1bGF0ZSBhbmQgc2V0IGR1YWwgREFDIGRhdGEgaG9sZGluZyByZWdpc3RlciB2YWx1ZSAqLworICBpZiAoQWxpZ25tZW50ID09IERBQ19BTElHTl84Ql9SKQorICB7CisgICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgOFUpIHwgRGF0YTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgZGF0YSA9ICgodWludDMyX3QpRGF0YTIgPDwgMTZVKSB8IERhdGExOworICB9CisKKyAgdG1wID0gKHVpbnQzMl90KWhkYWMtPkluc3RhbmNlOworICB0bXAgKz0gREFDX0RIUjEyUkRfQUxJR05NRU5UKEFsaWdubWVudCk7CisKKyAgLyogU2V0IHRoZSBkdWFsIERBQyBzZWxlY3RlZCBkYXRhIGhvbGRpbmcgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopdG1wID0gZGF0YTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZSBmb3IgQ2hhbm5lbDIuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0NvbnZDcGx0Q2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnNpb24gaGFsZiBETUEgdHJhbnNmZXIgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUgZm9yIENoYW5uZWwyLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMihEQUNfSGFuZGxlVHlwZURlZiAqaGRhYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGRhYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9EQUNFeF9Db252SGFsZkNwbHRDYWxsYmFja0NoMiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEVycm9yIERBQyBjYWxsYmFjayBmb3IgQ2hhbm5lbDIuCisgICogQHBhcmFtICBoZGFjIHBvaW50ZXIgdG8gYSBEQUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgREFDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0RBQ0V4X0Vycm9yQ2FsbGJhY2tDaDIoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhkYWMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfREFDRXhfRXJyb3JDYWxsYmFja0NoMiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSB1bmRlcnJ1biBEQUMgY2FsbGJhY2sgZm9yIENoYW5uZWwyLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9EQUNFeF9ETUFVbmRlcnJ1bkNhbGxiYWNrQ2gyKERBQ19IYW5kbGVUeXBlRGVmICpoZGFjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZGFjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0RBQ0V4X0RNQVVuZGVycnVuQ2FsbGJhY2tDaDIgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSdW4gdGhlIHNlbGYgY2FsaWJyYXRpb24gb2Ygb25lIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIHNDb25maWcgREFDIGNoYW5uZWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuCisgICogQHBhcmFtICBDaGFubmVsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8xOiBEQUMgQ2hhbm5lbDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMjogREFDIENoYW5uZWwyIHNlbGVjdGVkCisgICogQHJldHZhbCBVcGRhdGVzIERBQ19UcmltbWluZ1ZhbHVlLiAsIERBQ19Vc2VyVHJpbW1pbmcgc2V0IHRvIERBQ19Vc2VyVHJpbW1pbmcKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAbm90ZSAgIENhbGlicmF0aW9uIHJ1bnMgYWJvdXQgNyBtcy4KKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RBQ0V4X1NlbGZDYWxpYnJhdGUoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIERBQ19DaGFubmVsQ29uZlR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBfX0lPIHVpbnQzMl90IHRtcDsKKyAgdWludDMyX3QgdHJpbW1pbmd2YWx1ZTsKKyAgdWludDMyX3QgZGVsdGE7CisKKyAgLyogc3RvcmUvcmVzdG9yZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHB1cnBvc2UgKi8KKyAgdWludDMyX3Qgb2xkbW9kZWNvbmZpZ3VyYXRpb247CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19DSEFOTkVMKENoYW5uZWwpKTsKKworICAvKiBDaGVjayB0aGUgREFDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIC8qIENoZWNrIGlmIERBQyBydW5uaW5nICovCisgIGlmIChoZGFjID09IE5VTEwpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZSBpZiAoaGRhYy0+U3RhdGUgPT0gSEFMX0RBQ19TVEFURV9CVVNZKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZGFjKTsKKworICAgIC8qIFN0b3JlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBvbGRtb2RlY29uZmlndXJhdGlvbiA9IChoZGFjLT5JbnN0YW5jZS0+TUNSICYgKERBQ19NQ1JfTU9ERTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCAqLworICAgIENMRUFSX0JJVCgoaGRhYy0+SW5zdGFuY2UtPkNSKSwgKERBQ19DUl9FTjEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisKKyAgICAvKiBTZXQgbW9kZSBpbiBNQ1IgIGZvciBjYWxpYnJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoaGRhYy0+SW5zdGFuY2UtPk1DUiwgKERBQ19NQ1JfTU9ERTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgMFUpOworCisgICAgLyogU2V0IERBQyBDaGFubmVsMSBESFIgcmVnaXN0ZXIgdG8gdGhlIG1pZGRsZSB2YWx1ZSAqLworICAgIHRtcCA9ICh1aW50MzJfdCloZGFjLT5JbnN0YW5jZTsKKworICAgIGlmIChDaGFubmVsID09IERBQ19DSEFOTkVMXzEpCisgICAgeworICAgICAgdG1wICs9IERBQ19ESFIxMlIxX0FMSUdOTUVOVChEQUNfQUxJR05fMTJCX1IpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wICs9IERBQ19ESFIxMlIyX0FMSUdOTUVOVChEQUNfQUxJR05fMTJCX1IpOworICAgIH0KKworICAgICooX19JTyB1aW50MzJfdCAqKSB0bXAgPSAweDA4MDBVOworCisgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBjYWxpYnJhdGlvbiAqLworICAgIC8qIGkuZS4gc2V0IERBQ19DUl9DRU54IGJpdCAqLworICAgIFNFVF9CSVQoKGhkYWMtPkluc3RhbmNlLT5DUiksIChEQUNfQ1JfQ0VOMSA8PCAoQ2hhbm5lbCAmIDB4MTBVTCkpKTsKKworICAgIC8qIEluaXQgdHJpbW1pbmcgY291bnRlciAqLworICAgIC8qIE1lZGl1bSB2YWx1ZSAqLworICAgIHRyaW1taW5ndmFsdWUgPSAxNlU7CisgICAgZGVsdGEgPSA4VTsKKyAgICB3aGlsZSAoZGVsdGEgIT0gMFUpCisgICAgeworICAgICAgLyogU2V0IGNhbmRpZGF0ZSB0cmltbWluZyAqLworICAgICAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q0NSLCAoREFDX0NDUl9PVFJJTTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgKHRyaW1taW5ndmFsdWUgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisKKyAgICAgIC8qIHRPRkZUUklNbWF4IGRlbGF5IHggbXMgYXMgcGVyIGRhdGFzaGVldCAoZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICAgIC8qIGkuZS4gbWluaW11bSB0aW1lIG5lZWRlZCBiZXR3ZWVuIHR3byBjYWxpYnJhdGlvbiBzdGVwcyAqLworICAgICAgSEFMX0RlbGF5KDEpOworCisgICAgICBpZiAoKGhkYWMtPkluc3RhbmNlLT5TUiAmIChEQUNfU1JfQ0FMX0ZMQUcxIDw8IChDaGFubmVsICYgMHgxMFVMKSkpID09IChEQUNfU1JfQ0FMX0ZMQUcxIDw8IChDaGFubmVsICYgMHgxMFVMKSkpCisgICAgICB7CisgICAgICAgIC8qIERBQ19TUl9DQUxfRkxBR3ggaXMgSElHSCB0cnkgaGlnaGVyIHRyaW1taW5nICovCisgICAgICAgIHRyaW1taW5ndmFsdWUgLT0gZGVsdGE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERBQ19TUl9DQUxfRkxBR3ggaXMgTE9XIHRyeSBsb3dlciB0cmltbWluZyAqLworICAgICAgICB0cmltbWluZ3ZhbHVlICs9IGRlbHRhOworICAgICAgfQorICAgICAgZGVsdGEgPj49IDFVOworICAgIH0KKworICAgIC8qIFN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgcmlnaHQgY2FsaWJyYXRpb24gaXMgY3VycmVudCB2YWx1ZSBvciBvbmUgc3RlcCBiZWxvdyAqLworICAgIC8qIEluZGVlZCB0aGUgZmlyc3QgdmFsdWUgdGhhdCBjYXVzZXMgdGhlIERBQ19TUl9DQUxfRkxBR3ggYml0IHRvIGNoYW5nZSBmcm9tIDAgdG8gMSAgKi8KKyAgICAvKiBTZXQgY2FuZGlkYXRlIHRyaW1taW5nICovCisgICAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q0NSLCAoREFDX0NDUl9PVFJJTTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgKHRyaW1taW5ndmFsdWUgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisKKyAgICAvKiB0T0ZGVFJJTW1heCBkZWxheSB4IG1zIGFzIHBlciBkYXRhc2hlZXQgKGVsZWN0cmljYWwgY2hhcmFjdGVyaXN0aWNzICovCisgICAgLyogaS5lLiBtaW5pbXVtIHRpbWUgbmVlZGVkIGJldHdlZW4gdHdvIGNhbGlicmF0aW9uIHN0ZXBzICovCisgICAgSEFMX0RlbGF5KDFVKTsKKworICAgIGlmICgoaGRhYy0+SW5zdGFuY2UtPlNSICYgKERBQ19TUl9DQUxfRkxBRzEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIE9QQU1QX0NTUl9PVVRDQUwgaXMgYWN0dWFsbHkgb25lIHZhbHVlIG1vcmUgKi8KKyAgICAgIHRyaW1taW5ndmFsdWUrKzsKKyAgICAgIC8qIFNldCByaWdodCB0cmltbWluZyAqLworICAgICAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q0NSLCAoREFDX0NDUl9PVFJJTTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgKHRyaW1taW5ndmFsdWUgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwgY2FsaWJyYXRpb24gKi8KKyAgICAvKiBpLmUuIGNsZWFyIERBQ19DUl9DRU54IGJpdCAqLworICAgIENMRUFSX0JJVCgoaGRhYy0+SW5zdGFuY2UtPkNSKSwgKERBQ19DUl9DRU4xIDw8IChDaGFubmVsICYgMHgxMFVMKSkpOworCisgICAgc0NvbmZpZy0+REFDX1RyaW1taW5nVmFsdWUgPSB0cmltbWluZ3ZhbHVlOworICAgIHNDb25maWctPkRBQ19Vc2VyVHJpbW1pbmcgPSBEQUNfVFJJTU1JTkdfVVNFUjsKKworICAgIC8qIFJlc3RvcmUgY29uZmlndXJhdGlvbiAqLworICAgIE1PRElGWV9SRUcoaGRhYy0+SW5zdGFuY2UtPk1DUiwgKERBQ19NQ1JfTU9ERTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgb2xkbW9kZWNvbmZpZ3VyYXRpb24pOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZGFjKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmltbWluZyBtb2RlIGFuZCB0cmltbWluZyB2YWx1ZSAodXNlciB0cmltbWluZyBtb2RlIGFwcGxpZWQpLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcGFyYW0gIHNDb25maWcgREFDIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHVwZGF0ZWQgd2l0aCBuZXcgREFDIHRyaW1taW5nIHZhbHVlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGUgc2VsZWN0ZWQgREFDIGNoYW5uZWwuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgREFDX0NIQU5ORUxfMTogREFDIENoYW5uZWwxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzI6IERBQyBDaGFubmVsMiBzZWxlY3RlZAorICAqIEBwYXJhbSAgTmV3VHJpbW1pbmdWYWx1ZSBEQUMgbmV3IHRyaW1taW5nIHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQUNFeF9TZXRVc2VyVHJpbW1pbmcoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMsIERBQ19DaGFubmVsQ29uZlR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5ld1RyaW1taW5nVmFsdWUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfREFDX05FV1RSSU1NSU5HVkFMVUUoTmV3VHJpbW1pbmdWYWx1ZSkpOworCisgIC8qIENoZWNrIHRoZSBEQUMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhkYWMgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGRhYyk7CisKKyAgICAvKiBTZXQgbmV3IHRyaW1taW5nICovCisgICAgTU9ESUZZX1JFRyhoZGFjLT5JbnN0YW5jZS0+Q0NSLCAoREFDX0NDUl9PVFJJTTEgPDwgKENoYW5uZWwgJiAweDEwVUwpKSwgKE5ld1RyaW1taW5nVmFsdWUgPDwgKENoYW5uZWwgJiAweDEwVUwpKSk7CisKKyAgICAvKiBVcGRhdGUgdHJpbW1pbmcgbW9kZSAqLworICAgIHNDb25maWctPkRBQ19Vc2VyVHJpbW1pbmcgPSBEQUNfVFJJTU1JTkdfVVNFUjsKKyAgICBzQ29uZmlnLT5EQUNfVHJpbW1pbmdWYWx1ZSA9IE5ld1RyaW1taW5nVmFsdWU7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkYWMpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBEQUMgdHJpbW1pbmcgdmFsdWUuCisgICogQHBhcmFtICBoZGFjIERBQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIERBQ19DSEFOTkVMXzE6IERBQyBDaGFubmVsMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBEQUNfQ0hBTk5FTF8yOiBEQUMgQ2hhbm5lbDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIFRyaW1taW5nIHZhbHVlIDogcmFuZ2U6IDAtPjMxCisgICoKKyAqLworCit1aW50MzJfdCBIQUxfREFDRXhfR2V0VHJpbU9mZnNldChEQUNfSGFuZGxlVHlwZURlZiAqaGRhYywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfREFDX0NIQU5ORUwoQ2hhbm5lbCkpOworCisgIC8qIFJldHJpZXZlIHRyaW1taW5nICAqLworICByZXR1cm4gKChoZGFjLT5JbnN0YW5jZS0+Q0NSICYgKERBQ19DQ1JfT1RSSU0xIDw8IChDaGFubmVsICYgMHgxMFVMKSkpID4+IChDaGFubmVsICYgMHgxMFVMKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREFDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU2V0IHRoZSBzcGVjaWZpZWQgZGF0YSBob2xkaW5nIHJlZ2lzdGVyIHZhbHVlIGZvciBEQUMgY2hhbm5lbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGxhc3QgZGF0YSBvdXRwdXQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIERBQyBjaGFubmVsLgorICAqIEBwYXJhbSAgaGRhYyBwb2ludGVyIHRvIGEgREFDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERBQy4KKyAgKiBAcmV0dmFsIFRoZSBzZWxlY3RlZCBEQUMgY2hhbm5lbCBkYXRhIG91dHB1dCB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9EQUNFeF9EdWFsR2V0VmFsdWUoREFDX0hhbmRsZVR5cGVEZWYgKmhkYWMpCit7CisgIHVpbnQzMl90IHRtcCA9IDBVOworCisgIHRtcCB8PSBoZGFjLT5JbnN0YW5jZS0+RE9SMTsKKworICB0bXAgfD0gaGRhYy0+SW5zdGFuY2UtPkRPUjIgPDwgMTZVOworCisgIC8qIFJldHVybnMgdGhlIERBQyBjaGFubmVsIGRhdGEgb3V0cHV0IHJlZ2lzdGVyIHZhbHVlICovCisgIHJldHVybiB0bXA7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERBQ0V4X1ByaXZhdGVfRnVuY3Rpb25zIERBQ0V4IHByaXZhdGUgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBFeHRlbmRlZCBwcml2YXRlIGZ1bmN0aW9ucworICAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERNQSBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBEQUNfRE1BQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmICpoZGFjID0gKERBQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkNvbnZDcGx0Q2FsbGJhY2tDaDIoaGRhYyk7CisjZWxzZQorICBIQUxfREFDRXhfQ29udkNwbHRDYWxsYmFja0NoMihoZGFjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0RBQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBoZGFjLT5TdGF0ZSA9IEhBTF9EQUNfU1RBVEVfUkVBRFk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIERBQ19ETUFIYWxmQ29udkNwbHRDaDIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIERBQ19IYW5kbGVUeXBlRGVmICpoZGFjID0gKERBQ19IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhkYWMtPkNvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKGhkYWMpOworI2Vsc2UKKyAgSEFMX0RBQ0V4X0NvbnZIYWxmQ3BsdENhbGxiYWNrQ2gyKGhkYWMpOworI2VuZGlmIC8qIFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgREFDX0RNQUVycm9yQ2gyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBEQUNfSGFuZGxlVHlwZURlZiAqaGRhYyA9IChEQUNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIFNldCBEQUMgZXJyb3IgY29kZSB0byBETUEgZXJyb3IgKi8KKyAgaGRhYy0+RXJyb3JDb2RlIHw9IEhBTF9EQUNfRVJST1JfRE1BOworCisjaWYgKFVTRV9IQUxfREFDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoZGFjLT5FcnJvckNhbGxiYWNrQ2gyKGhkYWMpOworI2Vsc2UKKyAgSEFMX0RBQ0V4X0Vycm9yQ2FsbGJhY2tDaDIoaGRhYyk7CisjZW5kaWYgLyogVVNFX0hBTF9EQUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGRhYy0+U3RhdGUgPSBIQUxfREFDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogREFDMSAqLworCisjZW5kaWYgLyogSEFMX0RBQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfZG1hLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgyOGYwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfZG1hLmMKQEAgLTAsMCArMSwxMDcyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9kbWEuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEaXJlY3QgTWVtb3J5IEFjY2VzcyAoRE1BKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgZXJyb3JzIGZ1bmN0aW9ucworICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAoIykgRW5hYmxlIGFuZCBjb25maWd1cmUgdGhlIHBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBETUEgQ2hhbm5lbAorICAgICAgIChleGNlcHQgZm9yIGludGVybmFsIFNSQU0gLyBGTEFTSCBtZW1vcmllczogbm8gaW5pdGlhbGl6YXRpb24gaXMKKyAgICAgICBuZWNlc3NhcnkpLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFJlZmVyZW5jZSBtYW51YWwgZm9yIGNvbm5lY3Rpb24gYmV0d2VlbiBwZXJpcGhlcmFscworICAgICAgIGFuZCBETUEgcmVxdWVzdHMuCisKKyAgICgjKSBGb3IgYSBnaXZlbiBDaGFubmVsLCBwcm9ncmFtIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgIENoYW5uZWwgcmVxdWVzdCwgVHJhbnNmZXIgRGlyZWN0aW9uLCBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIGRhdGEgZm9ybWF0cywKKyAgICAgICBDaXJjdWxhciBvciBOb3JtYWwgbW9kZSwgQ2hhbm5lbCBQcmlvcml0eSBsZXZlbCwgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBJbmNyZW1lbnQgbW9kZQorICAgICAgIHVzaW5nIEhBTF9ETUFfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgICAgUHJpb3IgdG8gSEFMX0RNQV9Jbml0IHRoZSBDTEsgc2hhbGwgYmUgZW5hYmxlZCBmb3IgYm90aCBETUEgJiBETUFNVVgKKyAgICAgICB0aGFua3MgdG86CisgICAgICAgRE1BMSAgIDogICAgICAgX19IQUxfUkNDX0RNQTFfQ0xLX0VOQUJMRSgpOworCisgICAoIykgVXNlIEhBTF9ETUFfR2V0U3RhdGUoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIERNQSBzdGF0ZSBhbmQgSEFMX0RNQV9HZXRFcnJvcigpIGluIGNhc2Ugb2YgZXJyb3IKKyAgICAgICBkZXRlY3Rpb24uCisKKyAgICgjKSBVc2UgSEFMX0RNQV9BYm9ydCgpIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyCisKKyAgICAgLUAtICAgSW4gTWVtb3J5LXRvLU1lbW9yeSB0cmFuc2ZlciBtb2RlLCBDaXJjdWxhciBtb2RlIGlzIG5vdCBhbGxvd2VkLgorICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgICgrKSBVc2UgSEFMX0RNQV9TdGFydCgpIHRvIHN0YXJ0IERNQSB0cmFuc2ZlciBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBvZiBTb3VyY2UKKyAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIExlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCisgICAgICAgICAgKCspIFVzZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgY3VycmVudCB0cmFuc2ZlciwgaW4gdGhpcworICAgICAgICAgICAgICBjYXNlIGEgZml4ZWQgVGltZW91dCBjYW4gYmUgY29uZmlndXJlZCBieSBVc2VyIGRlcGVuZGluZyBmcm9tIGhpcyBhcHBsaWNhdGlvbi4KKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKyAgICAgICAgICAoKykgRW5hYmxlIHRoZSBETUEgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnRfSVQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgICAgICAgICAgU291cmNlIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZC4KKyAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBETUEgaW50ZXJydXB0IGlzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfSVJRSGFuZGxlcigpIGNhbGxlZCB1bmRlciBETUFfSVJRSGFuZGxlcigpIEludGVycnVwdCBzdWJyb3V0aW5lCisgICAgICAgICAgKCspIEF0IHRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfRE1BX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgICAgYWRkIGhpcyBvd24gZnVuY3Rpb24gYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIFhmZXJDcGx0Q2FsbGJhY2sgYW5kCisgICAgICAgICAgICAgIFhmZXJFcnJvckNhbGxiYWNrIChpLmUuIGEgbWVtYmVyIG9mIERNQSBoYW5kbGUgc3RydWN0dXJlKS4KKworICAgICAqKiogRE1BIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gRE1BIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfRE1BX0VOQUJMRTogRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9HRVRfRkxBRzogR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAgICAgICgrKSBfX0hBTF9ETUFfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICAgICAgKCspIF9fSEFMX0RNQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgICAgICAoKykgX19IQUxfRE1BX0dFVF9JVF9TT1VSQ0U6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKworICAgICBbLi5dCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgRE1BIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BIERNQQorICAqIEBicmllZiBETUEgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9GdW5jdGlvbnMgRE1BIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIERNQV9TZXRDb25maWcoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpOworc3RhdGljIHZvaWQgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgRE1BX0NhbGNETUFNVVhSZXF1ZXN0R2VuQmFzZUFuZE1hc2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zIERNQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlIERNQSBDaGFubmVsIHNvdXJjZQorICAgIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIGluY3JlbWVudGF0aW9uIGFuZCBkYXRhIHNpemVzLCB0cmFuc2ZlciBkaXJlY3Rpb24sCisgICAgY2lyY3VsYXIvbm9ybWFsIG1vZGUgc2VsZWN0aW9uLCBtZW1vcnktdG8tbWVtb3J5IG1vZGUgc2VsZWN0aW9uIGFuZCBDaGFubmVsIHByaW9yaXR5IHZhbHVlLgorICAgIFsuLl0KKyAgICBUaGUgSEFMX0RNQV9Jbml0KCkgZnVuY3Rpb24gZm9sbG93cyB0aGUgRE1BIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcyBhcyBkZXNjcmliZWQgaW4KKyAgICByZWZlcmVuY2UgbWFudWFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERNQSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRE1BX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0luaXQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhkbWEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0RJUkVDVElPTihoZG1hLT5Jbml0LkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKGhkbWEtPkluaXQuUGVyaXBoSW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0lOQ19TVEFURShoZG1hLT5Jbml0Lk1lbUluYykpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoaGRtYS0+SW5pdC5NZW1EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTU9ERShoZG1hLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9QUklPUklUWShoZG1hLT5Jbml0LlByaW9yaXR5KSk7CisKKyAgLyogY2FsY3VsYXRpb24gb2YgdGhlIGNoYW5uZWwgaW5kZXggKi8KKyAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDJVOworCisgIC8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBQTCwgTVNJWkUsIFBTSVpFLCBNSU5DLCBQSU5DLCBDSVJDLCBESVIgYW5kIE1FTTJNRU0gYml0cyAqLworICBDTEVBUl9CSVQoaGRtYS0+SW5zdGFuY2UtPkNDUiwgKERNQV9DQ1JfUEwgICAgfCBETUFfQ0NSX01TSVpFICB8IERNQV9DQ1JfUFNJWkUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgfCBETUFfQ0NSX1BJTkMgICB8IERNQV9DQ1JfQ0lSQyAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfRElSICAgfCBETUFfQ0NSX01FTTJNRU0pKTsKKworICAvKiBTZXQgdGhlIERNQSBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgU0VUX0JJVChoZG1hLT5JbnN0YW5jZS0+Q0NSLCAoaGRtYS0+SW5pdC5EaXJlY3Rpb24gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZG1hLT5Jbml0LlBlcmlwaEluYyAgICAgICAgICAgfCBoZG1hLT5Jbml0Lk1lbUluYyAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCB8IGhkbWEtPkluaXQuTWVtRGF0YUFsaWdubWVudCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRtYS0+SW5pdC5Nb2RlICAgICAgICAgICAgICAgIHwgaGRtYS0+SW5pdC5Qcmlvcml0eSkpOworCisgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyBmb3IgRE1BTVVYIGNoYW5uZWwgOgorICAgICBETUFtdXhDaGFubmVsLCBETUFtdXhDaGFubmVsU3RhdHVzIGFuZCBETUFtdXhDaGFubmVsU3RhdHVzTWFzaworICAqLworICBETUFfQ2FsY0RNQU1VWENoYW5uZWxCYXNlQW5kTWFzayhoZG1hKTsKKworICBpZiAoaGRtYS0+SW5pdC5EaXJlY3Rpb24gPT0gRE1BX01FTU9SWV9UT19NRU1PUlkpCisgIHsKKyAgICAvKiBpZiBtZW1vcnkgdG8gbWVtb3J5IGZvcmNlIHRoZSByZXF1ZXN0IHRvIDAqLworICAgIGhkbWEtPkluaXQuUmVxdWVzdCA9IERNQV9SRVFVRVNUX01FTTJNRU07CisgIH0KKworICAvKiBTZXQgcGVyaXBoZXJhbCByZXF1ZXN0ICB0byBETUFNVVggY2hhbm5lbCAqLworICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgPSAoaGRtYS0+SW5pdC5SZXF1ZXN0ICYgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKTsKKworICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovCisgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgIGlmICgoKGhkbWEtPkluaXQuUmVxdWVzdCA+ICAwVUwpICYmIChoZG1hLT5Jbml0LlJlcXVlc3QgPD0gRE1BX1JFUVVFU1RfR0VORVJBVE9SMykpKQorICB7CisgICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgOgorICAgICAgIERNQW11eFJlcXVlc3RHZW4sIERNQW11eFJlcXVlc3RHZW5TdGF0dXMgYW5kIERNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrCisgICAgKi8KKyAgICBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhoZG1hKTsKKworICAgIC8qIFJlc2V0IHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgcmVnaXN0ZXIqLworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPSAwVTsKKworICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuID0gMFU7CisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IDBVOworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMFU7CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBlcnJvciBjb2RlICovCisgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAvKiBJbml0aWFsaXplIHRoZSBETUEgc3RhdGUqLworICBoZG1hLT5TdGF0ZSAgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIERNQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaGRtYSAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgRE1BIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChOVUxMID09IGhkbWEpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUEgQ2hhbm5lbHggKi8KKyAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgLyogY2FsY3VsYXRpb24gb2YgdGhlIGNoYW5uZWwgaW5kZXggKi8KKyAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDJVOworCisgIC8qIFJlc2V0IERNQSBDaGFubmVsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgaGRtYS0+SW5zdGFuY2UtPkNDUiAgPSAwVTsKKworICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgX19IQUxfRE1BX0NMRUFSX0ZMQUcoaGRtYSwgKERNQV9GTEFHX0dJMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSk7CisKKyAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggY2hhbm5lbCA6CisgICAgIERNQW11eENoYW5uZWwsIERNQW11eENoYW5uZWxTdGF0dXMgYW5kIERNQW11eENoYW5uZWxTdGF0dXNNYXNrICovCisKKyAgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soaGRtYSk7CisKKyAgLyogUmVzZXQgdGhlIERNQU1VWCBjaGFubmVsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERNQSBjaGFubmVsICovCisgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiA9IDBVOworCisgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgLyogUmVzZXQgUmVxdWVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpZiBhbnkgKi8KKyAgaWYgKCgoaGRtYS0+SW5pdC5SZXF1ZXN0ID4gIDBVTCkgJiYgKGhkbWEtPkluaXQuUmVxdWVzdCA8PSBETUFfUkVRVUVTVF9HRU5FUkFUT1IzKSkpCisgIHsKKyAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgZm9yIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciA6CisgICAgICAgRE1BbXV4UmVxdWVzdEdlbiwgRE1BbXV4UmVxdWVzdEdlblN0YXR1cyBhbmQgRE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2sKKyAgICAqLworICAgIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKGhkbWEpOworCisgICAgLyogUmVzZXQgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciByZWdpc3RlciovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiA9IDBVOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICB9CisKKyAgLyogQ2xlYW4gY2FsbGJhY2tzICovCisgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBOVUxMOworICBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gTlVMTDsKKyAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAwVTsKKyAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IDBVOworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzayA9IDBVOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIERNQSBzdGF0ZSAqLworICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kIFN0YXJ0IERNQSB0cmFuc2ZlcgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBkYXRhIGxlbmd0aCBhbmQKKyAgICAgICAgICBTdGFydCBETUEgdHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQKKyAgICAgICgrKSBBYm9ydCBETUEgdHJhbnNmZXIKKyAgICAgICgrKSBQb2xsIGZvciB0cmFuc2ZlciBjb21wbGV0ZQorICAgICAgKCspIEhhbmRsZSBETUEgaW50ZXJydXB0IHJlcXVlc3QKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShEYXRhTGVuZ3RoKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIC8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggJiBjbGVhciBmbGFncyovCisgICAgRE1BX1NldENvbmZpZyhoZG1hLCBTcmNBZGRyZXNzLCBEc3RBZGRyZXNzLCBEYXRhTGVuZ3RoKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RNQV9FTkFCTEUoaGRtYSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEgVHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSBTcmNBZGRyZXNzIFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtIERzdEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQlVGRkVSX1NJWkUoRGF0YUxlbmd0aCkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRtYSk7CisKKyAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfQlVTWTsKKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIGRhdGEgbGVuZ3RoICYgY2xlYXIgZmxhZ3MqLworICAgIERNQV9TZXRDb25maWcoaGRtYSwgU3JjQWRkcmVzcywgRHN0QWRkcmVzcywgRGF0YUxlbmd0aCk7CisKKyAgICAvKiBFbmFibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCAqLworICAgIC8qIEVuYWJsZSB0aGUgdHJhbnNmZXIgRXJyb3IgaW50ZXJydXB0ICovCisgICAgaWYgKE5VTEwgIT0gaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2spCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBhcyB3ZWxsICovCisgICAgICBfX0hBTF9ETUFfRU5BQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIERNQV9JVF9IVCk7CisgICAgICBfX0hBTF9ETUFfRU5BQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfVEUpKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBETUFNVVggU3luY2hyb25pemF0aW9uIGlzIGVuYWJsZWQqLworICAgIGlmICgoaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSICYgRE1BTVVYX0N4Q1JfU0UpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBETUFNVVggc3luYyBvdmVycnVuIElUKi8KKyAgICAgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiB8PSBETUFNVVhfQ3hDUl9TT0lFOworICAgIH0KKworICAgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKQorICAgIHsKKyAgICAgIC8qIGlmIHVzaW5nIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciwgZW5hYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBJVCovCisgICAgICAvKiBlbmFibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiB8PSBETUFNVVhfUkd4Q1JfT0lFOworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RNQV9FTkFCTEUoaGRtYSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgIC8qIFJlbWFpbiBCVVNZICovCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogQ2hlY2sgdGhlIERNQSBwZXJpcGhlcmFsIGhhbmRsZSAqLworICBpZiAoTlVMTCA9PSBoZG1hKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBpZihoZG1hLT5TdGF0ZSAhPSBIQUxfRE1BX1NUQVRFX0JVU1kpCisgIHsKKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PX1hGRVI7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBJVCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKworICAgIC8qIGRpc2FibGUgdGhlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiAmPSB+RE1BTVVYX0N4Q1JfU09JRTsKKworICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIF9fSEFMX0RNQV9DTEVBUl9GTEFHKGhkbWEsICgoRE1BX0ZMQUdfR0kxKSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICAmIDB4MWNVKSkpOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgICAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpCisgICAgeworICAgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yLCBkaXNhYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBJVCovCisgICAgICAvKiBkaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgJj0gfkRNQU1VWF9SR3hDUl9PSUU7CisKKyAgICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICAgIH0KKworICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnRzIHRoZSBETUEgVHJhbnNmZXIgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoZG1hICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgU3RyZWFtLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQvbG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9CVVNZICE9IGhkbWEtPlN0YXRlKQorICB7CisgICAgLyogbm8gdHJhbnNmZXIgb25nb2luZyAqLworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9fWEZFUjsKKworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBJVCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNoYW5uZWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIGRpc2FibGUgdGhlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiAmPSB+RE1BTVVYX0N4Q1JfU09JRTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIF9fSEFMX0RNQV9DTEVBUl9GTEFHKGhkbWEsICgoRE1BX0ZMQUdfR0kxKSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSk7CisKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkKKyAgICB7CisgICAgICAvKiBpZiB1c2luZyBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IsIGRpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIElUKi8KKyAgICAgIC8qIGRpc2FibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiAmPSB+RE1BTVVYX1JHeENSX09JRTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogQ2FsbCBVc2VyIEFib3J0IGNhbGxiYWNrICovCisgICAgaWYgKGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUG9sbGluZyBmb3IgdHJhbnNmZXIgY29tcGxldGUuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gQ29tcGxldGVMZXZlbCBTcGVjaWZpZXMgdGhlIERNQSBsZXZlbCBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Qb2xsRm9yVHJhbnNmZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTGV2ZWxDb21wbGV0ZVR5cGVEZWYgQ29tcGxldGVMZXZlbCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGVtcDsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIGlmIChIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUG9sbGluZyBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gY2lyY3VsYXIgbW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IDBVKQorICB7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBHZXQgdGhlIGxldmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKQorICB7CisgICAgLyogVHJhbnNmZXIgQ29tcGxldGUgZmxhZyAqLworICAgIHRlbXAgPSBETUFfRkxBR19UQzEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBIYWxmIFRyYW5zZmVyIENvbXBsZXRlIGZsYWcgKi8KKyAgICB0ZW1wID0gRE1BX0ZMQUdfSFQxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggICYgMHgxY1UpOworICB9CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZSAoMFUgPT0gX19IQUxfRE1BX0dFVF9GTEFHKGhkbWEsIHRlbXApKQorICB7CisgICAgaWYgKDBVICE9IF9fSEFMX0RNQV9HRVRfRkxBRyhoZG1hLCAoRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSkKKyAgICB7CisgICAgICAvKiBXaGVuIGEgRE1BIHRyYW5zZmVyIGVycm9yIG9jY3VycyAqLworICAgICAgLyogQSBoYXJkd2FyZSBjbGVhciBvZiBpdHMgRU4gYml0cyBpcyBwZXJmb3JtZWQgKi8KKyAgICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgICAgX19IQUxfRE1BX0NMRUFSX0ZMQUcoaGRtYSwgKChETUFfRkxBR19HSTEpIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKTsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVEU7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKkNoZWNrIGZvciBETUFNVVggUmVxdWVzdCBnZW5lcmF0b3IgKGlmIHVzZWQpIG92ZXJydW4gc3RhdHVzICovCisgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKQorICB7CisgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIENoZWNrIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biAqLworICAgIGlmICgoaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdTUiAmIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIGludGVycnVwdCAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiB8PSBETUFNVVhfUkd4Q1JfT0lFOworCisgICAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gZmxhZyAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1JFUUdFTjsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBmb3IgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBvdmVycnVuICovCisgIGlmICgoaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q1NSICYgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2spICE9IDBVKQorICB7CisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgfD0gSEFMX0RNQV9FUlJPUl9TWU5DOworICB9CisKKyAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKQorICB7CisgICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBfX0hBTF9ETUFfQ0xFQVJfRkxBRyhoZG1hLCAoRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKTsKKworICAgIC8qIFRoZSBzZWxlY3RlZCBDaGFubmVseCBFTiBiaXQgaXMgY2xlYXJlZCAoRE1BIGlzIGRpc2FibGVkIGFuZAorICAgIGFsbCB0cmFuc2ZlcnMgYXJlIGNvbXBsZXRlKSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgX19IQUxfRE1BX0NMRUFSX0ZMQUcoaGRtYSwgKERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSk7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBETUEgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoZG1hOiBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIHVpbnQzMl90IGZsYWdfaXQgPSBETUExLT5JU1I7CisgIHVpbnQzMl90IHNvdXJjZV9pdCA9IGhkbWEtPkluc3RhbmNlLT5DQ1I7CisKKyAgLyogSGFsZiBUcmFuc2ZlciBDb21wbGV0ZSBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmICgoKGZsYWdfaXQgJiAoRE1BX0ZMQUdfSFQxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSAhPSAwVSkgJiYgKChzb3VyY2VfaXQgJiBETUFfSVRfSFQpICE9IDBVKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0IGlmIHRoZSBETUEgbW9kZSBpcyBub3QgQ0lSQ1VMQVIgKi8KKyAgICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCBETUFfSVRfSFQpOworICAgIH0KKyAgICAvKiBDbGVhciB0aGUgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisgICAgX19IQUxfRE1BX0NMRUFSX0ZMQUcoaGRtYSwgKERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSk7CisKKyAgICAvKiBETUEgcGVyaXBoZXJhbCBzdGF0ZSBpcyBub3QgdXBkYXRlZCBpbiBIYWxmIFRyYW5zZmVyICovCisgICAgLyogYnV0IGluIFRyYW5zZmVyIENvbXBsZXRlIGNhc2UgKi8KKworICAgIGlmIChoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEhhbGYgdHJhbnNmZXIgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorCisgIC8qIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoMFUgIT0gKGZsYWdfaXQgJiAoRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSkgJiYgKDBVICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEMpKSkKKyAgeworICAgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgdHJhbnNmZXIgY29tcGxldGUgYW5kIGVycm9yIGludGVycnVwdCAqLworICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX1RFIHwgRE1BX0lUX1RDKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBfX0hBTF9ETUFfQ0xFQVJfRkxBRyhoZG1hLCAoRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICBpZiAoaGRtYS0+WGZlckNwbHRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorCisgIC8qIFRyYW5zZmVyIEVycm9yIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoKGZsYWdfaXQgJiAoRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSE9IDBVKSAmJiAoKHNvdXJjZV9pdCAmIERNQV9JVF9URSkgIT0gMFUpKQorICB7CisgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAvKiBBIGhhcmR3YXJlIGNsZWFyIG9mIGl0cyBFTiBiaXRzIGlzIHBlcmZvcm1lZCAqLworICAgIC8qIERpc2FibGUgQUxMIERNQSBJVCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFX0lUKGhkbWEsIChETUFfSVRfVEMgfCBETUFfSVRfSFQgfCBETUFfSVRfVEUpKTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIF9fSEFMX0RNQV9DTEVBUl9GTEFHKGhkbWEsIChETUFfRkxBR19HSTEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCYgMHgxY1UpKSk7CisKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVEU7CisKKyAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUcmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgVG8gRG8gKi8KKyAgfQorICByZXR1cm47Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgY2FsbGJhY2tzCisgICogQHBhcmFtICBoZG1hICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIFN0cmVhbS4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgICAgICAgICAgICBVc2VyIENhbGxiYWNrIGlkZW50aWZlcgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBFTlVNIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIHBDYWxsYmFjayAgICAgICAgICAgICBwb2ludGVyIHRvIHByaXZhdGUgY2FsbGJhY3NrIGZ1bmN0aW9uIHdoaWNoIGhhcyBwb2ludGVyIHRvCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgYXMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9SZWdpc3RlckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHZvaWQgKCogcENhbGxiYWNrKShETUFfSGFuZGxlVHlwZURlZiAqX2hkbWEpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfRVJST1JfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaGRtYSAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHBhcmFtICBDYWxsYmFja0lEICAgICAgICAgICAgVXNlciBDYWxsYmFjayBpZGVudGlmZXIKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIEhBTF9ETUFfQ2FsbGJhY2tJRFR5cGVEZWYgRU5VTSBhcyBwYXJhbWV0ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1VuUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9FUlJPUl9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0FCT1JUX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICAgSEFMX0RNQV9YRkVSX0FMTF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBDaGVjayB0aGUgRE1BIHN0YXRlCisgICAgICAoKykgR2V0IGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBoYW5kZSBzdGF0ZS4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfRE1BX1N0YXRlVHlwZURlZiBIQUxfRE1BX0dldFN0YXRlKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBSZXR1cm4gRE1BIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGRtYS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBETUEgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEByZXR2YWwgRE1BIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9ETUFfR2V0RXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIHJldHVybiBoZG1hLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIERNQSBUcmFuc2ZlciBwYXJhbWV0ZXIuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSBEc3RBZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyB2b2lkIERNQV9TZXRDb25maWcoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpCit7CisgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisgIH0KKworICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgX19IQUxfRE1BX0NMRUFSX0ZMQUcoaGRtYSwgKERNQV9GTEFHX0dJMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSk7CisKKyAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRhdGEgbGVuZ3RoICovCisgIGhkbWEtPkluc3RhbmNlLT5DTkRUUiA9IERhdGFMZW5ndGg7CisKKyAgLyogUGVyaXBoZXJhbCB0byBNZW1vcnkgKi8KKyAgaWYgKChoZG1hLT5Jbml0LkRpcmVjdGlvbikgPT0gRE1BX01FTU9SWV9UT19QRVJJUEgpCisgIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gRHN0QWRkcmVzczsKKworICAgIC8qIENvbmZpZ3VyZSBETUEgQ2hhbm5lbCBzb3VyY2UgYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gU3JjQWRkcmVzczsKKyAgfQorICAvKiBNZW1vcnkgdG8gUGVyaXBoZXJhbCAqLworICBlbHNlCisgIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgc291cmNlIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q1BBUiA9IFNyY0FkZHJlc3M7CisKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gRHN0QWRkcmVzczsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFVwZGF0ZXMgdGhlIERNQSBoYW5kbGUgd2l0aCB0aGUgRE1BTVVYICBjaGFubmVsIGFuZCBzdGF0dXMgbWFzayBkZXBlbmRpbmcgb24gc3RyZWFtIG51bWJlcgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBETUFfQ2FsY0RNQU1VWENoYW5uZWxCYXNlQW5kTWFzayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgdWludDMyX3QgY2hhbm5lbF9udW1iZXI7CisKKyAgY2hhbm5lbF9udW1iZXIgPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAmIDB4RkZVKSAtIDhVKSAvIDIwVTsKKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbCA9IChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICopKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9DaGFubmVsMCArICgoaGRtYS0+Q2hhbm5lbEluZGV4ID4+IDJVKSAqICgodWludDMyX3QpRE1BTVVYMV9DaGFubmVsMSAtICh1aW50MzJfdClETUFNVVgxX0NoYW5uZWwwKSkpOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzID0gRE1BTVVYMV9DaGFubmVsU3RhdHVzOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzayA9IDFVTCA8PCAoY2hhbm5lbF9udW1iZXIgJiAweDFjVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVXBkYXRlcyB0aGUgRE1BIGhhbmRsZSB3aXRoIHRoZSBETUFNVVggIHJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtcworICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHJldHZhbCBOb25lCisgICovCisKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICB1aW50MzJfdCByZXF1ZXN0ID0gIGhkbWEtPkluaXQuUmVxdWVzdCAmIERNQU1VWF9DeENSX0RNQVJFUV9JRDsKKworICAvKiBETUEgQ2hhbm5lbHMgYXJlIGNvbm5lY3RlZCB0byBETUFNVVgxIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrcyovCisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCkgKyAoKHJlcXVlc3QgLSAxVSkgKiA0VSkpKTsKKworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzID0gRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzOworCisgIC8qIGhlcmUgIlJlcXVlc3QiIGlzIGVpdGhlciBETUFfUkVRVUVTVF9HRU5FUkFUT1IwIHRvIDQsIGkuZS4gPD0gNCovCisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMVVMIDw8ICgocmVxdWVzdCAtIDFVKSAmIDB4M1UpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0RNQV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2RtYV9leC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfZG1hX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4NGFmOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2RtYV9leC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9kbWFfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlcgorICAqICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBETUEgRXh0ZW5zaW9uIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICBUaGUgRE1BIEV4dGVuc2lvbiBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICgrKSBDb25maWd1cmUgdGhlIERNQV9NVVggU3luY2hyb25pemF0aW9uIEJsb2NrIHVzaW5nIEhBTF9ETUFFeF9Db25maWdNdXhTeW5jIGZ1bmN0aW9uLgorICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BX01VWCBSZXF1ZXN0IEdlbmVyYXRvciBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICBGdW5jdGlvbnMgSEFMX0RNQUV4X0VuYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IgYW5kIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvciBjYW4gdGhlbiBiZSB1c2VkCisgICAgICAgdG8gcmVzcGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHRoZSByZXF1ZXN0IGdlbmVyYXRvci4KKworICAgKCspIFRvIGhhbmRsZSB0aGUgRE1BTVVYIEludGVycnVwdHMsIHRoZSBmdW5jdGlvbiAgSEFMX0RNQUV4X01VWF9JUlFIYW5kbGVyIHNob3VsZCBiZSBjYWxsZWQgZnJvbQorICAgICAgIHRoZSBETUFNVVggSVJRIGhhbmRsZXIgaS5lIERNQU1VWDFfT1ZSX0lSUUhhbmRsZXIuCisgICAgICAgQXMgb25seSBvbmUgaW50ZXJydXB0IGxpbmUgaXMgYXZhaWxhYmxlIGZvciBhbGwgRE1BTVVYIGNoYW5uZWxzIGFuZCByZXF1ZXN0IGdlbmVyYXRvcnMgLCBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIgc2hvdWxkIGJlCisgICAgICAgY2FsbGVkIHdpdGgsIGFzIHBhcmFtZXRlciwgdGhlIGFwcHJvcHJpYXRlIERNQSBoYW5kbGUgYXMgbWFueSBhcyB1c2VkIERNQXMgaW4gdGhlIHVzZXIgcHJvamVjdAorICAgICAgKGV4Y2VwdGlvbiBkb25lIGlmIGEgZ2l2ZW4gRE1BIGlzIG5vdCB1c2luZyB0aGUgRE1BTVVYIFNZTkMgYmxvY2sgbmVpdGhlciBhIHJlcXVlc3QgZ2VuZXJhdG9yKQorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXggRE1BRXgKKyAgKiBAYnJpZWYgRE1BIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBETUFFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRE1BRXggRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisKKyAgICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFN5bmNocm9uaXphdGlvbiBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYyBmdW5jdGlvbi4KKyAgICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFJlcXVlc3QgR2VuZXJhdG9yIEJsb2NrIHVzaW5nIEhBTF9ETUFFeF9Db25maWdNdXhSZXF1ZXN0R2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgIEZ1bmN0aW9ucyBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvciBhbmQgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yIGNhbiB0aGVuIGJlIHVzZWQKKyAgICAgICB0byByZXNwZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIERNQSBjaGFubmVsIChpbnN0YW5jZSkuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisgICogQHBhcmFtICBwU3luY0NvbmZpZyBQb2ludGVyIHRvIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgOiBjb250YWlucyB0aGUgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9NdXhTeW5jQ29uZmlnVHlwZURlZiAqcFN5bmNDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX1NJR05BTF9JRChwU3luY0NvbmZpZy0+U3luY1NpZ25hbElEKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX1BPTEFSSVRZKHBTeW5jQ29uZmlnLT4gU3luY1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19TVEFURShwU3luY0NvbmZpZy0+U3luY0VuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1NZTkNfRVZFTlQocFN5bmNDb25maWctPkV2ZW50RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19SRVFVRVNUX05VTUJFUihwU3luY0NvbmZpZy0+UmVxdWVzdE51bWJlcikpOworCisgIC8qQ2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeSAqLworICBpZiAoaGRtYS0+U3RhdGUgPT0gSEFMX0RNQV9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZG1hKTsKKworICAgIC8qIFNldCB0aGUgbmV3IHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIChhbmQga2VlcCB0aGUgcmVxdWVzdCBJRCBmaWxsZWQgZHVyaW5nIHRoZSBJbml0KSovCisgICAgTU9ESUZZX1JFRyhoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IsIFwKKyAgICAgICAgICAgICAgICh+RE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSwgXAorICAgICAgICAgICAgICAgKChwU3luY0NvbmZpZy0+U3luY1NpZ25hbElEKSA8PCBETUFNVVhfQ3hDUl9TWU5DX0lEX1BvcykgfCAoKHBTeW5jQ29uZmlnLT5SZXF1ZXN0TnVtYmVyIC0gMVUpIDw8IERNQU1VWF9DeENSX05CUkVRX1BvcykgfCBcCisgICAgICAgICAgICAgICBwU3luY0NvbmZpZy0+U3luY1BvbGFyaXR5IHwgKCh1aW50MzJfdClwU3luY0NvbmZpZy0+U3luY0VuYWJsZSA8PCBETUFNVVhfQ3hDUl9TRV9Qb3MpIHwgXAorICAgICAgICAgICAgICAgKCh1aW50MzJfdClwU3luY0NvbmZpZy0+RXZlbnRFbmFibGUgPDwgRE1BTVVYX0N4Q1JfRUdFX1BvcykpOworCisgICAgLyogUHJvY2VzcyBVbkxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLypETUEgU3RhdGUgbm90IFJlYWR5Ki8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4KKyogQHBhcmFtICBwUmVxdWVzdEdlbmVyYXRvckNvbmZpZyBQb2ludGVyIHRvIEhBTF9ETUFfTXV4UmVxdWVzdEdlbmVyYXRvckNvbmZpZ1R5cGVEZWYgOgorICAqICAgICAgICAgY29udGFpbnMgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMuCisgICoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9Db25maWdNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX011eFJlcXVlc3RHZW5lcmF0b3JDb25maWdUeXBlRGVmICpwUmVxdWVzdEdlbmVyYXRvckNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1NJR05BTF9JRChwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+U2lnbmFsSUQpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1BPTEFSSVRZKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1JFUVVFU1RfTlVNQkVSKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5SZXF1ZXN0TnVtYmVyKSk7CisKKyAgLyogY2hlY2sgaWYgdGhlIERNQSBzdGF0ZSBpcyByZWFkeQorICAgICBhbmQgRE1BIGlzIHVzaW5nIGEgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrCisgICovCisgIGlmICgoaGRtYS0+U3RhdGUgPT0gSEFMX0RNQV9TVEFURV9SRUFEWSkgJiYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhkbWEpOworCisgICAgLyogU2V0IHRoZSByZXF1ZXN0IGdlbmVyYXRvciBuZXcgcGFyYW1ldGVycyovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiA9IHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5TaWduYWxJRCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwUmVxdWVzdEdlbmVyYXRvckNvbmZpZy0+UmVxdWVzdE51bWJlciAtIDFVKSA8PCBETUFNVVhfUkd4Q1JfR05CUkVRX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5Qb2xhcml0eTsKKyAgICAvKiBQcm9jZXNzIFVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9FbmFibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkKKyAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaworICAqLworICBpZiAoKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfUkVTRVQpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDApKQorICB7CisKKyAgICAvKiBFbmFibGUgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSIHw9IERNQU1VWF9SR3hDUl9HRTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayB1c2VkIGJ5IHRoZSBnaXZlbiBETUEgY2hhbm5lbCAoaW5zdGFuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkKKyAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaworICAqLworICBpZiAoKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfUkVTRVQpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDApKQorICB7CisKKyAgICAvKiBEaXNhYmxlIHRoZSByZXF1ZXN0IGdlbmVyYXRvciovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiAmPSB+RE1BTVVYX1JHeENSX0dFOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBETUFNVVggaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogQ2hlY2sgZm9yIERNQU1VWCBTeW5jaHJvbml6YXRpb24gb3ZlcnJ1biAqLworICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNTUiAmIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrKSAhPSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIHN5bmNocm8gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7CisKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1NZTkM7CisKKyAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUcmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisKKyAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMCkKKyAgeworICAgIC8qIGlmIHVzaW5nIGEgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrIENoZWNrIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biAqLworICAgIGlmICgoaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdTUiAmIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIGludGVycnVwdCAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiAmPSB+RE1BTVVYX1JHeENSX09JRTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisKKyAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICBoZG1hLT5FcnJvckNvZGUgfD0gSEFMX0RNQV9FUlJPUl9SRVFHRU47CisKKyAgICAgIGlmIChoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBUcmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9leHRpLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9leHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0ODM5ZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2V4dGkuYwpAQCAtMCwwICsxLDY4MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfZXh0aS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFWFRJIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEdlbmVyYWwgUHVycG9zZSBJbnB1dC9PdXRwdXQgKEVYVEkpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIEVYVEkgUGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFYWNoIEV4dGkgbGluZSBjYW4gYmUgY29uZmlndXJlZCB3aXRoaW4gdGhpcyBkcml2ZXIuCisKKyAgICAoKykgRXh0aSBsaW5lIGNhbiBiZSBjb25maWd1cmVkIGluIDMgZGlmZmVyZW50IG1vZGVzCisgICAgICAgICgrKykgSW50ZXJydXB0CisgICAgICAgICgrKykgRXZlbnQKKyAgICAgICAgKCsrKSBCb3RoIG9mIHRoZW0KKworICAgICgrKSBDb25maWd1cmFibGUgRXh0aSBsaW5lcyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIDMgZGlmZmVyZW50IHRyaWdnZXJzCisgICAgICAgICgrKykgUmlzaW5nCisgICAgICAgICgrKykgRmFsbGluZworICAgICAgICAoKyspIEJvdGggb2YgdGhlbQorCisgICAgKCspIFdoZW4gc2V0IGluIGludGVycnVwdCBtb2RlLCBjb25maWd1cmFibGUgRXh0aSBsaW5lcyBoYXZlIHR3byBkaWZmZW5yZW50cworICAgICAgICBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcnMgd2hpY2ggYWxsb3cgdG8gZGlzdGluZ3Vpc2ggd2hpY2ggdHJhbnNpdGlvbgorICAgICAgICBvY2N1cnM6CisgICAgICAgICgrKykgUmlzaW5nIGVkZ2UgcGVuZGluZyBpbnRlcnJ1cHQKKyAgICAgICAgKCsrKSBGYWxsaW5nCisKKyAgICAoKykgRXh0aSBsaW5lcyAwIHRvIDE1IGFyZSBsaW5rZWQgdG8gZ3BpbyBwaW4gbnVtYmVyIDAgdG8gMTUuIEdwaW8gcG9ydCBjYW4KKyAgICAgICAgYmUgc2VsZWN0ZWQgdGhyb3VnaHQgbXVsdGlwbGV4ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKworICAgICgjKSBDb25maWd1cmUgdGhlIEVYVEkgbGluZSB1c2luZyBIQUxfRVhUSV9TZXRDb25maWdMaW5lKCkuCisgICAgICAgICgrKykgQ2hvb3NlIHRoZSBpbnRlcnJ1cHQgbGluZSBudW1iZXIgYnkgc2V0dGluZyAiTGluZSIgbWVtYmVyIGZyb20KKyAgICAgICAgICAgICBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IGFuZC9vciBldmVudCBtb2RlIHVzaW5nICJNb2RlIiBtZW1iZXIgZnJvbQorICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIGNvbmZpZ3VyYWJsZSBsaW5lcywgY29uZmlndXJlIHJpc2luZyBhbmQvb3IgZmFsbGluZyB0cmlnZ2VyCisgICAgICAgICAgICAgIlRyaWdnZXIiIG1lbWJlciBmcm9tIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIEV4dGkgbGluZXMgbGlua2VkIHRvIGdwaW8sIGNob29zZSBncGlvIHBvcnQgdXNpbmcgIkdQSU9TZWwiCisgICAgICAgICAgICAgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAoIykgR2V0IGN1cnJlbnQgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcKKyAgICAgICAgSEFMX0VYVElfR2V0Q29uZmlnTGluZSgpLgorICAgICAgICAoKyspIFByb3ZpZGUgZXhpdGluZyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgICAgICAoKyspIFByb3ZpZGUgcG9pbnRlciBvbiBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIGFzIHNlY29uZCBwYXJhbWV0ZXIuCisKKyAgICAoIykgQ2xlYXIgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcgSEFMX0VYVElfR2V0Q29uZmlnTGluZSgpLgorICAgICAgICAoKyspIFByb3ZpZGUgZXhpdGluZyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorCisgICAgKCMpIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHRyZWF0IEV4dGkgaW50ZXJydXB0cyB1c2luZyBIQUxfRVhUSV9SZWdpc3RlckNhbGxiYWNrKCkuCisgICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgICAgICAgICgrKykgUHJvdmlkZSB3aGljaCBjYWxsYmFjayB3aWxsIGJlIHJlZ2lzdGVyZWQgdXNpbmcgb25lIHZhbHVlIGZyb20KKyAgICAgICAgICAgICBFWFRJX0NhbGxiYWNrSURUeXBlRGVmLgorICAgICAgICAoKyspIFByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlci4KKworICAgICgjKSBHZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0IHVzaW5nIEhBTF9FWFRJX0dldFBlbmRpbmcoKS4KKworICAgICgjKSBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdXNpbmcgSEFMX0VYVElfR2V0UGVuZGluZygpLgorCisgICAgKCMpIEdlbmVyYXRlIHNvZnR3YXJlIGludGVycnVwdCB1c2luZyBIQUxfRVhUSV9HZW5lcmF0ZVNXSSgpLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRVhUSQorICAqIEB7CisgICovCisvKiogTUlTUkEgQzoyMDEyIGRldmlhdGlvbiBydWxlIGhhcyBiZWVuIGdyYW50ZWQgZm9yIGZvbGxvd2luZyBydWxlOgorICAqIFJ1bGUtMTguMV9iIC0gTWVkaXVtOiBBcnJheSBgRVhUSUNSJyAxc3Qgc3Vic2NyaXB0IGludGVydmFsIFswLDddIG1heSBiZSBvdXQKKyAgKiBvZiBib3VuZHMgWzAsM10gaW4gZm9sbG93aW5nIEFQSSA6CisgICogSEFMX0VYVElfU2V0Q29uZmlnTGluZQorICAqIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUKKyAgKiBIQUxfRVhUSV9DbGVhckNvbmZpZ0xpbmUKKyAgKi8KKworI2lmZGVmIEhBTF9FWFRJX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX0NvbnN0YW50cyBFWFRJIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRVhUSV9NT0RFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgwNHUgICAvKiAweDEwOiBvZmZzZXQgYmV0d2VlbiBDUFUgSU1SL0VNUiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRVhUSV9DT05GSUdfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwOHUgICAvKiAweDIwOiBvZmZzZXQgYmV0d2VlbiBDUFUgUmlzaW5nL0ZhbGxpbmcgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgcEV4dGlDb25maWcgUG9pbnRlciBvbiBFWFRJIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2V0LgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoKGhleHRpID09IE5VTEwpIHx8IChwRXh0aUNvbmZpZyA9PSBOVUxMKSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUocEV4dGlDb25maWctPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTU9ERShwRXh0aUNvbmZpZy0+TW9kZSkpOworCisgIC8qIEFzc2lnbiBsaW5lIG51bWJlciB0byBoYW5kbGUgKi8KKyAgaGV4dGktPkxpbmUgPSBwRXh0aUNvbmZpZy0+TGluZTsKKworICAvKiBjb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbGluZXBvcyA9IChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUElOX01BU0spOworICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7CisKKyAgLyogQ29uZmlndXJlIHRyaWdnZXJzIGZvciBjb25maWd1cmFibGUgbGluZXMgKi8KKyAgaWYgKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfQ09ORklHKSAhPSAweDAwdSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19FWFRJX1RSSUdHRVIocEV4dGlDb25maWctPlRyaWdnZXIpKTsKKworICAgIC8qIENvbmZpZ3VyZSByaXNpbmcgdHJpZ2dlciAqLworICAgIHJlZ2FkZHIgPSAoJkVYVEktPlJUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgICAgLyogTWFzayBvciBzZXQgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPlRyaWdnZXIgJiBFWFRJX1RSSUdHRVJfUklTSU5HKSAhPSAweDAwdSkKKyAgICB7CisgICAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZWd2YWwgJj0gfm1hc2tsaW5lOworICAgIH0KKworICAgIC8qIFN0b3JlIHJpc2luZyB0cmlnZ2VyIG1vZGUgKi8KKyAgICAqcmVnYWRkciA9IHJlZ3ZhbDsKKworICAgIC8qIENvbmZpZ3VyZSBmYWxsaW5nIHRyaWdnZXIgKi8KKyAgICByZWdhZGRyID0gKCZFWFRJLT5GVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgICByZWd2YWwgPSAqcmVnYWRkcjsKKworICAgIC8qIE1hc2sgb3Igc2V0IGxpbmUgKi8KKyAgICBpZiAoKHBFeHRpQ29uZmlnLT5UcmlnZ2VyICYgRVhUSV9UUklHR0VSX0ZBTExJTkcpICE9IDB4MDB1KQorICAgIHsKKyAgICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJlZ3ZhbCAmPSB+bWFza2xpbmU7CisgICAgfQorCisgICAgLyogU3RvcmUgZmFsbGluZyB0cmlnZ2VyIG1vZGUgKi8KKyAgICAqcmVnYWRkciA9IHJlZ3ZhbDsKKworICAgIC8qIENvbmZpZ3VyZSBncGlvIHBvcnQgc2VsZWN0aW9uIGluIGNhc2Ugb2YgZ3BpbyBleHRpIGxpbmUgKi8KKyAgICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QT1JUKHBFeHRpQ29uZmlnLT5HUElPU2VsKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BJTihsaW5lcG9zKSk7CisKKyAgICAgIHJlZ3ZhbCA9IEVYVEktPkVYVElDUltsaW5lcG9zID4+IDJ1XTsKKyAgICAgIHJlZ3ZhbCAmPSB+KEVYVElfRVhUSUNSMV9FWFRJMCA8PCAoRVhUSV9FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7CisgICAgICByZWd2YWwgfD0gKHBFeHRpQ29uZmlnLT5HUElPU2VsIDw8IChFWFRJX0VYVElDUjFfRVhUSTFfUG9zICogKGxpbmVwb3MgJiAweDAzdSkpKTsKKyAgICAgIEVYVEktPkVYVElDUltsaW5lcG9zID4+IDJ1XSA9IHJlZ3ZhbDsKKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgaW50ZXJydXB0IG1vZGUgOiByZWFkIGN1cnJlbnQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgLyogTWFzayBvciBzZXQgbGluZSAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5Nb2RlICYgRVhUSV9NT0RFX0lOVEVSUlVQVCkgIT0gMHgwMHUpCisgIHsKKyAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgfQorCisgIC8qIFN0b3JlIGludGVycnVwdCBtb2RlICovCisgICpyZWdhZGRyID0gcmVndmFsOworCisgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlIDogcmVhZCBjdXJyZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgIC8qIE1hc2sgb3Igc2V0IGxpbmUgKi8KKyAgaWYgKChwRXh0aUNvbmZpZy0+TW9kZSAmIEVYVElfTU9ERV9FVkVOVCkgIT0gMHgwMHUpCisgIHsKKyAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgfQorCisgIC8qIFN0b3JlIGV2ZW50IG1vZGUgKi8KKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgcEV4dGlDb25maWcgUG9pbnRlciBvbiBzdHJ1Y3R1cmUgdG8gc3RvcmUgRXh0aSBjb25maWd1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoKGhleHRpID09IE5VTEwpIHx8IChwRXh0aUNvbmZpZyA9PSBOVUxMKSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKworICAvKiBTdG9yZSBoYW5kbGUgbGluZSBudW1iZXIgdG8gY29uZmlnaWd1cmF0aW9uIHN0cnVjdHVyZSAqLworICBwRXh0aUNvbmZpZy0+TGluZSA9IGhleHRpLT5MaW5lOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBsaW5lcG9zID0gKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiAxXSBHZXQgY29yZSBtb2RlIDogaW50ZXJydXB0ICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPklNUjEgKyAoRVhUSV9NT0RFX09GRlNFVCAqIG9mZnNldCkpOworICByZWd2YWwgPSAqcmVnYWRkcjsKKworICAvKiBDaGVjayBpZiBzZWxlY3RlZCBsaW5lIGlzIGVuYWJsZSAqLworICBpZiAoKHJlZ3ZhbCAmIG1hc2tsaW5lKSAhPSAweDAwdSkKKyAgeworICAgIHBFeHRpQ29uZmlnLT5Nb2RlID0gRVhUSV9NT0RFX0lOVEVSUlVQVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwRXh0aUNvbmZpZy0+TW9kZSA9IEVYVElfTU9ERV9OT05FOworICB9CisKKyAgLyogR2V0IGV2ZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgIC8qIENoZWNrIGlmIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgIGlmICgocmVndmFsICYgbWFza2xpbmUpICE9IDB4MDB1KQorICB7CisgICAgcEV4dGlDb25maWctPk1vZGUgfD0gRVhUSV9NT0RFX0VWRU5UOworICB9CisKKyAgLyogMl0gR2V0IHRyaWdnZXIgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyA6IHJpc2luZyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQorICB7CisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfUklTSU5HOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfTk9ORTsKKyAgICB9CisKKyAgICAvKiBHZXQgZmFsbGluZyBjb25maWd1cmF0aW9uICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+RlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgfD0gRVhUSV9UUklHR0VSX0ZBTExJTkc7CisgICAgfQorCisgICAgLyogR2V0IEdwaW8gcG9ydCBzZWxlY3Rpb24gZm9yIGdwaW8gbGluZXMgKi8KKyAgICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QSU4obGluZXBvcykpOworCisgICAgICByZWd2YWwgPSBFWFRJLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICBwRXh0aUNvbmZpZy0+R1BJT1NlbCA9ICgocmVndmFsIDw8IChFWFRJX0VYVElDUjFfRVhUSTFfUG9zICogKDN1TCAtIChsaW5lcG9zICYgMHgwM3UpKSkpID4+IDI0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBFeHRpQ29uZmlnLT5HUElPU2VsID0gMHgwMHU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gRVhUSV9UUklHR0VSX05PTkU7CisgICAgcEV4dGlDb25maWctPkdQSU9TZWwgPSAweDAwdTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciB3aG9sZSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKQoreworICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOworICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IGxpbmVwb3M7CisgIHVpbnQzMl90IG1hc2tsaW5lOworICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgLyogQ2hlY2sgbnVsbCBwb2ludGVyICovCisgIGlmIChoZXh0aSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKGhleHRpLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBsaW5lcG9zID0gKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiAxXSBDbGVhciBpbnRlcnJ1cHQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsKKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgLyogMl0gQ2xlYXIgZXZlbnQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5FTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsKKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgLyogM10gQ2xlYXIgdHJpZ2dlcnMgaW4gY2FzZSBvZiBjb25maWd1cmFibGUgbGluZXMgKi8KKyAgaWYgKChoZXh0aS0+TGluZSAmIEVYVElfQ09ORklHKSAhPSAweDAwdSkKKyAgeworICAgIHJlZ2FkZHIgPSAoJkVYVEktPlJUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7CisgICAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgICByZWdhZGRyID0gKCZFWFRJLT5GVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgICByZWd2YWwgPSAoKnJlZ2FkZHIgJiB+bWFza2xpbmUpOworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogR2V0IEdwaW8gcG9ydCBzZWxlY3Rpb24gZm9yIGdwaW8gbGluZXMgKi8KKyAgICBpZiAoKGhleHRpLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QSU4obGluZXBvcykpOworCisgICAgICByZWd2YWwgPSBFWFRJLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICByZWd2YWwgJj0gfihFWFRJX0VYVElDUjFfRVhUSTAgPDwgKEVYVElfRVhUSUNSMV9FWFRJMV9Qb3MgKiAobGluZXBvcyAmIDB4MDN1KSkpOworICAgICAgRVhUSS0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdID0gcmVndmFsOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBjYWxsYmFjayBmb3IgYSBkZWRpY2FhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBVc2VyIGNhbGxiYWNrIGlkZW50aWZpZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgQHJlZiBFWFRJX0NhbGxiYWNrSURUeXBlRGVmIHZhbHVlcy4KKyAgKiBAcGFyYW0gIHBQZW5kaW5nQ2JmbiBmdW5jdGlvbiBwb2ludGVyIHRvIGJlIHN0b3JlZCBhcyBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9SZWdpc3RlckNhbGxiYWNrKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgdm9pZCAoKnBQZW5kaW5nQ2Jmbikodm9pZCkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgIHsKKyAgICBjYXNlICBIQUxfRVhUSV9DT01NT05fQ0JfSUQ6CisgICAgICBoZXh0aS0+UmlzaW5nQ2FsbGJhY2sgPSBwUGVuZGluZ0NiZm47CisgICAgICBoZXh0aS0+RmFsbGluZ0NhbGxiYWNrID0gcFBlbmRpbmdDYmZuOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICBIQUxfRVhUSV9SSVNJTkdfQ0JfSUQ6CisgICAgICBoZXh0aS0+UmlzaW5nQ2FsbGJhY2sgPSBwUGVuZGluZ0NiZm47CisgICAgICBicmVhazsKKworICAgIGNhc2UgIEhBTF9FWFRJX0ZBTExJTkdfQ0JfSUQ6CisgICAgICBoZXh0aS0+RmFsbGluZ0NhbGxiYWNrID0gcFBlbmRpbmdDYmZuOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RvcmUgbGluZSBudW1iZXIgYXMgaGFuZGxlIHByaXZhdGUgZmllbGQuCisgICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEV4dGlMaW5lIEV4dGkgbGluZSBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgZnJvbSAwIHRvIEByZWYgRVhUSV9MSU5FX05CLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShFeHRpTGluZSkpOworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoaGV4dGkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU3RvcmUgbGluZSBudW1iZXIgYXMgaGFuZGxlIHByaXZhdGUgZmllbGQgKi8KKyAgICBoZXh0aS0+TGluZSA9IEV4dGlMaW5lOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgRVhUSSBJTyBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBFWFRJIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHJldHZhbCBub25lLgorICAqLwordm9pZCBIQUxfRVhUSV9JUlFIYW5kbGVyKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpCit7CisgIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7CisgIHVpbnQzMl90IHJlZ3ZhbDsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICAvKiBHZXQgcmlzaW5nIGVkZ2UgcGVuZGluZyBiaXQgICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPlJQUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIG1hc2tsaW5lKTsKKworICBpZiAocmVndmFsICE9IDB4MDB1KQorICB7CisgICAgLyogQ2xlYXIgcGVuZGluZyBiaXQgKi8KKyAgICAqcmVnYWRkciA9IG1hc2tsaW5lOworCisgICAgLyogQ2FsbCByaXNpbmcgY2FsbGJhY2sgKi8KKyAgICBpZiAoaGV4dGktPlJpc2luZ0NhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgaGV4dGktPlJpc2luZ0NhbGxiYWNrKCk7CisgICAgfQorICB9CisKKyAgLyogR2V0IGZhbGxpbmcgZWRnZSBwZW5kaW5nIGJpdCAgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgbWFza2xpbmUpOworCisgIGlmIChyZWd2YWwgIT0gMHgwMHUpCisgIHsKKyAgICAvKiBDbGVhciBwZW5kaW5nIGJpdCAqLworICAgICpyZWdhZGRyID0gbWFza2xpbmU7CisKKyAgICAvKiBDYWxsIHJpc2luZyBjYWxsYmFjayAqLworICAgIGlmIChoZXh0aS0+RmFsbGluZ0NhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgaGV4dGktPkZhbGxpbmdDYWxsYmFjaygpOworICAgIH0KKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IGludGVycnVwdCBwZW5kaW5nIGJpdCBvZiBhIGRlZGljYXRlZCBsaW5lLgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHBhcmFtICBFZGdlIFNwZWNpZnkgd2hpY2ggcGVuZGluZyBlZGdlIGFzIHRvIGJlIGNoZWNrZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgRVhUSV9UUklHR0VSX1JJU0lORworICAqICAgICAgICAgICBAYXJnIEByZWYgRVhUSV9UUklHR0VSX0ZBTExJTkcKKyAgKiBAcmV0dmFsIDEgaWYgaW50ZXJydXB0IGlzIHBlbmRpbmcgZWxzZSAwLgorICAqLwordWludDMyX3QgSEFMX0VYVElfR2V0UGVuZGluZyhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFZGdlKQoreworICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOworICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IGxpbmVwb3M7CisgIHVpbnQzMl90IG1hc2tsaW5lOworICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CisgIGFzc2VydF9wYXJhbShJU19FWFRJX0NPTkZJR19MSU5FKGhleHRpLT5MaW5lKSk7CisgIGFzc2VydF9wYXJhbShJU19FWFRJX1BFTkRJTkdfRURHRShFZGdlKSk7CisKKyAgLyogY29tcHV0ZSBsaW5lIHJlZ2lzdGVyIG9mZnNldCBhbmQgbGluZSBtYXNrICovCisgIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIGxpbmVwb3MgPSAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKTsKKyAgbWFza2xpbmUgPSAoMXVMIDw8IGxpbmVwb3MpOworCisgIGlmIChFZGdlICE9IEVYVElfVFJJR0dFUl9SSVNJTkcpCisgIHsKKyAgICAvKiBHZXQgZmFsbGluZyBlZGdlIHBlbmRpbmcgYml0ICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+RlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBHZXQgcmlzaW5nIGVkZ2UgcGVuZGluZyBiaXQgKi8KKyAgICByZWdhZGRyID0gKCZFWFRJLT5SUFIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICB9CisKKyAgLyogcmV0dXJuIDEgaWYgYml0IGlzIHNldCBlbHNlIDAgKi8KKyAgcmVndmFsID0gKCgqcmVnYWRkciAmIG1hc2tsaW5lKSA+PiBsaW5lcG9zKTsKKyAgcmV0dXJuIHJlZ3ZhbDsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGludGVycnVwdCBwZW5kaW5nIGJpdCBvZiBhIGRlZGljYXRlZCBsaW5lLgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHBhcmFtICBFZGdlIFNwZWNpZnkgd2hpY2ggcGVuZGluZyBlZGdlIGFzIHRvIGJlIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEVYVElfVFJJR0dFUl9SSVNJTkcKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEVYVElfVFJJR0dFUl9GQUxMSU5HCisgICogQHJldHZhbCBOb25lLgorICAqLwordm9pZCBIQUxfRVhUSV9DbGVhclBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfUEVORElOR19FREdFKEVkZ2UpKTsKKworICAvKiBjb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICBpZiAoRWRnZSAhPSBFWFRJX1RSSUdHRVJfUklTSU5HKQorICB7CisgICAgLyogR2V0IGZhbGxpbmcgZWRnZSBwZW5kaW5nIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyAgICByZWdhZGRyID0gKCZFWFRJLT5GUFIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEdldCBmYWxsaW5nIGVkZ2UgcGVuZGluZyByZWdpc3RlciBhZGRyZXNzICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgfQorCisgIC8qIENsZWFyIFBlbmRpbmcgYml0ICovCisgICpyZWdhZGRyID0gIG1hc2tsaW5lOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgZm9yIGEgZGVkaWNhdGVkIGxpbmUuCisgICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCit2b2lkIEhBTF9FWFRJX0dlbmVyYXRlU1dJKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpCit7CisgIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7CisgIHVpbnQzMl90IG1hc2tsaW5lOworICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyZCAqLworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CisgIGFzc2VydF9wYXJhbShJU19FWFRJX0NPTkZJR19MSU5FKGhleHRpLT5MaW5lKSk7CisKKyAgLyogY29tcHV0ZSBsaW5lIHJlZ2lzdGVyIG9mZnNldCBhbmQgbGluZSBtYXNrICovCisgIG9mZnNldCA9ICgoaGV4dGktPkxpbmUgJiBFWFRJX1JFR19NQVNLKSA+PiBFWFRJX1JFR19TSElGVCk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7CisKKyAgcmVnYWRkciA9ICgmRVhUSS0+U1dJRVIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAqcmVnYWRkciA9IG1hc2tsaW5lOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2ZsYXNoLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTA5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9mbGFzaC5jCkBAIC0wLDAgKzEsNzA5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9mbGFzaC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTEFTSCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBpbnRlcm5hbCBGTEFTSCBtZW1vcnk6CisgICogICAgICAgICAgICsgUHJvZ3JhbSBvcGVyYXRpb25zIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIE1lbW9yeSBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucworICAqCisgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRkxBU0ggcGVyaXBoZXJhbCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dIFRoZSBGbGFzaCBtZW1vcnkgaW50ZXJmYWNlIG1hbmFnZXMgQ1BVIEFIQiBJLUNvZGUgYW5kIEQtQ29kZSBhY2Nlc3NlcworICAgICAgIHRvIHRoZSBGbGFzaCBtZW1vcnkuIEl0IGltcGxlbWVudHMgdGhlIGVyYXNlIGFuZCBwcm9ncmFtIEZsYXNoIG1lbW9yeSBvcGVyYXRpb25zCisgICAgICAgYW5kIHRoZSByZWFkIGFuZCB3cml0ZSBwcm90ZWN0aW9uIG1lY2hhbmlzbXMuCisKKyAgWy4uXSBUaGUgRmxhc2ggbWVtb3J5IGludGVyZmFjZSBhY2NlbGVyYXRlcyBjb2RlIGV4ZWN1dGlvbiB3aXRoIGEgc3lzdGVtIG9mIGluc3RydWN0aW9uCisgICAgICAgcHJlZmV0Y2ggYW5kIGNhY2hlIGxpbmVzLgorCisgIFsuLl0gVGhlIEZMQVNIIG1haW4gZmVhdHVyZXMgYXJlOgorICAgICAgKCspIEZsYXNoIG1lbW9yeSByZWFkIG9wZXJhdGlvbnMKKyAgICAgICgrKSBGbGFzaCBtZW1vcnkgcHJvZ3JhbS9lcmFzZSBvcGVyYXRpb25zCisgICAgICAoKykgUmVhZCAvIHdyaXRlIHByb3RlY3Rpb25zCisgICAgICAoKykgT3B0aW9uIGJ5dGVzIHByb2dyYW1taW5nCisgICAgICAoKykgUHJlZmV0Y2ggb24gSS1Db2RlCisgICAgICAoKykgMzIgY2FjaGUgbGluZXMgb2YgNCo2NCBiaXRzIG9uIEktQ29kZQorICAgICAgKCspIEVycm9yIGNvZGUgY29ycmVjdGlvbiAoRUNDKSA6IERhdGEgaW4gZmxhc2ggYXJlIDcyLWJpdHMgd29yZAorICAgICAgICAgICg4IGJpdHMgYWRkZWQgcGVyIGRvdWJsZSB3b3JkKQorCisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGTEFTSAorICAgICAgbWVtb3J5IG9mIGFsbCBTVE0zMkcweHggZGV2aWNlcy4KKworICAgICAgKCMpIEZsYXNoIE1lbW9yeSBJTyBQcm9ncmFtbWluZyBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgTG9jayBhbmQgVW5sb2NrIHRoZSBGTEFTSCBpbnRlcmZhY2UgdXNpbmcgSEFMX0ZMQVNIX1VubG9jaygpIGFuZAorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9Mb2NrKCkgZnVuY3Rpb25zCisgICAgICAgICAgICgrKykgUHJvZ3JhbSBmdW5jdGlvbnM6IGRvdWJsZSB3b3JkIGFuZCBmYXN0IHByb2dyYW0gKGZ1bGwgcm93IHByb2dyYW1taW5nKQorICAgICAgICAgICAoKyspIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgcHJvZ3JhbW1pbmc6CisgICAgICAgICAgICAoKysrKSBQb2xsaW5nIG1vZGUgdXNpbmcgSEFMX0ZMQVNIX1Byb2dyYW0oKSBmdW5jdGlvbgorICAgICAgICAgICAgKCsrKykgSW50ZXJydXB0IG1vZGUgdXNpbmcgSEFMX0ZMQVNIX1Byb2dyYW1fSVQoKSBmdW5jdGlvbgorCisgICAgICAoIykgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudCBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgSGFuZGxlIEZMQVNIIGludGVycnVwdHMgYnkgY2FsbGluZyBIQUxfRkxBU0hfSVJRSGFuZGxlcigpCisgICAgICAgICAgICgrKykgQ2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2hlbiB0aGUgZmxhc2ggb3BlcmF0aW9ucyBhcmUgZmluaXNoZWQgOgorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKCkgd2hlbiBldmVyeXRoaW5nIGlzIG9rLCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgICgrKykgR2V0IGVycm9yIGZsYWcgc3RhdHVzIGJ5IGNhbGxpbmcgSEFMX0dldEVycm9yKCkKKworICAgICAgKCMpIE9wdGlvbiBieXRlcyBtYW5hZ2VtZW50IGZ1bmN0aW9ucyA6CisgICAgICAgICAgICgrKykgTG9jayBhbmQgVW5sb2NrIHRoZSBvcHRpb24gYnl0ZXMgdXNpbmcgSEFMX0ZMQVNIX09CX1VubG9jaygpIGFuZAorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9PQl9Mb2NrKCkgZnVuY3Rpb25zCisgICAgICAgICAgICgrKykgTGF1bmNoIHRoZSByZWxvYWQgb2YgdGhlIG9wdGlvbiBieXRlcyB1c2luZyBIQUxfRkxBU0hfT0JfTGF1bmNoKCkgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhIHJlc2V0IGlzIGdlbmVyYXRlZAorCisgICAgWy4uXQorICAgICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgZnVuY3Rpb25zLCB0aGlzIGRyaXZlciBpbmNsdWRlcyBhIHNldCBvZiBtYWNyb3MgYWxsb3dpbmcKKyAgICAgIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnM6CisgICAgICAgKCspIFNldCB0aGUgbGF0ZW5jeQorICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgcHJlZmV0Y2ggYnVmZmVyCisgICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBJbnN0cnVjdGlvbiBjYWNoZQorICAgICAgICgrKSBSZXNldCB0aGUgSW5zdHJ1Y3Rpb24gY2FjaGUKKyAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEZsYXNoIHBvd2VyLWRvd24gZHVyaW5nIGxvdy1wb3dlciBydW4gYW5kIHNsZWVwIG1vZGVzCisgICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBGbGFzaCBpbnRlcnJ1cHRzCisgICAgICAgKCspIE1vbml0b3IgdGhlIEZsYXNoIGZsYWdzIHN0YXR1cworCisgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0ggRkxBU0gKKyAgKiBAYnJpZWYgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfVmFyaWFibGVzIEZMQVNIIFByaXZhdGUgVmFyaWFibGVzCisgKiBAeworICovCisvKioKKyAgKiBAYnJpZWYgIFZhcmlhYmxlIHVzZWQgZm9yIFByb2dyYW0vRXJhc2Ugc2VjdG9ycyB1bmRlciBpbnRlcnJ1cHRpb24KKyAgKi8KK0ZMQVNIX1Byb2Nlc3NUeXBlRGVmIHBGbGFzaCAgPSB7LkxvY2sgPSBIQUxfVU5MT0NLRUQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfVFlQRU5PTkUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFkZHJlc3MgPSAwVSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUGFnZSA9IDBVLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5OYlBhZ2VzVG9FcmFzZSA9IDBVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCitzdGF0aWMgdm9pZCAgICAgICAgICBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSk7CitzdGF0aWMgdm9pZCAgICAgICAgICBGTEFTSF9Qcm9ncmFtX0Zhc3QodWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgRGF0YUFkZHJlc3MpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zIEZMQVNIIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIFByb2dyYW1taW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBGTEFTSAorICAgIHByb2dyYW0gb3BlcmF0aW9ucy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtIGRvdWJsZSB3b3JkIG9yIGZhc3QgcHJvZ3JhbSBvZiBhIHJvdyBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgVHlwZVByb2dyYW0gSW5kaWNhdGUgdGhlIHdheSB0byBwcm9ncmFtIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MuCisgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSF9UeXBlX1Byb2dyYW0KKyAgKiBAcGFyYW0gIEFkZHJlc3MgU3BlY2lmaWVzIHRoZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBEYXRhIFNwZWNpZmllcyB0aGUgZGF0YSB0byBiZSBwcm9ncmFtbWVkCisgICogICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB0aGUgZGF0YSBmb3IgdGhlIGRvdWJsZSB3b3JkIHByb2dyYW0gYW5kIHRoZSBhZGRyZXNzIHdoZXJlCisgICogICAgICAgICAgICAgICBhcmUgc3RvcmVkIHRoZSBkYXRhIGZvciB0aGUgcm93IGZhc3QgcHJvZ3JhbS4KKyAgKgorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBSZXNldCBlcnJvciBjb2RlICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICBpZiAoVHlwZVByb2dyYW0gPT0gRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgICAgIC8qIFByb2dyYW0gZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworICAgICAgRkxBU0hfUHJvZ3JhbV9Eb3VibGVXb3JkKEFkZHJlc3MsIERhdGEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9GQVNUX1BST0dSQU1fQUREUkVTUyhBZGRyZXNzKSk7CisKKyAgICAgIC8qIEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzICovCisgICAgICBGTEFTSF9Qcm9ncmFtX0Zhc3QoQWRkcmVzcywgKHVpbnQzMl90KURhdGEpOworICAgIH0KKworICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgICAgLyogSWYgdGhlIHByb2dyYW0gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgZGlzYWJsZSB0aGUgUEcgb3IgRlNUUEcgQml0ICovCisgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgVHlwZVByb2dyYW0pOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgLyogcmV0dXJuIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gZG91YmxlIHdvcmQgb3IgZmFzdCBwcm9ncmFtIG9mIGEgcm93IGF0IGEgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4KKyAgKiBAcGFyYW0gIFR5cGVQcm9ncmFtIEluZGljYXRlIHRoZSB3YXkgdG8gcHJvZ3JhbSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVHlwZV9Qcm9ncmFtCisgICogQHBhcmFtICBBZGRyZXNzIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgRGF0YSBTcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZAorICAqICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGRhdGEgZm9yIHRoZSBkb3VibGUgd29yZCBwcm9ncmFtIGFuZCB0aGUgYWRkcmVzcyB3aGVyZQorICAqICAgICAgICAgICAgICAgYXJlIHN0b3JlZCB0aGUgZGF0YSBmb3IgdGhlIHJvdyBmYXN0IHByb2dyYW0uCisgICoKKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50NjRfdCBEYXRhKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVQUk9HUkFNKFR5cGVQcm9ncmFtKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgLyogUmVzZXQgZXJyb3IgY29kZSAqLworICBwRmxhc2guRXJyb3JDb2RlID0gSEFMX0ZMQVNIX0VSUk9SX05PTkU7CisKKyAgLyogV2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgIT0gSEFMX09LKQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIElSUSBoYW5kbGVyICovCisgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBUeXBlUHJvZ3JhbTsKKyAgICBwRmxhc2guQWRkcmVzcyA9IEFkZHJlc3M7CisKKyAgICAvKiBFbmFibGUgRW5kIG9mIE9wZXJhdGlvbiBhbmQgRXJyb3IgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9PUEVSUiB8IEZMQVNIX0lUX0VDQ0MpOworCisgICAgaWYgKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBQcm9ncmFtIGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgKi8KKyAgICAgIEZMQVNIX1Byb2dyYW1fRG91YmxlV29yZChBZGRyZXNzLCBEYXRhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfRkFTVF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBGYXN0IHByb2dyYW0gYSAzMiByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworICAgICAgRkxBU0hfUHJvZ3JhbV9GYXN0KEFkZHJlc3MsICh1aW50MzJfdClEYXRhKTsKKyAgICB9CisgIH0KKworICAvKiByZXR1cm4gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBIYW5kbGUgRkxBU0ggaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIHVpbnQzMl90IHBhcmFtID0gMHhGRkZGRkZGRlU7CisgIHVpbnQzMl90IGVycm9yOworCisgIC8qIFNhdmUgZmxhc2ggZXJyb3JzLiBPbmx5IEVDQyBkZXRlY3Rpb24gY2FuIGJlIGNoZWNrZWQgaGVyZSBhcyBFQ0NDCisgICAgIGdlbmVyYXRlcyBOTUkgKi8KKyAgZXJyb3IgPSAoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19TUl9FUlJPUik7CisgIGVycm9yIHw9IChGTEFTSC0+RUNDUiAmIEZMQVNIX0ZMQUdfRUNDQyk7CisKKyAgQ0xFQVJfQklUKEZMQVNILT5DUiwgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcpOworCisgIC8qIEFdIFNldCBwYXJhbWV0ZXIgZm9yIHVzZXIgb3IgZXJyb3IgY2FsbGJhY2tzICovCisgIC8qIGNoZWNrIG9wZXJhdGlvbiB3YXMgYSBwcm9ncmFtIG9yIGVyYXNlICovCisgIGlmICgocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgJiAoRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCB8IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpKSAhPSAweDAwVSkKKyAgeworICAgIC8qIHJldHVybiBhZHJlc3MgYmVpbmcgcHJvZ3JhbW1lZCAqLworICAgIHBhcmFtID0gcEZsYXNoLkFkZHJlc3M7CisgIH0KKyAgZWxzZSBpZiAoKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nICYgKEZMQVNIX1RZUEVFUkFTRV9NQVNTIHwgRkxBU0hfVFlQRUVSQVNFX1BBR0VTKSkgIT0gMHgwMFUpCisgIHsKKyAgICAvKiByZXR1cm4gcGFnZSBudW1iZXIgYmVpbmcgZXJhc2VkICgwIGZvciBtYXNzIGVyYXNlKSAqLworICAgIHBhcmFtID0gcEZsYXNoLlBhZ2U7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogQl0gQ2hlY2sgZXJyb3JzICovCisgIGlmIChlcnJvciAhPSAweDAwVSkKKyAgeworICAgIC8qU2F2ZSB0aGUgZXJyb3IgY29kZSovCisgICAgcEZsYXNoLkVycm9yQ29kZSB8PSBlcnJvcjsKKworICAgIC8qIGNsZWFyIGVycm9yIGZsYWdzICovCisgICAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhlcnJvcik7CisKKyAgICAvKlN0b3AgdGhlIHByb2NlZHVyZSBvbmdvaW5nKi8KKyAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1RZUEVOT05FOworCisgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyAgICBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayhwYXJhbSk7CisgIH0KKworICAvKiBDXSBDaGVjayBGTEFTSCBFbmQgb2YgT3BlcmF0aW9uIGZsYWcgKi8KKyAgaWYgKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfRU9QKSAhPSAweDAwVSkKKyAgeworICAgIC8qIENsZWFyIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKEZMQVNIX0ZMQUdfRU9QKTsKKworICAgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9UWVBFRVJBU0VfUEFHRVMpCisgICAgeworICAgICAgLyogTmIgb2YgcGFnZXMgdG8gZXJhc2VkIGNhbiBiZSBkZWNyZWFzZWQgKi8KKyAgICAgIHBGbGFzaC5OYlBhZ2VzVG9FcmFzZS0tOworCisgICAgICAvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgcGFnZXMgdG8gZXJhc2UqLworICAgICAgaWYgKHBGbGFzaC5OYlBhZ2VzVG9FcmFzZSAhPSAweDAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogSW5jcmVtZW50IHBhZ2UgbnVtYmVyICovCisgICAgICAgIHBGbGFzaC5QYWdlKys7CisgICAgICAgIEZMQVNIX1BhZ2VFcmFzZShwRmxhc2guUGFnZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vIG1vcmUgcGFnZXMgdG8gZXJhc2U6IHN0b3AgZXJhc2UgcGFnZXMgcHJvY2VkdXJlICovCisgICAgICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfVFlQRU5PTkU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKlN0b3AgdGhlIG9uZ29pbmcgcHJvY2VkdXJlICovCisgICAgICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IEZMQVNIX1RZUEVOT05FOworICAgIH0KKworICAgIC8qIFVzZXIgY2FsbGJhY2sgKi8KKyAgICBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayhwYXJhbSk7CisgIH0KKworICBpZiAocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPT0gRkxBU0hfVFlQRU5PTkUpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVuZCBvZiBPcGVyYXRpb24gYW5kIEVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9GTEFTSF9ESVNBQkxFX0lUKEZMQVNIX0lUX0VPUCB8IEZMQVNIX0lUX09QRVJSIHwgRkxBU0hfSVRfRUNDQyk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggZW5kIG9mIG9wZXJhdGlvbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHBhcmFtICBSZXR1cm5WYWx1ZSBUaGUgdmFsdWUgc2F2ZWQgaW4gdGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgb25nb2luZyBwcm9jZWR1cmUKKyAgKiAgICAgICAgICAgICAgICAgIE1hc3MgRXJhc2U6IDAKKyAgKiAgICAgICAgICAgICAgICAgIFBhZ2UgRXJhc2U6IFBhZ2Ugd2hpY2ggaGFzIGJlZW4gZXJhc2VkCisgICogICAgICAgICAgICAgICAgICBQcm9ncmFtOiBBZGRyZXNzIHdoaWNoIHdhcyBzZWxlY3RlZCBmb3IgZGF0YSBwcm9ncmFtCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoUmV0dXJuVmFsdWUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfRW5kT2ZPcGVyYXRpb25DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEZMQVNIIG9wZXJhdGlvbiBlcnJvciBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHBhcmFtICBSZXR1cm5WYWx1ZSBUaGUgdmFsdWUgc2F2ZWQgaW4gdGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgb25nb2luZyBwcm9jZWR1cmUKKyAgKiAgICAgICAgICAgICAgICAgTWFzcyBFcmFzZTogMAorICAqICAgICAgICAgICAgICAgICBQYWdlIEVyYXNlOiBQYWdlIG51bWJlciB3aGljaCByZXR1cm5lZCBhbiBlcnJvcgorICAqICAgICAgICAgICAgICAgICBQcm9ncmFtOiBBZGRyZXNzIHdoaWNoIHdhcyBzZWxlY3RlZCBmb3IgZGF0YSBwcm9ncmFtCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoUmV0dXJuVmFsdWUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgIE1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgRkxBU0gKKyAgICBtZW1vcnkgb3BlcmF0aW9ucy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIGNvbnRyb2wgcmVnaXN0ZXIgYWNjZXNzLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1VubG9jayh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSykgIT0gMHgwMFUpCisgIHsKKyAgICAvKiBBdXRob3JpemUgdGhlIEZMQVNIIFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyAgICBXUklURV9SRUcoRkxBU0gtPktFWVIsIEZMQVNIX0tFWTEpOworICAgIFdSSVRFX1JFRyhGTEFTSC0+S0VZUiwgRkxBU0hfS0VZMik7CisKKyAgICAvKiB2ZXJpZnkgRmxhc2ggaXMgdW5sb2NrICovCisgICAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSykgIT0gMHgwMFUpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggY29udHJvbCByZWdpc3RlciBhY2Nlc3MuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfTG9jayh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgLyogU2V0IHRoZSBMT0NLIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBSZWdpc3RlcnMgYWNjZXNzICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKTsKKworICAvKiB2ZXJpZnkgRmxhc2ggaXMgbG9ja2VkICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spICE9IDB4MDB1KQorICB7CisgICAgc3RhdHVzID0gSEFMX09LOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbmxvY2sgdGhlIEZMQVNIIE9wdGlvbiBCeXRlcyBSZWdpc3RlcnMgYWNjZXNzLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX1VubG9jayh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSykgIT0gMHgwMFUpCisgIHsKKyAgICAvKiBBdXRob3JpemVzIHRoZSBPcHRpb24gQnl0ZSByZWdpc3RlciBwcm9ncmFtbWluZyAqLworICAgIFdSSVRFX1JFRyhGTEFTSC0+T1BUS0VZUiwgRkxBU0hfT1BUS0VZMSk7CisgICAgV1JJVEVfUkVHKEZMQVNILT5PUFRLRVlSLCBGTEFTSF9PUFRLRVkyKTsKKworICAgIC8qIHZlcmlmeSBvcHRpb24gYnl0ZXMgYXJlIHVubG9ja2VkICovCisgICAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSykgPT0gMHgwMFUpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFJlZ2lzdGVycyBhY2Nlc3MuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTG9jayh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgLyogU2V0IHRoZSBPUFRMT0NLIEJpdCB0byBsb2NrIHRoZSBGTEFTSCBPcHRpb24gQnl0ZSBSZWdpc3RlcnMgYWNjZXNzICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRMT0NLKTsKKworICAvKiB2ZXJpZnkgb3B0aW9uIGJ5dGVzIGFyZSBsb2NrZWQgKi8KKyAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUTE9DSykgIT0gMHgwMHUpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfT0s7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIExhdW5jaCB0aGUgb3B0aW9uIGJ5dGUgbG9hZGluZy4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9PQl9MYXVuY2godm9pZCkKK3sKKyAgLyogU2V0IHRoZSBiaXQgdG8gZm9yY2UgdGhlIG9wdGlvbiBieXRlIHJlbG9hZGluZyAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT0JMX0xBVU5DSCk7CisKKyAgLyogV2Ugc2hvdWxkIG5vdCByZWFjaCBoZXJlIDogT3B0aW9uIGJ5dGUgbGF1bmNoIGdlbmVyYXRlcyBPcHRpb24gYnl0ZSByZXNldAorICAgICBzbyByZXR1cm4gZXJyb3IgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgRXJyb3JzIG9mIHRoZSBGTEFTSCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWMgRkxBU0ggZXJyb3IgZmxhZy4KKyAgKiBAcmV0dmFsIEZMQVNIX0Vycm9yQ29kZSBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX05PTkUgTm8gZXJyb3Igc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX09QIEZMQVNIIE9wZXJhdGlvbiBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9QUk9HIEZMQVNIIFByb2dyYW1taW5nIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX1dSUCBGTEFTSCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX1BHQSBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfU0laIEZMQVNIIFNpemUgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfUEdTIEZMQVNIIFByb2dyYW1taW5nIHNlcXVlbmNlIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX01JUyBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9GQVNUIEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfUkQgRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGVycm9yIChQQ1JPUCkoKikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfT1BUViBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfRUNDRCBGTEFTSCB0d28gRUNDIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQKKyAgKiBAbm90ZSAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpCit7CisgIHJldHVybiBwRmxhc2guRXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdhaXQgZm9yIGEgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgVGltZW91dCBtYXhpbXVtIGZsYXNoIG9wZXJhdGlvbiB0aW1lb3V0CisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCBlcnJvcjsKKyAgLyogV2FpdCBmb3IgdGhlIEZMQVNIIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBieSBwb2xsaW5nIG9uIEJVU1kgZmxhZyB0byBiZSByZXNldC4KKyAgICAgRXZlbiBpZiB0aGUgRkxBU0ggb3BlcmF0aW9uIGZhaWxzLCB0aGUgQlVTWSBmbGFnIHdpbGwgYmUgcmVzZXQgYW5kIGFuIGVycm9yCisgICAgIGZsYWcgd2lsbCBiZSBzZXQgKi8KKyAgdWludDMyX3QgdGltZW91dCA9IEhBTF9HZXRUaWNrKCkgKyBUaW1lb3V0OworCisgIC8qIFdhaXQgaWYgYW55IG9wZXJhdGlvbiBpcyBvbmdvaW5nICovCisgIHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0JTWSkgIT0gMHgwMFUpCisgIHsKKyAgICBpZiAoSEFMX0dldFRpY2soKSA+PSB0aW1lb3V0KQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBjaGVjayBmbGFzaCBlcnJvcnMuIE9ubHkgRUNDIGNvcnJlY3Rpb24gY2FuIGJlIGNoZWNrZWQgaGVyZSBhcyBFQ0NECisgICAgICBnZW5lcmF0ZXMgTk1JICovCisgIGVycm9yID0gKEZMQVNILT5TUiAmIEZMQVNIX0ZMQUdfU1JfRVJST1IpOworICBlcnJvciB8PSAoRkxBU0gtPkVDQ1IgJiBGTEFTSF9GTEFHX0VDQ0MpOworCisgIC8qIGNsZWFyIGVycm9yIGZsYWdzICovCisgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoZXJyb3IpOworCisgIGlmIChlcnJvciAhPSAweDAwVSkKKyAgeworICAgIC8qU2F2ZSB0aGUgZXJyb3IgY29kZSovCisgICAgcEZsYXNoLkVycm9yQ29kZSA9IGVycm9yOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFdhaXQgZm9yIGNvbnRyb2wgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbiAqLworICB0aW1lb3V0ID0gSEFMX0dldFRpY2soKSArIFRpbWVvdXQ7CisKKyAgd2hpbGUgKF9fSEFMX0ZMQVNIX0dFVF9GTEFHKEZMQVNIX0ZMQUdfQ0ZHQlNZKSAhPSAweDAwVSkKKyAgeworICAgIGlmIChIQUxfR2V0VGljaygpID49IHRpbWVvdXQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgQWRkcmVzcyBTcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGEgU3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSkKK3sKKyAgLyogU2V0IFBHIGJpdCAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfUEcpOworCisgIC8qIFByb2dyYW0gZmlyc3Qgd29yZCAqLworICAqKHVpbnQzMl90ICopQWRkcmVzcyA9ICh1aW50MzJfdClEYXRhOworCisgIC8qIEJhcnJpZXIgdG8gZW5zdXJlIHByb2dyYW1taW5nIGlzIHBlcmZvcm1lZCBpbiAyIHN0ZXBzLCBpbiByaWdodCBvcmRlcgorICAgIChpbmRlcGVuZGVudGx5IG9mIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiZWhhdmlvcikgKi8KKyAgX19JU0IoKTsKKworICAvKiBQcm9ncmFtIHNlY29uZCB3b3JkICovCisgICoodWludDMyX3QgKikoQWRkcmVzcyArIDRVKSA9ICh1aW50MzJfdCkoRGF0YSA+PiAzMlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgQWRkcmVzcyBTcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGFBZGRyZXNzIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgZGF0YSBhcmUgc3RvcmVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIF9fUkFNX0ZVTkMgdm9pZCBGTEFTSF9Qcm9ncmFtX0Zhc3QodWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgRGF0YUFkZHJlc3MpCit7CisgIHVpbnQ4X3QgaW5kZXggPSAwOworICB1aW50MzJfdCBkZXN0ID0gQWRkcmVzczsKKyAgdWludDMyX3Qgc3JjID0gRGF0YUFkZHJlc3M7CisgIHVpbnQzMl90IHByaW1hc2tfYml0OworCisgIC8qIFNldCBGU1RQRyBiaXQgKi8KKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0ZTVFBHKTsKKworICAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uOiByb3cgcHJvZ3JhbW1pbmcgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiA3IG1zICovCisgIHByaW1hc2tfYml0ID0gX19nZXRfUFJJTUFTSygpOworICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgLyogRmFzdCBQcm9ncmFtIDogNjQgd29yZHMgKi8KKyAgd2hpbGUgKGluZGV4IDwgNjRVKQorICB7CisgICAgKih1aW50MzJfdCAqKWRlc3QgPSAqKHVpbnQzMl90ICopc3JjOworICAgIHNyYyArPSA0VTsKKyAgICBkZXN0ICs9IDRVOworICAgIGluZGV4Kys7CisgIH0KKworICAvKiB3YWl0IGZvciBCU1kxIGluIG9yZGVyIHRvIGJlIHN1cmUgdGhhdCBmbGFzaCBvcGVyYXRpb24gaXMgZW5kZWQgYmVmb2lyZQorICAgICBhbGxvd2luZyBwcmVmZXRjaCBpbiBmbGFzaC4gVGltZW91dCBkb2VzIG5vdCByZXR1cm4gc3RhdHVzLCBhcyBpdCB3aWxsCisgICAgIGJlIGFueXdheSBkb25lIGxhdGVyICovCisgIHdoaWxlICgoRkxBU0gtPlNSICYgRkxBU0hfU1JfQlNZMSkgIT0gMHgwMFUpCisgIHsKKyAgfQorCisgIC8qIEV4aXQgY3JpdGljYWwgc2VjdGlvbjogcmVzdG9yZSBwcmV2aW91cyBwcmlvcml0eSBtYXNrICovCisgIF9fc2V0X1BSSU1BU0socHJpbWFza19iaXQpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9mbGFzaF9leC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfZmxhc2hfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWYzNjJlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfZmxhc2hfZXguYwpAQCAtMCwwICsxLDkwMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfZmxhc2hfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRkxBU0ggZXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBwcm9ncmFtbWluZyBvcGVyYXRpb25zIGZ1bmN0aW9ucworICAqCisgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgIyMjIyMgRmxhc2ggRXh0ZW5kZWQgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBDb21wYXJpbmcgdG8gb3RoZXIgcHJldmlvdXMgZGV2aWNlcywgdGhlIEZMQVNIIGludGVyZmFjZSBmb3IgU1RNMzJHMHh4CisgICAgICAgZGV2aWNlcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMKKworICAgICAgICgrKSBDYXBhY2l0eSB1cCB0byAxMjggS2J5dGVzIHdpdGggc2luZ2xlIGJhbmsgYXJjaGl0ZWN0dXJlIHN1cHBvcnRpbmcgcmVhZC13aGlsZS13cml0ZQorICAgICAgICAgICBjYXBhYmlsaXR5IChSV1cpCisgICAgICAgKCspIFNpbmdsZSBiYW5rIG1lbW9yeSBvcmdhbml6YXRpb24KKyAgICAgICAoKykgUENST1AgcHJvdGVjdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBhbmQgcHJvZ3JhbSB0aGUgRkxBU0ggbWVtb3J5CisgICAgICAgb2YgYWxsIFNUTTMyRzB4eCBkZXZpY2VzLiBJdCBpbmNsdWRlcworICAgICAgKCMpIEZsYXNoIE1lbW9yeSBFcmFzZSBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgTG9jayBhbmQgVW5sb2NrIHRoZSBGTEFTSCBpbnRlcmZhY2UgdXNpbmcgSEFMX0ZMQVNIX1VubG9jaygpIGFuZAorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9Mb2NrKCkgZnVuY3Rpb25zCisgICAgICAgICAgICgrKykgRXJhc2UgZnVuY3Rpb246IEVyYXNlIHBhZ2UsIGVyYXNlIGFsbCBzZWN0b3JzCisgICAgICAgICAgICgrKykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiBlcmFzZSA6CisgICAgICAgICAgICAgKCsrKykgUG9sbGluZyBNb2RlIHVzaW5nIEhBTF9GTEFTSEV4X0VyYXNlKCkKKyAgICAgICAgICAgICAoKysrKSBJbnRlcnJ1cHQgTW9kZSB1c2luZyBIQUxfRkxBU0hFeF9FcmFzZV9JVCgpCisKKyAgICAgICgjKSBPcHRpb24gQnl0ZXMgUHJvZ3JhbW1pbmcgZnVuY3Rpb246IFVzZSBIQUxfRkxBU0hFeF9PQlByb2dyYW0oKSB0byA6CisgICAgICAgICgrKykgU2V0L1Jlc2V0IHRoZSB3cml0ZSBwcm90ZWN0aW9uCisgICAgICAgICgrKykgU2V0IHRoZSBSZWFkIHByb3RlY3Rpb24gTGV2ZWwKKyAgICAgICAgKCsrKSBQcm9ncmFtIHRoZSB1c2VyIE9wdGlvbiBCeXRlcworICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgUENST1AgcHJvdGVjdGlvbgorICAgICAgICAoKyspIFNldCBTZWN1cmFibGUgbWVtb3J5IGFyZWEgYW5kIGJvb3QgZW50cnkgcG9pbnQKKworICAgICAgKCMpIEdldCBPcHRpb24gQnl0ZXMgQ29uZmlndXJhdGlvbiBmdW5jdGlvbjogVXNlIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKCkgdG8gOgorICAgICAgICAoKyspIEdldCB0aGUgdmFsdWUgb2YgYSB3cml0ZSBwcm90ZWN0aW9uIGFyZWEKKyAgICAgICAgKCsrKSBLbm93IGlmIHRoZSByZWFkIHByb3RlY3Rpb24gaXMgYWN0aXZhdGVkCisgICAgICAgICgrKykgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBPcHRpb24gQnl0ZXMKKyAgICAgICAgKCsrKSBHZXQgU2VjdXJhYmxlIG1lbW9yeSBhcmVhIGFuZCBib290IGVudHJ5IHBvaW50IGluZm9ybWF0aW9ucworCisgICAgICAoIykgRW5hYmxlIG9yIGRpc2FibGUgZGVidWdnZXIgdXNhZ2UgdXNpbmcgSEFMX0ZMQVNIRXhfRW5hYmxlRGVidWdnZXIgYW5kCisgICAgICAgICAgSEFMX0ZMQVNIRXhfRGlzYWJsZURlYnVnZ2VyLgorCisgICAgICAoIykgQ2hlY2sgaXMgZmxhc2ggY29udGVudCBpcyBlbXB0eSBvciBub3QgdXNpbmcgSEFMX0ZMQVNIRXhfRmxhc2hFbXB0eUNoZWNrLgorICAgICAgICAgIGFuZCBtb2RpZnkgdGhpcyBzZXR0aW5nIChmb3IgZmxhc2ggbG9hZGVyIHB1cnBvc2UgZS5nLikgdXNpbmcKKyAgICAgICAgICBIQUxfRkxBU0hFeF9Gb3JjZUZsYXNoRW1wdHkuCisKKyAgICAgICgjKSBFbmFibGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHByb3RlY3Rpb251c2luZyBIQUxfRkxBU0hFeF9FbmFibGVTZWNNZW1Qcm90ZWN0aW9uCisKKyBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4IEZMQVNIRXgKKyAgKiBAYnJpZWYgRkxBU0ggRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSEV4X1ByaXZhdGVfRnVuY3Rpb25zIEZMQVNIRXggUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgRkxBU0hfTWFzc0VyYXNlKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GbHVzaENhY2hlcyh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgRkxBU0hfT0JfV1JQQ29uZmlnKHVpbnQzMl90IFdSUEFyZWEsIHVpbnQzMl90IFdSUFN0YXJ0T2Zmc2V0LCB1aW50MzJfdCBXUkRQRW5kT2Zmc2V0KTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgRkxBU0hfT0JfT3B0ckNvbmZpZyh1aW50MzJfdCBVc2VyVHlwZSwgdWludDMyX3QgVXNlckNvbmZpZywgdWludDMyX3QgUkRQTGV2ZWwpOworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgRkxBU0hfT0JfUENST1AxQUNvbmZpZyh1aW50MzJfdCBQQ1JPUENvbmZpZywgdWludDMyX3QgUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgUENST1AxQUVuZEFkZHIpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBGTEFTSF9PQl9QQ1JPUDFCQ29uZmlnKHVpbnQzMl90IFBDUk9QMUJTdGFydEFkZHIsIHVpbnQzMl90IFBDUk9QMUJFbmRBZGRyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorc3RhdGljIHZvaWQgICAgICAgICAgICAgICBGTEFTSF9PQl9TZWNNZW1Db25maWcodWludDMyX3QgQm9vdEVudHJ5LCB1aW50MzJfdCBTZWNTaXplKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgICAgICAgICAgICAgICBGTEFTSF9PQl9HZXRXUlAodWludDMyX3QgV1JQQXJlYSwgdWludDMyX3QgKldSUFN0YXJ0T2Zmc2V0LCB1aW50MzJfdCAqV1JEUEVuZE9mZnNldCk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgIEZMQVNIX09CX0dldFJEUCh2b2lkKTsKK3N0YXRpYyB1aW50MzJfdCAgICAgICAgICAgRkxBU0hfT0JfR2V0VXNlcih2b2lkKTsKKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEZMQVNIX09CX0dldFBDUk9QMUEodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUFFbmRBZGRyKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgRkxBU0hfT0JfR2V0UENST1AxQih1aW50MzJfdCAqUENST1AxQlN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUJFbmRBZGRyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorc3RhdGljIHZvaWQgICAgICAgICAgICAgICBGTEFTSF9PQl9HZXRTZWNNZW0odWludDMyX3QgKkJvb3RFbnRyeSwgdWludDMyX3QgKlNlY1NpemUpOworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEZMQVNIIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIHByb2dyYW1taW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBFeHRlbmRlZCBGTEFTSAorICAgIHByb2dyYW1taW5nIG9wZXJhdGlvbnMgT3BlcmF0aW9ucy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBhIG1hc3MgZXJhc2Ugb3IgZXJhc2UgdGhlIHNwZWNpZmllZCBGTEFTSCBtZW1vcnkgcGFnZXMuCisgICogQHBhcmFtW2luXSAgcEVyYXNlSW5pdCBQb2ludGVyIHRvIGFuIEByZWYgRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqIEBwYXJhbVtvdXRdICBQYWdlRXJyb3IgUG9pbnRlciB0byB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uCisgICogICAgICAgICBpbmZvcm1hdGlvbiBvbiBmYXVsdHkgcGFnZSBpbiBjYXNlIG9mIGVycm9yICgweEZGRkZGRkZGIG1lYW5zIHRoYXQgYWxsCisgICogICAgICAgICB0aGUgcGFnZXMgaGF2ZSBiZWVuIGNvcnJlY3RseSBlcmFzZWQpCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LCB1aW50MzJfdCAqUGFnZUVycm9yKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90IGluZGV4OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBSZXNldCBlcnJvciBjb2RlICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICBpZiAocEVyYXNlSW5pdC0+VHlwZUVyYXNlID09IEZMQVNIX1RZUEVFUkFTRV9NQVNTKQorICAgIHsKKyAgICAgIC8qIE1hc3MgZXJhc2UgdG8gYmUgZG9uZSAqLworICAgICAgRkxBU0hfTWFzc0VyYXNlKCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKkluaXRpYWxpemF0aW9uIG9mIFBhZ2VFcnJvciB2YXJpYWJsZSovCisgICAgICAqUGFnZUVycm9yID0gMHhGRkZGRkZGRlU7CisKKyAgICAgIGZvciAoaW5kZXggPSBwRXJhc2VJbml0LT5QYWdlOyBpbmRleCA8IChwRXJhc2VJbml0LT5QYWdlICsgcEVyYXNlSW5pdC0+TmJQYWdlcyk7IGluZGV4KyspCisgICAgICB7CisgICAgICAgIC8qIFN0YXJ0IGVyYXNlIHBhZ2UgKi8KKyAgICAgICAgRkxBU0hfUGFnZUVyYXNlKGluZGV4KTsKKworICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBzdG9wIGVyYXNlIHByb2NlZHVyZSBhbmQgcmV0dXJuIHRoZSBmYXVsdHkgYWRkcmVzcyAqLworICAgICAgICAgICpQYWdlRXJyb3IgPSBpbmRleDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBvcGVyYXRpb24gaXMgY29tcGxldGVkIG9yIGludGVycnVwdGVkLCBkaXNhYmxlIHRoZSBQYWdlIEVyYXNlIEJpdCAqLworICAgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfUEVSKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICAvKiByZXR1cm4gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGEgbWFzcyBlcmFzZSBvciBlcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlcyB3aXRoIGludGVycnVwdCBlbmFibGVkLgorICAqIEBwYXJhbSAgcEVyYXNlSW5pdCBQb2ludGVyIHRvIGFuIEByZWYgRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBSZXNldCBlcnJvciBjb2RlICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBzYXZlIHByb2NlZHVyZSBmb3IgaW50ZXJydXB0IHRyZWF0bWVudCAqLworICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IHBFcmFzZUluaXQtPlR5cGVFcmFzZTsKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEVuYWJsZSBFbmQgb2YgT3BlcmF0aW9uIGFuZCBFcnJvciBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfRkxBU0hfRU5BQkxFX0lUKEZMQVNIX0lUX0VPUCB8IEZMQVNIX0lUX09QRVJSKTsKKworICAgIGlmIChwRXJhc2VJbml0LT5UeXBlRXJhc2UgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1MpCisgICAgeworICAgICAgLyogU2V0IFBhZ2UgdG8gMCBmb3IgSW50ZXJydXB0IGNhbGxiYWNrIG1hbmFnbWVudCAqLworICAgICAgcEZsYXNoLlBhZ2UgPSAwOworCisgICAgICAvKiBQcm9jZWVkIHRvIE1hc3MgRXJhc2UgKi8KKyAgICAgIEZMQVNIX01hc3NFcmFzZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRXJhc2UgYnkgcGFnZSB0byBiZSBkb25lICovCisgICAgICBwRmxhc2guTmJQYWdlc1RvRXJhc2UgPSBwRXJhc2VJbml0LT5OYlBhZ2VzOworICAgICAgcEZsYXNoLlBhZ2UgPSBwRXJhc2VJbml0LT5QYWdlOworCisgICAgICAvKkVyYXNlIDFzdCBwYWdlIGFuZCB3YWl0IGZvciBJVCAqLworICAgICAgRkxBU0hfUGFnZUVyYXNlKHBFcmFzZUluaXQtPlBhZ2UpOworICAgIH0KKyAgfQorCisgIC8qIHJldHVybiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtIE9wdGlvbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPQkluaXQgUG9pbnRlciB0byBhbiBAcmVmIEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIGFueSBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlCisgICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgQHJlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uCisgICogQG5vdGUgICBOZXcgb3B0aW9uIGJ5dGVzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgb25seQorICAqICAgICAgICAgLSBhZnRlciBhbiBvcHRpb24gYnl0ZXMgbGF1bmNoIHRocm91Z2ggdGhlIGNhbGwgb2YgQHJlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkKKyAgKiAgICAgICAgIC0gYSBQb3dlciBPbiBSZXNldAorICAqICAgICAgICAgLSBhbiBleGl0IGZyb20gU3RhbmRieSBvciBTaHV0ZG93biBtb2RlLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KQoreworICB1aW50MzJfdCBvcHRyOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09QVElPTkJZVEUocE9CSW5pdC0+T3B0aW9uVHlwZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soJnBGbGFzaCk7CisKKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIFdyaXRlIHByb3RlY3Rpb24gY29uZmlndXJhdGlvbiAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1dSUCkgIT0gMHgwMFUpCisgIHsKKyAgICAvKiBDb25maWd1cmUgb2YgV3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgYXJlYSAqLworICAgIEZMQVNIX09CX1dSUENvbmZpZyhwT0JJbml0LT5XUlBBcmVhLCBwT0JJbml0LT5XUlBTdGFydE9mZnNldCwgcE9CSW5pdC0+V1JQRW5kT2Zmc2V0KTsKKyAgfQorCisgIC8qIE9wdGlvbiByZWdpc3RlciAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiAoT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIpKSA9PSAoT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIpKQorICB7CisgICAgLyogRnVsbHkgbW9kaWZ5IE9QVFIgcmVnaXN0ZXIgd2l0aCBSRFAgJiB1c2VyIGRhdGFzICovCisgICAgRkxBU0hfT0JfT3B0ckNvbmZpZyhwT0JJbml0LT5VU0VSVHlwZSwgcE9CSW5pdC0+VVNFUkNvbmZpZywgcE9CSW5pdC0+UkRQTGV2ZWwpOworICB9CisgIGVsc2UgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9SRFApICE9IDB4MDBVKQorICB7CisgICAgLyogT25seSBtb2RpZnkgUkRQIHNvIGdldCBjdXJyZW50IHVzZXIgZGF0YSAqLworICAgIG9wdHIgPSBGTEFTSF9PQl9HZXRVc2VyKCk7CisgICAgRkxBU0hfT0JfT3B0ckNvbmZpZyhvcHRyLCBvcHRyLCBwT0JJbml0LT5SRFBMZXZlbCk7CisgIH0KKyAgZWxzZSBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX1VTRVIpICE9IDB4MDBVKQorICB7CisgICAgLyogT25seSBtb2RpZnkgdXNlciBzbyBnZXQgY3VycmVudCBSRFAgbGV2ZWwgKi8KKyAgICBvcHRyID0gRkxBU0hfT0JfR2V0UkRQKCk7CisgICAgRkxBU0hfT0JfT3B0ckNvbmZpZyhwT0JJbml0LT5VU0VSVHlwZSwgcE9CSW5pdC0+VVNFUkNvbmZpZywgb3B0cik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisgIC8qIFBDUk9QIENvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9QQ1JPUCkgIT0gMHgwMFUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19PQl9QQ1JPUF9DT05GSUcocE9CSW5pdC0+UENST1BDb25maWcpKTsKKworICAgIGlmICgocE9CSW5pdC0+UENST1BDb25maWcgJiAoT0JfUENST1BfWk9ORV9BIHwgT0JfUENST1BfUkRQX0VSQVNFKSkgIT0gMHgwMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSAxQSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiAqLworICAgICAgRkxBU0hfT0JfUENST1AxQUNvbmZpZyhwT0JJbml0LT5QQ1JPUENvbmZpZywgcE9CSW5pdC0+UENST1AxQVN0YXJ0QWRkciwgcE9CSW5pdC0+UENST1AxQUVuZEFkZHIpOworICAgIH0KKworICAgIGlmICgocE9CSW5pdC0+UENST1BDb25maWcgJiBPQl9QQ1JPUF9aT05FX0IpICE9IDB4MDBVKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgMUIgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8KKyAgICAgIEZMQVNIX09CX1BDUk9QMUJDb25maWcocE9CSW5pdC0+UENST1AxQlN0YXJ0QWRkciwgcE9CSW5pdC0+UENST1AxQkVuZEFkZHIpOworICAgIH0KKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChGTEFTSF9TRUNVUkFCTEVfTUVNT1JZX1NVUFBPUlQpCisgIC8qIFNlY3VyYWJsZSBNZW1vcnkgQXJlYSBDb25maWd1cmF0aW9uICovCisgIGlmICgocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfU0VDKSAhPSAweDAwVSkKKyAgeworICAgIC8qIENvbmZpZ3VyZSB0aGUgc2VjdXJhYmxlIG1lbW9yeSBhcmVhIHByb3RlY3Rpb24gKi8KKyAgICBGTEFTSF9PQl9TZWNNZW1Db25maWcocE9CSW5pdC0+Qm9vdEVudHJ5UG9pbnQsIHBPQkluaXQtPlNlY1NpemUpOworICB9CisjZW5kaWYKKworICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8KKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICAgIC8qIElmIHRoZSBvcHRpb24gYnl0ZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIE9QVFNUUlQgQml0ICovCisgICAgQ0xFQVJfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKworICAvKiByZXR1cm4gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBPcHRpb24gYnl0ZXMgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIHdhcm5pbmc6IHRoaXMgQVBJIG9ubHkgcmVhZCBmbGFzaCByZWdpc3RlciwgaXQgZG9lcyBub3QgcmVmbGVjdCBhbnkKKyAgKiAgICAgICAgIGNoYW5nZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwcm9ncmFtbWVkIGJldHdlZW4gcHJldmlvdXMgT3B0aW9uIGJ5dGUKKyAgKiAgICAgICAgIGxvYWRpbmcgYW5kIGN1cnJlbnQgY2FsbC4KKyAgKiBAcGFyYW0gIHBPQkluaXQgUG9pbnRlciB0byBhbiBAcmVmIEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZQorICAqICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gVGhlIGZpZWxkcyBwT0JJbml0LT5XUlBBcmVhIGFuZAorICAqICAgICAgICAgICAgICAgICAgcE9CSW5pdC0+UENST1BDb25maWcgc2hvdWxkIGluZGljYXRlIHdoaWNoIGFyZWEgaXMgcmVxdWVzdGVkCisgICogICAgICAgICAgICAgICAgICBmb3IgdGhlIFdSUCBhbmQgUENST1AuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KQoreworICBwT0JJbml0LT5PcHRpb25UeXBlID0gT1BUSU9OQllURV9BTEw7CisKKyAgLyogR2V0IHdyaXRlIHByb3RlY3Rpb24gb24gdGhlIHNlbGVjdGVkIGFyZWEgKi8KKyAgRkxBU0hfT0JfR2V0V1JQKHBPQkluaXQtPldSUEFyZWEsICYocE9CSW5pdC0+V1JQU3RhcnRPZmZzZXQpLCAmKHBPQkluaXQtPldSUEVuZE9mZnNldCkpOworCisgIC8qIEdldCBSZWFkIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgcE9CSW5pdC0+UkRQTGV2ZWwgPSBGTEFTSF9PQl9HZXRSRFAoKTsKKworICAvKiBHZXQgdGhlIHVzZXIgb3B0aW9uIGJ5dGVzICovCisgIHBPQkluaXQtPlVTRVJDb25maWcgPSBGTEFTSF9PQl9HZXRVc2VyKCk7CisgIHBPQkluaXQtPlVTRVJUeXBlID0gT0JfVVNFUl9BTEw7CisKKyNpZiBkZWZpbmVkKEZMQVNIX1BDUk9QX1NVUFBPUlQpCisgIC8qIEdldCB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gKi8KKyAgRkxBU0hfT0JfR2V0UENST1AxQSgmKHBPQkluaXQtPlBDUk9QQ29uZmlnKSwgJihwT0JJbml0LT5QQ1JPUDFBU3RhcnRBZGRyKSwgJihwT0JJbml0LT5QQ1JPUDFBRW5kQWRkcikpOworICBGTEFTSF9PQl9HZXRQQ1JPUDFCKCYocE9CSW5pdC0+UENST1AxQlN0YXJ0QWRkciksICYocE9CSW5pdC0+UENST1AxQkVuZEFkZHIpKTsKKyAgcE9CSW5pdC0+UENST1BDb25maWcgfD0gKE9CX1BDUk9QX1pPTkVfQSB8IE9CX1BDUk9QX1pPTkVfQik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorICAvKiBHZXQgdGhlIFNlY3VyYWJsZSBNZW1vcnkgQXJlYSBwcm90ZWN0aW9uICovCisgIEZMQVNIX09CX0dldFNlY01lbSgmKHBPQkluaXQtPkJvb3RFbnRyeVBvaW50KSwgJihwT0JJbml0LT5TZWNTaXplKSk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoRkxBU0hfQUNSX0RCR19TV0VOKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgRGVidWdnZXIuCisgICogQG5vdGUgICBBZnRlciBjYWxsaW5nIHRoaXMgQVBJLCBmbGFzaCBpbnRlcmZhY2UgYWxsb3cgZGVidWdnZXIgaW50cnVzaW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9FbmFibGVEZWJ1Z2dlcih2b2lkKQoreworICBGTEFTSC0+QUNSIHw9IEZMQVNIX0FDUl9EQkdfU1dFTjsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRGVidWdnZXIuCisgICogQG5vdGUgICBBZnRlciBjYWxsaW5nIHRoaXMgQVBJLCBEZWJ1Z2dlciBpcyBkaXNhYmxlZDogaXQgaXMgbm8gbW9yZSBwb3NzaWJsZSB0bworICAqICAgICAgICAgYnJlYWssIHNlZSBDUFUgcmVnaXN0ZXIsIGV0Yy4uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9EaXNhYmxlRGVidWdnZXIodm9pZCkKK3sKKyAgRkxBU0gtPkFDUiAmPSB+RkxBU0hfQUNSX0RCR19TV0VOOworfQorI2VuZGlmIC8qIEZMQVNIX0FDUl9EQkdfU1dFTiAqLworCisvKioKKyAgKiBAYnJpZWYgIEZsYXNoIEVtcHkgY2hlY2sKKyAgKiBAbm90ZSAgIFRoaXMgQVBJIGNoZWNrcyBpZiBmaXJzdCBsb2NhdGlvbiBpbiBGbGFzaCBpcyBwcm9ncmFtbWVkIG9yIG5vdC4KKyAgKiAgICAgICAgIFRoaXMgY2hlY2sgaXMgZG9uZSBvbmNlIGJ5IE9wdGlvbiBCeXRlIExvYWRlci4KKyAgKiBAcmV0dmFsIDAgaWYgMXN0IGxvY2F0aW9uIGlzIG5vdCBwcm9ncmFtbWVkIGVsc2UKKyAgKi8KK3VpbnQzMl90IEhBTF9GTEFTSEV4X0ZsYXNoRW1wdHlDaGVjayh2b2lkKQoreworICByZXR1cm4gKChGTEFTSC0+QUNSICYgRkxBU0hfQUNSX1BST0dFTVBUWSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgRW1wdHkgY2hlY2sgdmFsdWUuCisgICogQG5vdGUgICBBbGxvd3MgdG8gbW9kaWZ5IHByb2dyYW0gZW1wdHkgY2hlY2sgdmFsdWUgaW4gb3JkZXIgdG8gZm9yY2UgdGhpcworICAqICAgICAgICAgaW5mcm1hdGlvbiBpbiBGbGFzaCBJbnRlcmZhY2UsIGZvciBhbGwgbmV4dCByZXNldCB0aGF0IGRvIG5vdCBsYXVuY2gKKyAgKiAgICAgICAgIE9wdGlvbiBCeXRlIExvYWRlci4KKyAgKiBAcGFyYW0gIEZsYXNoRW1wdHkgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTEFTSEV4X0VtcHR5X0NoZWNrCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSEV4X0ZvcmNlRmxhc2hFbXB0eSh1aW50MzJfdCBGbGFzaEVtcHR5KQoreworICB1aW50MzJfdCBhY3I7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9FTVBUWV9DSEVDSyhGbGFzaEVtcHR5KSk7CisKKyAgYWNyID0gKEZMQVNILT5BQ1IgJiB+RkxBU0hfQUNSX1BST0dFTVBUWSk7CisgIEZMQVNILT5BQ1IgPSAoYWNyIHwgRmxhc2hFbXB0eSk7Cit9CisKKworI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBTZWN1cmFibGUgbWVtb3J5IGFyZWEgcHJvdGVjdGlvbiBlbmFibGUKKyAgKiBAcGFyYW0gIEJhbmsgU2VsZWN0IEJhbmsgdG8gYmUgc2VjdXJlZC4gT24gRzAsIHRoZXJlIGlzIG9ubHkgMSBiYW5rIHNvCisgICogICAgICAgICBwYXJhbWV0ZXIgaGFzIHRvIGJlIHNldCB0byAwLgorICAqIEBub3RlICAgVGhpcyBBUEkgbG9ja3MgU2VjdXJhYmxlIG1lbW9yeSBhcmVhIHdoaWNoIGlzIGRlZmluZWQgaW4gU0VDX1NJWkUgb3B0aW9uIGJ5dGUKKyAgKiAgICAgICAgICh0aGF0IGNhbiBiZSByZXRyaWV2ZWQgY2FsbGluZyBIQUxfRkxBU0hFeF9PQkdldENvbmZpZyBBUEkgYW5kIGNoZWNraW5nCisgICogICAgICAgICBTZWNzaXplKS4KKyAgKiBAbm90ZSAgIFNFQ19QUk9UIGJpdCBjYW4gb25seSBiZSBzZXQsIGl0IHdpbGwgYmUgcmVzZXQgYnkgc3lzdGVtIHJlc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9FbmFibGVTZWNNZW1Qcm90ZWN0aW9uKHVpbnQzMl90IEJhbmspCit7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9CQU5LKEJhbmspKTsKKyAgRkxBU0gtPkNSIHw9IEZMQVNIX0NSX1NFQ19QUk9UOworfQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hc3MgZXJhc2Ugb2YgRkxBU0ggbWVtb3J5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfTWFzc0VyYXNlKHZvaWQpCit7CisgIC8qIFNldCB0aGUgTWFzcyBFcmFzZSBCaXQgYW5kIHN0YXJ0IGJpdCAqLworICBGTEFTSC0+Q1IgfD0gKEZMQVNIX0NSX1NUUlQgfCBGTEFTSF9DUl9NRVIxKTsKK30KKworLyoqCisgICogQGJyaWVmICBFcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlLgorICAqIEBwYXJhbSAgUGFnZSBGTEFTSCBwYWdlIHRvIGVyYXNlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcyBpbiBGbGFzaCAtIDEpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEZMQVNIX1BhZ2VFcmFzZSh1aW50MzJfdCBQYWdlKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1BBR0UoUGFnZSkpOworCisgIC8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLCB0aGVuIGNsZWFyIHBhZ2UgbnVtYmVyICovCisgIHRtcCA9IChGTEFTSC0+Q1IgJiB+RkxBU0hfQ1JfUE5CKTsKKworICAvKiBTZXQgcGFnZSBudW1iZXIsIFBhZ2UgRXJhc2UgYml0ICYgU3RhcnQgYml0ICovCisgIEZMQVNILT5DUiA9ICh0bXAgfCAoRkxBU0hfQ1JfU1RSVCB8IChQYWdlIDw8ICBGTEFTSF9DUl9QTkJfUG9zKSB8IEZMQVNIX0NSX1BFUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgRkxBU0hfRmx1c2hDYWNoZXModm9pZCkKK3sKKyAgLyogRmx1c2ggaW5zdHJ1Y3Rpb24gY2FjaGUgICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTikgIT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIGluc3RydWN0aW9uIGNhY2hlICAqLworICAgIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX0RJU0FCTEUoKTsKKyAgICAvKiBSZXNldCBpbnN0cnVjdGlvbiBjYWNoZSAqLworICAgIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX1JFU0VUKCk7CisgICAgLyogRW5hYmxlIGluc3RydWN0aW9uIGNhY2hlICovCisgICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFKCk7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgZGVzaXJlZCBwYWdlcy4KKyAgKiBAbm90ZSAgIFdoZW4gV1JQIGlzIGFjdGl2ZSBpbiBhIHpvbmUsIGl0IGNhbm5vdCBiZSBlcmFzZWQgb3IgcHJvZ3JhbW1lZC4KKyAgKiAgICAgICAgIENvbnNlcXVlbnRseSwgYSBzb2Z0d2FyZSBtYXNzIGVyYXNlIGNhbm5vdCBiZSBwZXJmb3JtZWQgaWYgb25lIHpvbmUKKyAgKiAgICAgICAgIGlzIHdyaXRlLXByb3RlY3RlZC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIG1lbW9yeSByZWFkIHByb3RlY3Rpb24gbGV2ZWwgaXMgc2VsZWN0ZWQgKFJEUCBsZXZlbCA9IDEpLAorICAqICAgICAgICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2dyYW0gb3IgZXJhc2UgRmxhc2ggbWVtb3J5IGlmIHRoZSBDUFUgZGVidWcKKyAgKiAgICAgICAgIGZlYXR1cmVzIGFyZSBjb25uZWN0ZWQgKEpUQUcgb3Igc2luZ2xlIHdpcmUpIG9yIGJvb3QgY29kZSBpcyBiZWluZworICAqICAgICAgICAgZXhlY3V0ZWQgZnJvbSBSQU0gb3IgU3lzdGVtIGZsYXNoLCBldmVuIGlmIFdSUCBpcyBub3QgYWN0aXZhdGVkLgorICAqIEBwYXJhbSAgV1JQQXJlYSAgU3BlY2lmaWVzIHRoZSBhcmVhIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyAgQHJlZiBPQl9XUlBBUkVBX1pPTkVfQSBGbGFzaCBab25lIEEKKyAgKiAgICAgICAgICAgIEBhcmcgIEByZWYgT0JfV1JQQVJFQV9aT05FX0IgRmxhc2ggWm9uZSBCCisgICogQHBhcmFtICBXUlBTdGFydE9mZnNldCAgU3BlY2lmaWVzIHRoZSBzdGFydCBwYWdlIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHBhZ2UgbnVtYmVyIGJldHdlZW4gMCBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIEZsYXNoIC0gMSkKKyAgKiBAcGFyYW0gIFdSRFBFbmRPZmZzZXQgIFNwZWNpZmllcyB0aGUgZW5kIHBhZ2Ugb2YgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgcGFnZSBudW1iZXIgYmV0d2VlbiBXUlBTdGFydE9mZnNldCBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIEZsYXNoIC0gMSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX1dSUENvbmZpZyh1aW50MzJfdCBXUlBBcmVhLCB1aW50MzJfdCBXUlBTdGFydE9mZnNldCwgdWludDMyX3QgV1JEUEVuZE9mZnNldCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1dSUEFSRUEoV1JQQXJlYSkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShXUlBTdGFydE9mZnNldCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShXUkRQRW5kT2Zmc2V0KSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYSAqLworICBpZiAoV1JQQXJlYSAhPSBPQl9XUlBBUkVBX1pPTkVfQSkKKyAgeworICAgIEZMQVNILT5XUlAxQlIgPSAoKFdSRFBFbmRPZmZzZXQgPDwgRkxBU0hfV1JQMUFSX1dSUDFBX0VORF9Qb3MpIHwgV1JQU3RhcnRPZmZzZXQpOworICB9CisgIGVsc2UKKyAgeworICAgIEZMQVNILT5XUlAxQVIgPSAoKFdSRFBFbmRPZmZzZXQgPDwgRkxBU0hfV1JQMUJSX1dSUDFCX0VORF9Qb3MpIHwgV1JQU3RhcnRPZmZzZXQpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHVzZXIgJiBSRFAgY29uZmlndXJhdGlvbgorICAqIEBub3RlICAgISEhIFdhcm5pbmcgOiBXaGVuIGVuYWJsaW5nIE9CX1JEUCBsZXZlbCAyIGl0IGlzIG5vIG1vcmUgcG9zc2libGUKKyAgKiAgICAgICAgIHRvIGdvIGJhY2sgdG8gbGV2ZWwgMSBvciAwICEhIQorICAqIEBwYXJhbSAgVXNlclR5cGUgIFRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlcyB0byBiZSBtb2RpZmllZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRkxBU0hfT0JfVVNFUl9UeXBlCisgICogQHBhcmFtICBVc2VyQ29uZmlnICBUaGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZXMgdmFsdWVzLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2Y6CisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9CT1JfRU5BQkxFKCopLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfQk9SX0xFVkVMKCopLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfUkVTRVRfQ09ORklHKCopLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfblJTVF9TVE9QLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfblJTVF9TVEFOREJZLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfblJTVF9TSFVURE9XTigqKSwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1csCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NUT1AsCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlksCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9XV0RHX1NXLAorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX09CX1VTRVJfU1JBTV9QQVJJVFksCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVF9TRUwsCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVDEsCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVDAsCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfT0JfVVNFUl9JTlBVVF9SRVNFVF9IT0xERVIoKikKKyAgKiBAcGFyYW0gIFJEUExldmVsICBzcGVjaWZpZXMgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzAgTm8gcHJvdGVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8xIE1lbW9yeSBSZWFkIHByb3RlY3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMiBGdWxsIGNoaXAgcHJvdGVjdGlvbgorICAqIEBub3RlICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfT3B0ckNvbmZpZyh1aW50MzJfdCBVc2VyVHlwZSwgdWludDMyX3QgVXNlckNvbmZpZywgdWludDMyX3QgUkRQTGV2ZWwpCit7CisgIHVpbnQzMl90IG9wdHI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfVFlQRShVc2VyVHlwZSkpOworICBhc3NlcnRfcGFyYW0oSVNfT0JfVVNFUl9DT05GSUcoVXNlclR5cGUsIFVzZXJDb25maWcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1JEUF9MRVZFTChSRFBMZXZlbCkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgUkRQIGxldmVsIGluIHRoZSBvcHRpb24gYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgb3B0ciA9IEZMQVNILT5PUFRSOworICBvcHRyICY9IH4oVXNlclR5cGUgfCBGTEFTSF9PUFRSX1JEUCk7CisgIEZMQVNILT5PUFRSID0gKG9wdHIgfCBVc2VyQ29uZmlnIHwgUkRQTGV2ZWwpOworfQorCisjaWYgZGVmaW5lZChGTEFTSF9QQ1JPUF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIDFBIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uICYgZXJhc2UgY29uZmlndXJhdGlvbiBvbiBSRFAgcmVncmVzc2lvbi4KKyAgKiBAbm90ZSAgIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsaWduIFBDUk9QIHpvbmUgd2l0aCBwYWdlIGdyYW51bGFyaXR5IHdoZW4gdXNpbmcgUENST1BfUkRQIG9yIGF2b2lkCisgICogICAgICAgICBoYXZpbmcgc29tZSBleGVjdXRhYmxlIGNvZGUgaW4gYSBwYWdlIHdoZXJlIFBDUk9QIHpvbmUgc3RhcnRzIG9yIGVuZHMuCisgICogQG5vdGUgICBNaW5pbXVtIFBDUk9QIGFyZWEgc2l6ZSBpcyAyIHRpbWVzIHRoZSBjaG9zZW4gZ3JhbnVsYXJpdHk6IFBDUk9QQV9TVFJUIGFuZCBQQ1JPUEFfRU5ELgorICAqICAgICAgICAgU28gaWYgdGhlIHJlcXVpcmVtZW50IGlzIHRvIGJlIGFibGUgdG8gcmVhZC1wcm90ZWN0IDFLQiBhcmVhcywgdGhlIFJPUCBncmFudWxhcml0eQorICAqICAgICAgICAgaGFzIHRvIGJlIHNldCB0byA1MTIgQnl0ZXMKKyAgKiBAcGFyYW0gIFBDUk9QQ29uZmlnICBzcGVjaWZpZXMgdGhlIGVyYXNlIGNvbmZpZ3VyYXRpb24gKE9CX1BDUk9QX1JEUF9OT1RfRVJBU0Ugb3IgT0JfUENST1BfUkRQX0VSQVNFKQorICAqICAgICAgICAgb24gUkRQIGxldmVsIDEgcmVncmVzc2lvbi4KKyAgKiBAcGFyYW0gIFBDUk9QMUFTdGFydEFkZHIgU3BlY2lmaWVzIHRoZSBab25lIDFBIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGFkZHJlc3MgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIG9mIHRoZSBmbGFzaAorICAqIEBwYXJhbSAgUENST1AxQUVuZEFkZHIgU3BlY2lmaWVzIHRoZSBab25lIDFBIGVuZCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gUENST1AxQVN0YXJ0QWRkciBhbmQgZW5kIG9mIHRoZSBmbGFzaAorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfUENST1AxQUNvbmZpZyh1aW50MzJfdCBQQ1JPUENvbmZpZywgdWludDMyX3QgUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgUENST1AxQUVuZEFkZHIpCit7CisgIHVpbnQzMl90IHN0YXJ0b2Zmc2V0OworICB1aW50MzJfdCBlbmRvZmZzZXQ7CisgIHVpbnQzMl90IHBjcm9wMWFlbmQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1BDUk9QX0NPTkZJRyhQQ1JPUENvbmZpZykpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhQQ1JPUDFBU3RhcnRBZGRyKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKFBDUk9QMUFFbmRBZGRyKSk7CisKKyAgLyogZ2V0IHBjcm9wIDFBIGVuZCByZWdpc3RlciAqLworICBwY3JvcDFhZW5kID0gRkxBU0gtPlBDUk9QMUFFUjsKKworICAvKiBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uIG9mZnNldCAqLworICBpZiAoKFBDUk9QQ29uZmlnICYgT0JfUENST1BfWk9ORV9BKSAhPSAweDAwVSkKKyAgeworICAgIC8qIENvbXB1dGUgb2Zmc2V0IGRlcGVuZGluZyBvbiBwY3JvcCBncmFudWxhcml0eSAqLworICAgIHN0YXJ0b2Zmc2V0ID0gKChQQ1JPUDFBU3RhcnRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKTsKKyAgICBlbmRvZmZzZXQgPSAoKFBDUk9QMUFFbmRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKTsKKworICAgIC8qIFNldCBab25lIEEgc3RhcnQgb2Zmc2V0ICovCisgICAgRkxBU0gtPlBDUk9QMUFTUiA9IHN0YXJ0b2Zmc2V0OworCisgICAgLyogU2V0IFpvbmUgQSBlbmQgb2Zmc2V0ICovCisgICAgcGNyb3AxYWVuZCAmPSB+RkxBU0hfUENST1AxQUVSX1BDUk9QMUFfRU5EOworICAgIHBjcm9wMWFlbmQgfD0gZW5kb2Zmc2V0OworICB9CisKKyAgLyogU2V0IFJEUCBlcmFzZSBwcm90ZWN0aW9uIGlmIG5lZWRlZC4gVGhpcyBiaXQgaXMgb25seSBzZXQgJiB3aWxsIGJlIHJlc2V0IGJ5IG1hc3MgZXJhc2UgKi8KKyAgaWYgKChQQ1JPUENvbmZpZyAmIE9CX1BDUk9QX1JEUF9FUkFTRSkgIT0gMHgwMFUpCisgIHsKKyAgICBwY3JvcDFhZW5kIHw9IEZMQVNIX1BDUk9QMUFFUl9QQ1JPUF9SRFA7CisgIH0KKworICAvKiBzZXQgMUEgRW5kIHJlZ2lzdGVyICovCisgIEZMQVNILT5QQ1JPUDFBRVIgPSBwY3JvcDFhZW5kOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgMUIgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24uCisgICogQG5vdGUgICBJdCBpcyByZWNvbW1lbmRlZCB0byBhbGlnbiBQQ1JPUCB6b25lIHdpdGggcGFnZSBncmFudWxhcml0eSB3aGVuIHVzaW5nIFBDUk9QX1JEUCBvciBhdm9pZAorICAqICAgICAgICAgaGF2aW5nIHNvbWUgZXhlY3V0YWJsZSBjb2RlIGluIGEgcGFnZSB3aGVyZSBQQ1JPUCB6b25lIHN0YXJ0cyBvciBlbmRzLgorICAqIEBub3RlICAgTWluaW11bSBQQ1JPUCBhcmVhIHNpemUgaXMgMiB0aW1lcyB0aGUgY2hvc2VuIGdyYW51bGFyaXR5OiBQQ1JPUEFfU1RSVCBhbmQgUENST1BBX0VORC4KKyAgKiAgICAgICAgIFNvIGlmIHRoZSByZXF1aXJlbWVudCBpcyB0byBiZSBhYmxlIHRvIHJlYWQtcHJvdGVjdCAxS0IgYXJlYXMsIHRoZSBST1AgZ3JhbnVsYXJpdHkKKyAgKiAgICAgICAgIGhhcyB0byBiZSBzZXQgdG8gNTEyIEJ5dGVzCisgICogQHBhcmFtICBQQ1JPUDFCU3RhcnRBZGRyICBTcGVjaWZpZXMgdGhlIFpvbmUgMUIgU3RhcnQgYWRkcmVzcyBvZiB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBhZGRyZXNzIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBvZiB0aGUgZmxhc2gKKyAgKiBAcGFyYW0gIFBDUk9QMUJFbmRBZGRyICBTcGVjaWZpZXMgdGhlIFpvbmUgMUIgZW5kIGFkZHJlc3Mgb2YgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gYWRkcmVzcyBiZXR3ZWVuIFBDUk9QMUJTdGFydEFkZHIgYW5kIGVuZCBvZiB0aGUgZmxhc2gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX1BDUk9QMUJDb25maWcodWludDMyX3QgUENST1AxQlN0YXJ0QWRkciwgdWludDMyX3QgUENST1AxQkVuZEFkZHIpCit7CisgIHVpbnQzMl90IHN0YXJ0b2Zmc2V0OworICB1aW50MzJfdCBlbmRvZmZzZXQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoUENST1AxQlN0YXJ0QWRkcikpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfTUFJTl9NRU1fQUREUkVTUyhQQ1JPUDFCRW5kQWRkcikpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gb2Zmc2V0ICovCisgIHN0YXJ0b2Zmc2V0ID0gKChQQ1JPUDFCU3RhcnRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKTsKKyAgZW5kb2Zmc2V0ID0gKChQQ1JPUDFCRW5kQWRkciAtIEZMQVNIX0JBU0UpID4+IEZMQVNIX1BDUk9QX0dSQU5VTEFSSVRZX09GRlNFVCk7CisKKyAgLyogU2V0IFpvbmUgQiBzdGFydCBvZmZzZXQgKi8KKyAgRkxBU0gtPlBDUk9QMUJTUiA9IHN0YXJ0b2Zmc2V0OworICAvKiBTZXQgWm9uZSBCIGVuZCBvZmZzZXQgKi8KKyAgRkxBU0gtPlBDUk9QMUJFUiA9IGVuZG9mZnNldDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGTEFTSF9TRUNVUkFCTEVfTUVNT1JZX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBTZWN1cmFibGUgTWVtb3J5IGFyZWEgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIEJvb3RFbnRyeSAgc3BlY2lmaWVzIGlmIGJvb3Qgc2NoZW1lIGlzIGZvcmNlZCB0byBGbGFzaCAoU3lzdGVtIG9yIHVzZXIpIG9yIG5vdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1RfRU5UUllfRk9SQ0VEX05PTkUgTm8gYm9vdCBlbnRyeSBmb3JjZWQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1RfRU5UUllfRk9SQ0VEX0ZMQVNIIEZMYXNoIHNlbGVjdGVkIGFzIHVuaXF1ZSBlbnRyeSBib290CisgICogQHBhcmFtICBTZWNTaXplIHNwZWNpZmllcyBudW1iZXIgb2YgcGFnZXMgdG8gcHJvdGVjdCBhcyBzZWN1cmFibGUgbWVtb3J5IGFyZWEsIHN0YXJ0aW5nIGZyb20KKyAgKiAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgRmxhc2ggKHBhZ2UgMCkuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9TZWNNZW1Db25maWcodWludDMyX3QgQm9vdEVudHJ5LCB1aW50MzJfdCBTZWNTaXplKQoreworICB1aW50MzJfdCBzZWNtZW07CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1NFQ19CT09UX0xPQ0soQm9vdEVudHJ5KSk7CisgIGFzc2VydF9wYXJhbShJU19PQl9TRUNfU0laRShTZWNTaXplKSk7CisKKyAgLyogU2V0IHNlY3VyYWJsZSBtZW1vcnkgYXJlYSBjb25maWd1cmF0aW9uICovCisgIHNlY21lbSA9IChGTEFTSC0+U0VDUiAmIH4oRkxBU0hfU0VDUl9CT09UX0xPQ0sgfCBGTEFTSF9TRUNSX1NFQ19TSVpFKSk7CisgIEZMQVNILT5TRUNSID0gKHNlY21lbSB8IEJvb3RFbnRyeSB8IFNlY1NpemUpOworfQorI2VuZGlmCisKKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFdyaXRlIFByb3RlY3Rpb24gT3B0aW9uIEJ5dGVzIHZhbHVlLgorICAqIEBwYXJhbVtpbl0gIFdSUEFyZWEgU3BlY2lmaWVzIHRoZSBhcmVhIHRvIGJlIHJldHVybmVkLgorICAqICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgICBAYXJnIEByZWYgT0JfV1JQQVJFQV9aT05FX0EgRmxhc2ggWm9uZSBBCisgICogICAgICAgICAgICAgICBAYXJnIEByZWYgT0JfV1JQQVJFQV9aT05FX0IgRmxhc2ggWm9uZSBCCisgICogQHBhcmFtW291dF0gIFdSUFN0YXJ0T2Zmc2V0ICBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBzdGFydCBwYWdlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhCisgICogQHBhcmFtW291dF0gIFdSRFBFbmRPZmZzZXQgIERwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGVuZCBwYWdlIG9mCisgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX0dldFdSUCh1aW50MzJfdCBXUlBBcmVhLCB1aW50MzJfdCAqV1JQU3RhcnRPZmZzZXQsIHVpbnQzMl90ICpXUkRQRW5kT2Zmc2V0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfV1JQQVJFQShXUlBBcmVhKSk7CisKKyAgLyogR2V0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYSAqLworICBpZiAoV1JQQXJlYSA9PSBPQl9XUlBBUkVBX1pPTkVfQSkKKyAgeworICAgICpXUlBTdGFydE9mZnNldCA9IFJFQURfQklUKEZMQVNILT5XUlAxQVIsIEZMQVNIX1dSUDFBUl9XUlAxQV9TVFJUKTsKKyAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMUFSLCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSA+PiBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EX1Bvcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgKldSUFN0YXJ0T2Zmc2V0ID0gUkVBRF9CSVQoRkxBU0gtPldSUDFCUiwgRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQpOworICAgICpXUkRQRW5kT2Zmc2V0ID0gKFJFQURfQklUKEZMQVNILT5XUlAxQlIsIEZMQVNIX1dSUDFCUl9XUlAxQl9FTkQpID4+IEZMQVNIX1dSUDFCUl9XUlAxQl9FTkRfUG9zKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgRkxBU0ggUmVhZCBQcm90ZWN0aW9uIGxldmVsLgorICAqIEByZXR2YWwgRkxBU0ggUmVhZE91dCBQcm90ZWN0aW9uIFN0YXR1czoKKyAgKiAgICAgICAgIFRoaXMgcmV0dXJuIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzAgTm8gcHJvdGVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8xIFJlYWQgcHJvdGVjdGlvbiBvZiB0aGUgbWVtb3J5CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzIgRnVsbCBjaGlwIHByb3RlY3Rpb24KKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRSRFAodm9pZCkKK3sKKyAgdWludDMyX3QgcmRwbHZsID0gUkVBRF9CSVQoRkxBU0gtPk9QVFIsIEZMQVNIX09QVFJfUkRQKTsKKworICBpZiAoKHJkcGx2bCAhPSBPQl9SRFBfTEVWRUxfMCkgJiYgKHJkcGx2bCAhPSBPQl9SRFBfTEVWRUxfMikpCisgIHsKKyAgICByZXR1cm4gKE9CX1JEUF9MRVZFTF8xKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gcmRwbHZsOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBVc2VyIE9wdGlvbiBCeXRlIHZhbHVlLgorICAqIEByZXR2YWwgVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlcy4gSXQgd2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9CT1JfRU5BQkxFKCopLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0JPUl9MRVZFTCgqKSwKKyAgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9SRVNFVF9DT05GSUcoKiksCisgICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfblJTVF9TVE9QLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSwKKyAgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOKCopLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1csCisgICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVE9QLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lXREdfU1RBTkRCWSwKKyAgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9XV0RHX1NXLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX1NSQU1fUEFSSVRZLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UX1NFTCwKKyAgKiAgICAgICAgIEByZWYgRkxBU0hfT0JfVVNFUl9uQk9PVDEsCisgICogICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfbkJPT1QwLAorICAqICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX0lOUFVUX1JFU0VUX0hPTERFUigqKQorICAqIEBub3RlICAoKikgYXZhaWxhYmlsaXR5IGRlcGVuZHMgb24gZGV2aWNlcworICAqLworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFVzZXIodm9pZCkKK3sKKyAgdWludDMyX3QgdXNlciA9ICgoRkxBU0gtPk9QVFIgJiB+RkxBU0hfT1BUUl9SRFApICYgT0JfVVNFUl9BTEwpOworICByZXR1cm4gdXNlcjsKK30KKworI2lmIGRlZmluZWQoRkxBU0hfUENST1BfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBQQ1JPUCBQcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKiBAcGFyYW0gIFBDUk9QQ29uZmlnIFtvdXRdICBzcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgUENST1BfUkRQIG9wdGlvbi4KKyAgKiBAcGFyYW0gIFBDUk9QMUFTdGFydEFkZHIgW291dF0gIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIHN0YXJ0IGFkZHJlc3MKKyAgKiAgICAgICAgIG9mIHRoZSAxQSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUENST1AxQUVuZEFkZHIgW291dF0gIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGVuZCBhZGRyZXNzIG9mCisgICogICAgICAgICB0aGUgMUEgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX0dldFBDUk9QMUEodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUFFbmRBZGRyKQoreworICB1aW50MzJfdCBwY3JvcDsKKworICBwY3JvcCA9IChGTEFTSC0+UENST1AxQVNSICYgRkxBU0hfUENST1AxQVNSX1BDUk9QMUFfU1RSVCk7CisgICpQQ1JPUDFBU3RhcnRBZGRyID0gKHBjcm9wIDw8IEZMQVNIX1BDUk9QX0dSQU5VTEFSSVRZX09GRlNFVCk7CisgICpQQ1JPUDFBU3RhcnRBZGRyICs9IEZMQVNIX0JBU0U7CisKKyAgcGNyb3AgPSBGTEFTSC0+UENST1AxQUVSOworICAqUENST1AxQUVuZEFkZHIgPSAoKHBjcm9wICYgRkxBU0hfUENST1AxQUVSX1BDUk9QMUFfRU5EKSA8PCBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpOworICAqUENST1AxQUVuZEFkZHIgKz0gKEZMQVNIX0JBU0UgKyBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWSAtIDFVKTsKKworICAqUENST1BDb25maWcgJj0gfk9CX1BDUk9QX1JEUF9FUkFTRTsKKyAgKlBDUk9QQ29uZmlnIHw9IChwY3JvcCAmIEZMQVNIX1BDUk9QMUFFUl9QQ1JPUF9SRFApOworfQorCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBQQ1JPUCBQcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKiBAcGFyYW0gIFBDUk9QMUJTdGFydEFkZHIgW291dF0gIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIHN0YXJ0IGFkZHJlc3MKKyAgKiAgICAgICAgIG9mIHRoZSAxQiBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEBwYXJhbSAgUENST1AxQkVuZEFkZHIgW291dF0gIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGVuZCBhZGRyZXNzIG9mCisgICogICAgICAgICB0aGUgMUIgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX0dldFBDUk9QMUIodWludDMyX3QgKlBDUk9QMUJTdGFydEFkZHIsIHVpbnQzMl90ICpQQ1JPUDFCRW5kQWRkcikKK3sKKyAgdWludDMyX3QgcGNyb3A7CisKKyAgcGNyb3AgPSAoRkxBU0gtPlBDUk9QMUJTUiAmIEZMQVNIX1BDUk9QMUJTUl9QQ1JPUDFCX1NUUlQpOworICAqUENST1AxQlN0YXJ0QWRkciA9IChwY3JvcCA8PCBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpOworICAqUENST1AxQlN0YXJ0QWRkciArPSBGTEFTSF9CQVNFOworCisgIHBjcm9wID0gKEZMQVNILT5QQ1JPUDFCRVIgJiBGTEFTSF9QQ1JPUDFCRVJfUENST1AxQl9FTkQpOworICAqUENST1AxQkVuZEFkZHIgPSAocGNyb3AgPDwgRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKTsKKyAgKlBDUk9QMUJFbmRBZGRyICs9IChGTEFTSF9CQVNFICsgRkxBU0hfUENST1BfR1JBTlVMQVJJVFkgLSAxVSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRkxBU0hfU0VDVVJBQkxFX01FTU9SWV9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFNlY3VyYWJsZSBtZW1vcnkgYXJlYSBwcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKiBAcGFyYW0gIEJvb3RFbnRyeSAgc3BlY2lmaWVzIGJvb3Qgc2NoZW1lIGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFNlY1NpemUgc3BlY2lmaWVzIG51bWJlciBvZiBwYWdlcyB0byBwcm90ZWN0IGFzIHNlY3VyZSBtZW1vcnkgYXJlYSwgc3RhcnRpbmcgZnJvbQorICAqICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBGbGFzaCAocGFnZSAwKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX0dldFNlY01lbSh1aW50MzJfdCAqQm9vdEVudHJ5LCB1aW50MzJfdCAqU2VjU2l6ZSkKK3sKKyAgdWludDMyX3Qgc2VjbWVtID0gRkxBU0gtPlNFQ1I7CisKKyAgKkJvb3RFbnRyeSA9IChzZWNtZW0gJiBGTEFTSF9TRUNSX0JPT1RfTE9DSyk7CisgICpTZWNTaXplID0gKHNlY21lbSAmIEZMQVNIX1NFQ1JfU0VDX1NJWkUpOworfQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2dwaW8uYyBiL1NyYy9zdG0zMmcweHhfaGFsX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk5NGNkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfZ3Bpby5jCkBAIC0wLDAgKzEsNTU1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9ncGlvLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoR1BJTykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgR1BJTyBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVhY2ggcG9ydCBiaXQgb2YgdGhlIGdlbmVyYWwtcHVycG9zZSBJL08gKEdQSU8pIHBvcnRzIGNhbiBiZSBpbmRpdmlkdWFsbHkKKyAgICAgICAgY29uZmlndXJlZCBieSBzb2Z0d2FyZSBpbiBzZXZlcmFsIG1vZGVzOgorICAgICAgICAoKyspIElucHV0IG1vZGUKKyAgICAgICAgKCsrKSBBbmFsb2cgbW9kZQorICAgICAgICAoKyspIE91dHB1dCBtb2RlCisgICAgICAgICgrKykgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUKKyAgICAgICAgKCsrKSBFeHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbGluZXMKKworICAgICgrKSBEdXJpbmcgYW5kIGp1c3QgYWZ0ZXIgcmVzZXQsIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb25zIGFuZCBleHRlcm5hbCBpbnRlcnJ1cHQKKyAgICAgICAgbGluZXMgYXJlIG5vdCBhY3RpdmUgYW5kIHRoZSBJL08gcG9ydHMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZS4KKworICAgICgrKSBBbGwgR1BJTyBwaW5zIGhhdmUgd2VhayBpbnRlcm5hbCBwdWxsLXVwIGFuZCBwdWxsLWRvd24gcmVzaXN0b3JzLCB3aGljaCBjYW4gYmUKKyAgICAgICAgYWN0aXZhdGVkIG9yIG5vdC4KKworICAgICgrKSBJbiBPdXRwdXQgb3IgQWx0ZXJuYXRlIG1vZGUsIGVhY2ggSU8gY2FuIGJlIGNvbmZpZ3VyZWQgb24gb3Blbi1kcmFpbiBvciBwdXNoLXB1bGwKKyAgICAgICAgdHlwZSBhbmQgdGhlIElPIHNwZWVkIGNhbiBiZSBzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIFZERCB2YWx1ZS4KKworICAgICgrKSBUaGUgbWljcm9jb250cm9sbGVyIElPIHBpbnMgYXJlIGNvbm5lY3RlZCB0byBvbmJvYXJkIHBlcmlwaGVyYWxzL21vZHVsZXMgdGhyb3VnaCBhCisgICAgICAgIG11bHRpcGxleGVyIHRoYXQgYWxsb3dzIG9ubHkgb25lIHBlcmlwaGVyYWwgYWx0ZXJuYXRlIGZ1bmN0aW9uIChBRikgY29ubmVjdGVkCisgICAgICAgdG8gYW4gSU8gcGluIGF0IGEgdGltZS4gSW4gdGhpcyB3YXksIHRoZXJlIGNhbiBiZSBubyBjb25mbGljdCBiZXR3ZWVuIHBlcmlwaGVyYWxzCisgICAgICAgc2hhcmluZyB0aGUgc2FtZSBJTyBwaW4uCisKKyAgICAoKykgQWxsIHBvcnRzIGhhdmUgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGNhcGFiaWxpdHkuIFRvIHVzZSBleHRlcm5hbCBpbnRlcnJ1cHQKKyAgICAgICAgbGluZXMsIHRoZSBwb3J0IG11c3QgYmUgY29uZmlndXJlZCBpbiBpbnB1dCBtb2RlLiBBbGwgYXZhaWxhYmxlIEdQSU8gcGlucyBhcmUKKyAgICAgICAgY29ubmVjdGVkIHRvIHRoZSAxNiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbGluZXMgZnJvbSBFWFRJMCB0byBFWFRJMTUuCisKKyAgICAoKykgVGhlIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBjb250cm9sbGVyIGNvbnNpc3RzIG9mIHVwIHRvIDI4IGVkZ2UgZGV0ZWN0b3JzCisgICAgICAgICgxNiBsaW5lcyBhcmUgY29ubmVjdGVkIHRvIEdQSU8pIGZvciBnZW5lcmF0aW5nIGV2ZW50L2ludGVycnVwdCByZXF1ZXN0cyAoZWFjaAorICAgICAgICBpbnB1dCBsaW5lIGNhbiBiZSBpbmRlcGVuZGVudGx5IGNvbmZpZ3VyZWQgdG8gc2VsZWN0IHRoZSB0eXBlIChpbnRlcnJ1cHQgb3IgZXZlbnQpCisgICAgICAgIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4gRWFjaCBsaW5lIGNhbgorICAgICAgICBhbHNvIGJlIG1hc2tlZCBpbmRlcGVuZGVudGx5LgorCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCMpIEVuYWJsZSB0aGUgR1BJTyBBSEIgY2xvY2sgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjogX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4KKworICAgICgjKSBDb25maWd1cmUgdGhlIEdQSU8gcGluKHMpIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIElPIG1vZGUgdXNpbmcgIk1vZGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICAgICAgICgrKykgQWN0aXZhdGUgUHVsbC11cCwgUHVsbC1kb3duIHJlc2lzdG9yIHVzaW5nICJQdWxsIiBtZW1iZXIgZnJvbSBHUElPX0luaXRUeXBlRGVmCisgICAgICAgICAgICAgc3RydWN0dXJlLgorICAgICAgICAoKyspIEluIGNhc2Ugb2YgT3V0cHV0IG9yIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbjogdGhlIHNwZWVkIGlzCisgICAgICAgICAgICAgY29uZmlndXJlZCB0aHJvdWdoICJTcGVlZCIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgSW4gYWx0ZXJuYXRlIG1vZGUgaXMgc2VsZWN0aW9uLCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIGNvbm5lY3RlZCB0byB0aGUgSU8KKyAgICAgICAgICAgICBpcyBjb25maWd1cmVkIHRocm91Z2ggIkFsdGVybmF0ZSIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgQW5hbG9nIG1vZGUgaXMgcmVxdWlyZWQgd2hlbiBhIHBpbiBpcyB0byBiZSB1c2VkIGFzIEFEQyBjaGFubmVsCisgICAgICAgICAgICAgb3IgREFDIG91dHB1dC4KKyAgICAgICAgKCsrKSBJbiBjYXNlIG9mIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBzZWxlY3Rpb24gdGhlICJNb2RlIiBtZW1iZXIgZnJvbQorICAgICAgICAgICAgIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHNlbGVjdCB0aGUgdHlwZSAoaW50ZXJydXB0IG9yIGV2ZW50KSBhbmQKKyAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4KKworICAgICgjKSBJbiBjYXNlIG9mIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBtb2RlIHNlbGVjdGlvbiwgY29uZmlndXJlIE5WSUMgSVJRIHByaW9yaXR5CisgICAgICAgIG1hcHBlZCB0byB0aGUgRVhUSSBsaW5lIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIGVuYWJsZSBpdCB1c2luZworICAgICAgICBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKworICAgICgjKSBUbyBnZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZSB1c2UgSEFMX0dQSU9fUmVhZFBpbigpLgorCisgICAgKCMpIFRvIHNldC9yZXNldCB0aGUgbGV2ZWwgb2YgYSBwaW4gY29uZmlndXJlZCBpbiBvdXRwdXQgbW9kZSB1c2UKKyAgICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oKS9IQUxfR1BJT19Ub2dnbGVQaW4oKS4KKworICAgKCMpIFRvIGxvY2sgcGluIGNvbmZpZ3VyYXRpb24gdW50aWwgbmV4dCByZXNldCB1c2UgSEFMX0dQSU9fTG9ja1BpbigpLgorCisgICAgKCMpIER1cmluZyBhbmQganVzdCBhZnRlciByZXNldCwgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbnMgYXJlIG5vdAorICAgICAgICBhY3RpdmUgYW5kIHRoZSBHUElPIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZSAoZXhjZXB0IEpUQUcKKyAgICAgICAgcGlucykuCisKKyAgICAoIykgVGhlIExTRSBvc2NpbGxhdG9yIHBpbnMgT1NDMzJfSU4gYW5kIE9TQzMyX09VVCBjYW4gYmUgdXNlZCBhcyBnZW5lcmFsIHB1cnBvc2UKKyAgICAgICAgKFBDMTQgYW5kIFBDMTUsIHJlc3BlY3RpdmVseSkgd2hlbiB0aGUgTFNFIG9zY2lsbGF0b3IgaXMgb2ZmLiBUaGUgTFNFIGhhcworICAgICAgICBwcmlvcml0eSBvdmVyIHRoZSBHUElPIGZ1bmN0aW9uLgorCisgICAgKCMpIFRoZSBIU0Ugb3NjaWxsYXRvciBwaW5zIE9TQ19JTi9PU0NfT1VUIGNhbiBiZSB1c2VkIGFzCisgICAgICAgIGdlbmVyYWwgcHVycG9zZSBQRjAgYW5kIFBGMSwgcmVzcGVjdGl2ZWx5LCB3aGVuIHRoZSBIU0Ugb3NjaWxsYXRvciBpcyBvZmYuCisgICAgICAgIFRoZSBIU0UgaGFzIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU8KKyAgKiBAeworICAqLworLyoqIE1JU1JBIEM6MjAxMiBkZXZpYXRpb24gcnVsZSBoYXMgYmVlbiBncmFudGVkIGZvciBmb2xsb3dpbmcgcnVsZXM6CisgICogUnVsZS0xMi4yIC0gTWVkaXVtOiBSSFMgYXJndW1lbnQgaXMgaW4gaW50ZXJ2YWwgWzAsSU5GXSB3aGljaCBpcyBvdXQgb2YKKyAgKiByYW5nZSBvZiB0aGUgc2hpZnQgb3BlcmF0b3IgaW4gZm9sbG93aW5nIEFQSSA6CisgICogSEFMX0dQSU9fSW5pdAorICAqIEhBTF9HUElPX0RlSW5pdAorICAqLworCisjaWZkZWYgSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX1ByaXZhdGVfQ29uc3RhbnRzIEdQSU8gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBHUElPX01PREUgICAgICAgICAgICAgKDB4MDAwMDAwMDN1KQorI2RlZmluZSBFWFRJX01PREUgICAgICAgICAgICAgKDB4MTAwMDAwMDB1KQorI2RlZmluZSBHUElPX01PREVfSVQgICAgICAgICAgKDB4MDAwMTAwMDB1KQorI2RlZmluZSBHUElPX01PREVfRVZUICAgICAgICAgKDB4MDAwMjAwMDB1KQorI2RlZmluZSBSSVNJTkdfRURHRSAgICAgICAgICAgKDB4MDAxMDAwMDB1KQorI2RlZmluZSBGQUxMSU5HX0VER0UgICAgICAgICAgKDB4MDAyMDAwMDB1KQorI2RlZmluZSBHUElPX09VVFBVVF9UWVBFICAgICAgKDB4MDAwMDAwMTB1KQorCisjZGVmaW5lIEdQSU9fTlVNQkVSICAgICAgICAgICAoMTZ1KQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgR1BJT3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBHUElPX0luaXQuCisgICogQHBhcmFtICBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uRikgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyRzB4eCBmYW1pbHkKKyAgKiBAcGFyYW0gIEdQSU9fSW5pdCBwb2ludGVyIHRvIGEgR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgR1BJTyBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpCit7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMHU7CisgIHVpbnQzMl90IGlvY3VycmVudDsKKyAgdWludDMyX3QgdGVtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fSW5pdC0+UGluKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX01PREUoR1BJT19Jbml0LT5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BVTEwoR1BJT19Jbml0LT5QdWxsKSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgKi8KKyAgd2hpbGUgKCgoR1BJT19Jbml0LT5QaW4pID4+IHBvc2l0aW9uKSAhPSAweDAwdSkKKyAgeworICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovCisgICAgaW9jdXJyZW50ID0gKEdQSU9fSW5pdC0+UGluKSAmICgxdUwgPDwgcG9zaXRpb24pOworCisgICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkKKyAgICB7CisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgLyogSW4gY2FzZSBvZiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb24gKi8KKyAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9QUCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfT0QpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgQWx0ZXJuYXRlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUZfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUYoR1BJT19Jbml0LT5BbHRlcm5hdGUpKTsKKworICAgICAgICAvKiBDb25maWd1cmUgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1hcHBlZCB3aXRoIHRoZSBjdXJyZW50IElPICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDN1XTsKKyAgICAgICAgdGVtcCAmPSB+KDB4RnUgPDwgKChwb3NpdGlvbiAmIDB4MDd1KSAqIDR1KSk7CisgICAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPkFsdGVybmF0ZSkgPDwgKChwb3NpdGlvbiAmIDB4MDd1KSAqIDR1KSk7CisgICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM3VdID0gdGVtcDsKKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIElPIERpcmVjdGlvbiBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSAqLworICAgICAgdGVtcCA9IEdQSU94LT5NT0RFUjsKKyAgICAgIHRlbXAgJj0gfihHUElPX01PREVSX01PREUwIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAydSkpOworICAgICAgR1BJT3gtPk1PREVSID0gdGVtcDsKKworICAgICAgLyogSW4gY2FzZSBvZiBPdXRwdXQgb3IgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovCisgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfT1VUUFVUX1BQKSB8fCAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9QUCkgfHwKKyAgICAgICAgICAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9PVVRQVVRfT0QpIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX09EKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIFNwZWVkIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19TUEVFRChHUElPX0luaXQtPlNwZWVkKSk7CisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgSU8gU3BlZWQgKi8KKyAgICAgICAgdGVtcCA9IEdQSU94LT5PU1BFRURSOworICAgICAgICB0ZW1wICY9IH4oR1BJT19PU1BFRURSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMnUpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19Jbml0LT5TcGVlZCA8PCAocG9zaXRpb24gKiAydSkpOworICAgICAgICBHUElPeC0+T1NQRUVEUiA9IHRlbXA7CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBJTyBPdXRwdXQgVHlwZSAqLworICAgICAgICB0ZW1wID0gR1BJT3gtPk9UWVBFUjsKKyAgICAgICAgdGVtcCAmPSB+KEdQSU9fT1RZUEVSX09UMCA8PCBwb3NpdGlvbikgOworICAgICAgICB0ZW1wIHw9ICgoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fT1VUUFVUX1RZUEUpID4+IDR1KSA8PCBwb3NpdGlvbik7CisgICAgICAgIEdQSU94LT5PVFlQRVIgPSB0ZW1wOworICAgICAgfQorCisgICAgICAvKiBBY3RpdmF0ZSB0aGUgUHVsbC11cCBvciBQdWxsIGRvd24gcmVzaXN0b3IgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICB0ZW1wID0gR1BJT3gtPlBVUERSOworICAgICAgdGVtcCAmPSB+KEdQSU9fUFVQRFJfUFVQRDAgPDwgKHBvc2l0aW9uICogMnUpKTsKKyAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPlB1bGwpIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisgICAgICBHUElPeC0+UFVQRFIgPSB0ZW1wOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFWFRJIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgLyogQ29uZmlndXJlIHRoZSBFeHRlcm5hbCBJbnRlcnJ1cHQgb3IgZXZlbnQgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEVYVElfTU9ERSkgPT0gRVhUSV9NT0RFKQorICAgICAgeworICAgICAgICB0ZW1wID0gRVhUSS0+RVhUSUNSW3Bvc2l0aW9uID4+IDJ1XTsKKyAgICAgICAgdGVtcCAmPSB+KDB4MEZ1TCA8PCAoOHUgKiAocG9zaXRpb24gJiAweDAzdSkpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg4dSAqIChwb3NpdGlvbiAmIDB4MDN1KSkpOworICAgICAgICBFWFRJLT5FWFRJQ1JbcG9zaXRpb24gPj4gMnVdID0gdGVtcDsKKworICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+SU1SMTsKKyAgICAgICAgdGVtcCAmPSB+KGlvY3VycmVudCk7CisgICAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFX0lUKSA9PSBHUElPX01PREVfSVQpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wIHw9IGlvY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBFWFRJLT5JTVIxID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRVhUSS0+RU1SMTsKKyAgICAgICAgdGVtcCAmPSB+KGlvY3VycmVudCk7CisgICAgICAgIGlmICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFX0VWVCkgPT0gR1BJT19NT0RFX0VWVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkVNUjEgPSB0ZW1wOworCisgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+UlRTUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIFJJU0lOR19FREdFKSA9PSBSSVNJTkdfRURHRSkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPlJUU1IxID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRVhUSS0+RlRTUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZiAoKEdQSU9fSW5pdC0+TW9kZSAmIEZBTExJTkdfRURHRSkgPT0gRkFMTElOR19FREdFKQorICAgICAgICB7CisgICAgICAgICAgdGVtcCB8PSBpb2N1cnJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgRVhUSS0+RlRTUjEgPSB0ZW1wOworICAgICAgfQorICAgIH0KKworICAgIHBvc2l0aW9uKys7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBHUElPeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJHMHh4IGZhbWlseQorICAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1Bpbl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pCit7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMHU7CisgIHVpbnQzMl90IGlvY3VycmVudDsKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsKKworICAvKiBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAqLworICB3aGlsZSAoKEdQSU9fUGluID4+IHBvc2l0aW9uKSAhPSAweDAwdSkKKyAgeworICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovCisgICAgaW9jdXJyZW50ID0gKEdQSU9fUGluKSAmICgxdUwgPDwgcG9zaXRpb24pOworCisgICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkKKyAgICB7CisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhUSSBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgLyogQ2xlYXIgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBFdmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKworICAgICAgdG1wID0gRVhUSS0+RVhUSUNSW3Bvc2l0aW9uID4+IDJ1XTsKKyAgICAgIHRtcCAmPSAoMHgwRnVMIDw8ICg4dSAqIChwb3NpdGlvbiAmIDB4MDN1KSkpOworICAgICAgaWYgKHRtcCA9PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg4dSAqIChwb3NpdGlvbiAmIDB4MDN1KSkpKQorICAgICAgeworICAgICAgICB0bXAgPSAweDBGdUwgPDwgKDh1ICogKHBvc2l0aW9uICYgMHgwM3UpKTsKKyAgICAgICAgRVhUSS0+RVhUSUNSW3Bvc2l0aW9uID4+IDJ1XSAmPSB+dG1wOworCisgICAgICAgIC8qIENsZWFyIEVYVEkgbGluZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIEVYVEktPklNUjEgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBFWFRJLT5FTVIxICY9IH4oaW9jdXJyZW50KTsKKworICAgICAgICAvKiBDbGVhciBSaXNpbmcgRmFsbGluZyBlZGdlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgRVhUSS0+UlRTUjEgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBFWFRJLT5GVFNSMSAmPSB+KGlvY3VycmVudCk7CisgICAgICB9CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgSU8gaW4gQW5hbG9nIE1vZGUgKi8KKyAgICAgIEdQSU94LT5NT0RFUiB8PSAoR1BJT19NT0RFUl9NT0RFMCA8PCAocG9zaXRpb24gKiAydSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIGluIGN1cnJlbnQgSU8gKi8KKyAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM3VdICY9IH4oMHhGdSA8PCAoKHBvc2l0aW9uICYgMHgwN3UpICogNHUpKSA7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgSU8gU3BlZWQgKi8KKyAgICAgIEdQSU94LT5PU1BFRURSICY9IH4oR1BJT19PU1BFRURSX09TUEVFRDAgPDwgKHBvc2l0aW9uICogMnUpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIElPIE91dHB1dCBUeXBlICovCisgICAgICBHUElPeC0+T1RZUEVSICAmPSB+KEdQSU9fT1RZUEVSX09UMCA8PCBwb3NpdGlvbikgOworCisgICAgICAvKiBEZWFjdGl2YXRlIHRoZSBQdWxsLXVwIGFuZCBQdWxsLWRvd24gcmVzaXN0b3IgZm9yIHRoZSBjdXJyZW50IElPICovCisgICAgICBHUElPeC0+UFVQRFIgJj0gfihHUElPX1BVUERSX1BVUEQwIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisgICAgfQorCisgICAgcG9zaXRpb24rKzsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmIEdQSU8gUmVhZCwgV3JpdGUsIFRvZ2dsZSwgTG9jayBhbmQgRVhUSSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVhZCB0aGUgc3BlY2lmaWVkIGlucHV0IHBvcnQgcGluLgorICAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkYpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMkcweHggZmFtaWx5CisgICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIHJlYWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUGluX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KS4KKyAgKiBAcmV0dmFsIFRoZSBpbnB1dCBwb3J0IHBpbiB2YWx1ZS4KKyAgKi8KK0dQSU9fUGluU3RhdGUgSEFMX0dQSU9fUmVhZFBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgR1BJT19QaW5TdGF0ZSBiaXRzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgaWYgKChHUElPeC0+SURSICYgR1BJT19QaW4pICE9IDB4MDB1KQorICB7CisgICAgYml0c3RhdHVzID0gR1BJT19QSU5fU0VUOworICB9CisgIGVsc2UKKyAgeworICAgIGJpdHN0YXR1cyA9IEdQSU9fUElOX1JFU0VUOworICB9CisgIHJldHVybiBiaXRzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IG9yIGNsZWFyIHRoZSBzZWxlY3RlZCBkYXRhIHBvcnQgYml0LgorICAqCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHVzZXMgR1BJT3hfQlNSUiBhbmQgR1BJT3hfQlJSIHJlZ2lzdGVycyB0byBhbGxvdyBhdG9taWMgcmVhZC9tb2RpZnkKKyAgKiAgICAgICAgIGFjY2Vzc2VzLiBJbiB0aGlzIHdheSwgdGhlcmUgaXMgbm8gcmlzayBvZiBhbiBJUlEgb2NjdXJyaW5nIGJldHdlZW4KKyAgKiAgICAgICAgIHRoZSByZWFkIGFuZCB0aGUgbW9kaWZ5IGFjY2Vzcy4KKyAgKgorICAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkYpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMkcweHggZmFtaWx5CisgICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIGJlIHdyaXR0ZW4uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUGluX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KS4KKyAgKiBAcGFyYW0gIFBpblN0YXRlIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VsZWN0ZWQgYml0LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgR1BJT19QaW5TdGF0ZSBlbnVtIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgR1BJT19QSU5fUkVTRVQ6IHRvIGNsZWFyIHRoZSBwb3J0IHBpbgorICAqICAgICAgICAgICAgQGFyZyBHUElPX1BJTl9TRVQ6IHRvIHNldCB0aGUgcG9ydCBwaW4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0dQSU9fV3JpdGVQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDE2X3QgR1BJT19QaW4sIEdQSU9fUGluU3RhdGUgUGluU3RhdGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU5fQUNUSU9OKFBpblN0YXRlKSk7CisKKyAgaWYgKFBpblN0YXRlICE9IEdQSU9fUElOX1JFU0VUKQorICB7CisgICAgR1BJT3gtPkJTUlIgPSAodWludDMyX3QpR1BJT19QaW47CisgIH0KKyAgZWxzZQorICB7CisgICAgR1BJT3gtPkJSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRvZ2dsZSB0aGUgc3BlY2lmaWVkIEdQSU8gcGluLgorICAqIEBwYXJhbSAgR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkYpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMkcweHggZmFtaWx5CisgICogQHBhcmFtICBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBpbiB0byBiZSB0b2dnbGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1Bpbl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgaWYgKChHUElPeC0+T0RSICYgR1BJT19QaW4pICE9IDB4MDB1KQorICB7CisgICAgR1BJT3gtPkJSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBHUElPeC0+QlNSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorfQorCisvKioKKyogQGJyaWVmICBMb2NrIEdQSU8gUGlucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAbm90ZSAgIFRoZSBsb2NrZWQgcmVnaXN0ZXJzIGFyZSBHUElPeF9NT0RFUiwgR1BJT3hfT1RZUEVSLCBHUElPeF9PU1BFRURSLAorICAqICAgICAgICAgR1BJT3hfUFVQRFIsIEdQSU94X0FGUkwgYW5kIEdQSU94X0FGUkguCisgICogQG5vdGUgICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbG9ja2VkIEdQSU8gcGlucyBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkCisgICogICAgICAgICB1bnRpbCB0aGUgbmV4dCByZXNldC4KKyAgKiBAcGFyYW0gIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJHMHh4IGZhbWlseQorICAqIEBwYXJhbSAgR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdHMgdG8gYmUgbG9ja2VkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1Bpbl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfR1BJT19Mb2NrUGluKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKQoreworICBfX0lPIHVpbnQzMl90IHRtcCA9IEdQSU9fTENLUl9MQ0tLOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0xPQ0tfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgLyogQXBwbHkgbG9jayBrZXkgd3JpdGUgc2VxdWVuY2UgKi8KKyAgdG1wIHw9IEdQSU9fUGluOworICAvKiBTZXQgTENLeCBiaXQocyk6IExDS0s9JzEnICsgTENLWzE1LTBdICovCisgIEdQSU94LT5MQ0tSID0gdG1wOworICAvKiBSZXNldCBMQ0t4IGJpdChzKTogTENLSz0nMCcgKyBMQ0tbMTUtMF0gKi8KKyAgR1BJT3gtPkxDS1IgPSBHUElPX1BpbjsKKyAgLyogU2V0IExDS3ggYml0KHMpOiBMQ0tLPScxJyArIExDS1sxNS0wXSAqLworICBHUElPeC0+TENLUiA9IHRtcDsKKyAgLyogUmVhZCBMQ0tLIHJlZ2lzdGVyLiBUaGlzIHJlYWQgaXMgbWFuZGF0b3J5IHRvIGNvbXBsZXRlIGtleSBsb2NrIHNlcXVlbmNlICovCisgIHRtcCA9IEdQSU94LT5MQ0tSOworCisgIC8qIHJlYWQgYWdhaW4gaW4gb3JkZXIgdG8gY29uZmlybSBsb2NrIGlzIGFjdGl2ZSAqLworICBpZiAoKEdQSU94LT5MQ0tSICYgR1BJT19MQ0tSX0xDS0spICE9IDB4MDB1KQorICB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEVYVEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBvcnQgcGluIGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKQoreworICAvKiBFWFRJIGxpbmUgaW50ZXJydXB0IGRldGVjdGVkICovCisgIGlmIChfX0hBTF9HUElPX0VYVElfR0VUX1JJU0lOR19JVChHUElPX1BpbikgIT0gMHgwMHUpCisgIHsKKyAgICBfX0hBTF9HUElPX0VYVElfQ0xFQVJfUklTSU5HX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX1Jpc2luZ19DYWxsYmFjayhHUElPX1Bpbik7CisgIH0KKworICBpZiAoX19IQUxfR1BJT19FWFRJX0dFVF9GQUxMSU5HX0lUKEdQSU9fUGluKSAhPSAweDAwdSkKKyAgeworICAgIF9fSEFMX0dQSU9fRVhUSV9DTEVBUl9GQUxMSU5HX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX0ZhbGxpbmdfQ2FsbGJhY2soR1BJT19QaW4pOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRVhUSSBsaW5lIGRldGVjdGlvbiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIEdQSU9fUGluIFNwZWNpZmllcyB0aGUgcG9ydCBwaW4gY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0dQSU9fRVhUSV9SaXNpbmdfQ2FsbGJhY2sodWludDE2X3QgR1BJT19QaW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKEdQSU9fUGluKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9HUElPX0VYVElfUmlzaW5nX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRVhUSSBsaW5lIGRldGVjdGlvbiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIEdQSU9fUGluIFNwZWNpZmllcyB0aGUgcG9ydCBwaW4gY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0dQSU9fRVhUSV9GYWxsaW5nX0NhbGxiYWNrKHVpbnQxNl90IEdQSU9fUGluKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChHUElPX1Bpbik7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfR1BJT19FWFRJX0ZhbGxpbmdfQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9pMmMuYyBiL1NyYy9zdG0zMmcweHhfaGFsX2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2YzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9pMmMuYwpAQCAtMCwwICsxLDY1MDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2kyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJMkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSW50ZXIgSW50ZWdyYXRlZCBDaXJjdWl0IChJMkMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIEkyQyBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIEkyQ19IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlOgorICAgICAgICBJMkNfSGFuZGxlVHlwZURlZiAgaGkyYzsKKworICAgICgjKUluaXRpYWxpemUgdGhlIEkyQyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgQHJlZiBIQUxfSTJDX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBJMkN4IGludGVyZmFjZSBjbG9jaworICAgICAgICAoIyMpIEkyQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBJMkMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBJMkMgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gb3Blbi1kcmFpbgorICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgSTJDeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBJMkMgSVJRIENoYW5uZWwKKyAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUFfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBjaGFubmVsCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrIHVzaW5nCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHggb3IgUnggY2hhbm5lbAorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBoaTJjIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbgorICAgICAgICAgICAgICAgICAgdGhlIERNQSBUeCBvciBSeCBjaGFubmVsCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBDb21tdW5pY2F0aW9uIENsb2NrIFRpbWluZywgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLCBEdWFsIEFkZHJlc3NpbmcgbW9kZSwKKyAgICAgICAgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsIGFuZCBOb3N0cmV0Y2ggbW9kZSBpbiB0aGUgaGkyYyBJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJbml0aWFsaXplIHRoZSBJMkMgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEByZWYgSEFMX0kyQ19Jbml0KCksIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlCisgICAgICAgIChHUElPLCBDTE9DSywgTlZJQy4uLmV0YykgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBAcmVmIEhBTF9JMkNfTXNwSW5pdCgmaGkyYykgQVBJLgorCisgICAgKCMpIFRvIGNoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24sIHVzZSB0aGUgZnVuY3Rpb24gQHJlZiBIQUxfSTJDX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBJMkMgSU8gYW5kIElPIE1FTSBvcGVyYXRpb25zLCB0aHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorCisgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFRyYW5zbWl0IGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdCgpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZSgpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdCgpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmUoKQorCisgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgV3JpdGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nIEByZWYgSEFMX0kyQ19NZW1fV3JpdGUoKQorICAgICAgKCspIFJlYWQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcgQHJlZiBIQUxfSTJDX01lbV9SZWFkKCkKKworCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfSVQoKQorICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfSVQoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKykgQWJvcnQgYSBtYXN0ZXIgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdCB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgQHJlZiBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAoKykgRGlzY2FyZCBhIHNsYXZlIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gdXNpbmcgQHJlZiBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSygpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGFjdGlvbiB3aWxsIGluZm9ybSBNYXN0ZXIgdG8gZ2VuZXJhdGUgYSBTdG9wIGNvbmRpdGlvbiB0byBkaXNjYXJkIHRoZSBjb21tdW5pY2F0aW9uLgorCisKKyAgICAqKiogSW50ZXJydXB0IG1vZGUgb3IgRE1BIG1vZGUgSU8gc2VxdWVudGlhbCBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIChAKSBUaGVzZSBpbnRlcmZhY2VzIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbnRpYWwgdHJhbnNmZXIgd2l0aCBhIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbgorICAgICAgICAgIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAgIFsuLl0KKyAgICAgICgrKSBBIHNwZWNpZmljIG9wdGlvbiBmaWVsZCBtYW5hZ2UgdGhlIGRpZmZlcmVudCBzdGVwcyBvZiBhIHNlcXVlbnRpYWwgdHJhbnNmZXIKKyAgICAgICgrKSBPcHRpb24gZmllbGQgdmFsdWVzIGFyZSBkZWZpbmVkIHRocm91Z2ggQHJlZiBJMkNfWEZFUk9QVElPTlMgYW5kIGFyZSBsaXN0ZWQgYmVsb3c6CisgICAgICAoKyspIEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRTogTm8gc2VxdWVudGlhbCB1c2FnZSwgZnVuY3Rpb25uYWwgaXMgc2FtZSBhcyBhc3NvY2lhdGVkIGludGVyZmFjZXMgaW4gbm8gc2VxdWVudGlhbCBtb2RlCisgICAgICAoKyspIEkyQ19GSVJTVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWVuY2Ugd2l0aCBzdGFydCBjb25kaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGF0YSB0byB0cmFuc2ZlciB3aXRob3V0IGEgZmluYWwgc3RvcCBjb25kaXRpb24KKyAgICAgICgrKykgSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlIChNYXN0ZXIgb25seSksIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbmNlIHdpdGggc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRhdGEgdG8gdHJhbnNmZXIgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uLCBhbiB0aGVuIHBlcm1pdCBhIGNhbGwgdGhlIHNhbWUgbWFzdGVyIHNlcXVlbnRpYWwgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJhbCB0aW1lcyAobGlrZSBAcmVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVCgpIHRoZW4gQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpIHRoZW4gQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BKCkpCisgICAgICAoKyspIEkyQ19ORVhUX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW5jZSB3aXRoIGEgcmVzdGFydCBjb25kaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2l0aCBuZXcgZGF0YSB0byB0cmFuc2ZlciBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZSBvciBtYW5hZ2Ugb25seSB0aGUgbmV3IGRhdGEgdG8gdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBubyBkaXJlY3Rpb24gY2hhbmdlIGFuZCB3aXRob3V0IGEgZmluYWwgc3RvcCBjb25kaXRpb24gaW4gYm90aCBjYXNlcworICAgICAgKCsrKSBJMkNfTEFTVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWFuY2Ugd2l0aCBhIHJlc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpdGggbmV3IGRhdGEgdG8gdHJhbnNmZXIgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2Ugb3IgbWFuYWdlIG9ubHkgdGhlIG5ldyBkYXRhIHRvIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gZGlyZWN0aW9uIGNoYW5nZSBhbmQgd2l0aCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uIGluIGJvdGggY2FzZXMKKyAgICAgICgrKykgSTJDX0xBU1RfRlJBTUVfTk9fU1RPUDogU2VxdWVudGlhbCB1c2FnZSAoTWFzdGVyIG9ubHkpLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSByZXN0YXJ0IGNvbmRpdGlvbiBhZnRlciBzZXZlcmFsIGNhbGwgb2YgdGhlIHNhbWUgbWFzdGVyIHNlcXVlbnRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Ugc2V2ZXJhbCB0aW1lcyAobGluayB3aXRoIG9wdGlvbiBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlIGNhbiwgdHJhbnNmZXIgc2V2ZXJhbCBieXRlcyBvbmUgYnkgb25lIHVzaW5nIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FIHRoZW4gSTJDX05FWFRfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FIHRoZW4gSTJDX05FWFRfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BKG9wdGlvbiBJMkNfRklSU1RfQU5EX05FWFRfRlJBTUUgdGhlbiBJMkNfTkVYVF9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQShvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FIHRoZW4gSTJDX05FWFRfRlJBTUUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW4gdXNhZ2Ugb2YgdGhpcyBvcHRpb24gSTJDX0xBU1RfRlJBTUVfTk9fU1RPUCBhdCB0aGUgbGFzdCBUcmFuc21pdCBvciBSZWNlaXZlIHNlcXVlbmNlIHBlcm1pdCB0byBjYWxsIHRoZSBvcG9zaXRlIGludGVyZmFjZSBSZWNlaXZlIG9yIFRyYW5zbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHN0b3BwaW5nIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBzbyBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uLgorICAgICAgKCsrKSBJMkNfT1RIRVJfRlJBTUU6IFNlcXVlbnRpYWwgdXNhZ2UgKE1hc3RlciBvbmx5KSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgcmVzdGFydCBjb25kaXRpb24gYWZ0ZXIgZWFjaCBjYWxsIG9mIHRoZSBzYW1lIG1hc3RlciBzZXF1ZW50aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlIGNhbiwgdHJhbnNmZXIgc2V2ZXJhbCBieXRlcyBvbmUgYnkgb25lIHdpdGggYSByZXN0YXJ0IHdpdGggc2xhdmUgYWRkcmVzcyBiZXR3ZWVuIGVhY2ggYnl0ZXMgdXNpbmcgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKG9wdGlvbiBJMkNfRklSU1RfRlJBTUUgdGhlbiBJMkNfT1RIRVJfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQShvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfRE1BKG9wdGlvbiBJMkNfRklSU1RfRlJBTUUgdGhlbiBJMkNfT1RIRVJfRlJBTUUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW4gdXNhZ2Ugb2YgdGhpcyBvcHRpb24gSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FIGF0IHRoZSBsYXN0IGZyYW1lIHRvIGhlbHAgYXV0b21hdGljIGdlbmVyYXRpb24gb2YgU1RPUCBjb25kaXRpb24uCisKKyAgICAgICgrKSBEaWZmZXJlbnRzIHNlcXVlbnRpYWwgSTJDIGludGVyZmFjZXMgYXJlIGxpc3RlZCBiZWxvdzoKKyAgICAgICgrKykgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgb3IgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKyspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgY3VycmVudCBmcmFtZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKyspIFNlcXVlbnRpYWwgcmVjZWl2ZSBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVCgpCisgICAgICAgICAgICBvciB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQSgpCisgICAgICAoKysrKSBBdCByZWNlcHRpb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBBYm9ydCBhIG1hc3RlciBJVCBvciBETUEgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdCB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKyspIEVuZCBvZiBhYm9ydCBwcm9jZXNzLCBAcmVmIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgRW5hYmxlL2Rpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgaW4gc2xhdmUgSTJDIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX0VuYWJsZUxpc3Rlbl9JVCgpIEByZWYgSEFMX0kyQ19EaXNhYmxlTGlzdGVuX0lUKCkKKyAgICAgICgrKyspIFdoZW4gYWRkcmVzcyBzbGF2ZSBJMkMgbWF0Y2gsIEByZWYgSEFMX0kyQ19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3RlciAoV3JpdGUvUmVhZCkuCisgICAgICAoKysrKSBBdCBMaXN0ZW4gbW9kZSBlbmQgQHJlZiBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBzbGF2ZSBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgIG9yIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKyspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgY3VycmVudCBmcmFtZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gc2xhdmUgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUKCkKKyAgICAgICAgICAgIG9yIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEoKQorICAgICAgKCsrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBjdXJyZW50IGZyYW1lIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAoKyspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEByZWYgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKyAgICAgICgrKykgRGlzY2FyZCBhIHNsYXZlIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gdXNpbmcgQHJlZiBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSygpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGFjdGlvbiB3aWxsIGluZm9ybSBNYXN0ZXIgdG8gZ2VuZXJhdGUgYSBTdG9wIGNvbmRpdGlvbiB0byBkaXNjYXJkIHRoZSBjb21tdW5pY2F0aW9uLgorCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIE1FTSBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0IHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWVtX1dyaXRlX0lUKCkKKyAgICAgICgrKSBBdCBNZW1vcnkgZW5kIG9mIHdyaXRlIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWFkIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0IGZyb20gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcyB1c2luZworICAgICAgICAgIEByZWYgSEFMX0kyQ19NZW1fUmVhZF9JVCgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiByZWFkIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisKKyAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEByZWYgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlX0RNQSgpCisgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEByZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9ETUEoKQorICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZV9ETUEoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKykgQWJvcnQgYSBtYXN0ZXIgSTJDIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdCB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgQHJlZiBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAoKykgRGlzY2FyZCBhIHNsYXZlIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gdXNpbmcgQHJlZiBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSygpIG1hY3JvLgorICAgICAgICAgICBUaGlzIGFjdGlvbiB3aWxsIGluZm9ybSBNYXN0ZXIgdG8gZ2VuZXJhdGUgYSBTdG9wIGNvbmRpdGlvbiB0byBkaXNjYXJkIHRoZSBjb21tdW5pY2F0aW9uLgorCisgICAgKioqIERNQSBtb2RlIElPIE1FTSBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWVtX1dyaXRlX0RNQSgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiB3cml0ZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWVtX1JlYWRfRE1BKCkKKyAgICAgICgrKSBBdCBNZW1vcnkgZW5kIG9mIHJlYWQgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEByZWYgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKworCisgICAgICoqKiBJMkMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJMkMgSEFMIGRyaXZlci4KKworICAgICAgKCspIEByZWYgX19IQUxfSTJDX0VOQUJMRTogRW5hYmxlIHRoZSBJMkMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0RJU0FCTEU6IERpc2FibGUgdGhlIEkyQyBwZXJpcGhlcmFsCisgICAgICAoKykgQHJlZiBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSzogR2VuZXJhdGUgYSBOb24tQWNrbm93bGVkZ2UgSTJDIHBlcmlwaGVyYWwgaW4gU2xhdmUgbW9kZQorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0dFVF9GTEFHOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBzcGVjaWZpZWQgSTJDIHBlbmRpbmcgZmxhZworICAgICAgKCspIEByZWYgX19IQUxfSTJDX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdAorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBJMkMgaW50ZXJydXB0CisKKyAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0kyQ19SZWdpc3RlckNhbGxiYWNrKCkgb3IgQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQWRkckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKyAgICAgRnVuY3Rpb24gQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIE1lbVR4Q3BsdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1lbW9yeSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNZW1SeENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNZW1vcnkgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBhYm9ydCBjb21wbGV0aW9uIHByb2Nlc3MuCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgWy4uXQorICAgICBGb3Igc3BlY2lmaWMgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQWRkckNhbGxiYWNrKCkuCisgICAgWy4uXQorICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfSTJDX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgIEByZWYgSEFMX0kyQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBNYXN0ZXJUeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIFNsYXZlVHhDcGx0Q2FsbGJhY2sgIDogY2FsbGJhY2sgZm9yIFNsYXZlIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIFNsYXZlUnhDcGx0Q2FsbGJhY2sgIDogY2FsbGJhY2sgZm9yIFNsYXZlIHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIExpc3RlbkNwbHRDYWxsYmFjayAgIDogY2FsbGJhY2sgZm9yIGVuZCBvZiBsaXN0ZW4gbW9kZS4KKyAgICAgICAoKykgTWVtVHhDcGx0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTWVtb3J5IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1lbVJ4Q3BsdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1lbW9yeSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIGFib3J0IGNvbXBsZXRpb24gcHJvY2Vzcy4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgWy4uXQorICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfSTJDX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKS4KKyAgICBbLi5dCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBAcmVmIEhBTF9JMkNfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlcyBAcmVmIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0kyQ19Jbml0KCkvIEByZWYgSEFMX0kyQ19EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfSTJDX0luaXQoKS8gQHJlZiBIQUxfSTJDX0RlSW5pdCgpCisgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorICAgIFsuLl0KKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9JMkNfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgIGluIEByZWYgSEFMX0kyQ19TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9JMkNfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9JMkNfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfSTJDX0luaXQoKSBmdW5jdGlvbi4KKyAgICBbLi5dCisgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgSTJDIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQyBJMkMKKyAgKiBAYnJpZWYgSTJDIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRGVmaW5lIEkyQyBQcml2YXRlIERlZmluZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTUlOR19DTEVBUl9NQVNLICAgKDB4RjBGRkZGRkZVKSAgLyohPCBJMkMgVElNSU5HIGNsZWFyIHJlZ2lzdGVyIE1hc2sgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfQUREUiAgICAoMTAwMDBVKSAgICAgICAvKiE8IDEwIHMgICovCisjZGVmaW5lIEkyQ19USU1FT1VUX0JVU1kgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9ESVIgICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfUlhORSAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1NUT1BGICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9UQyAgICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfVENSICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1RYSVMgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9GTEFHICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKworI2RlZmluZSBNQVhfTkJZVEVfU0laRSAgICAgIDI1NVUKKyNkZWZpbmUgU2xhdmVBZGRyX1NISUZUICAgICA3VQorI2RlZmluZSBTbGF2ZUFkZHJfTVNLICAgICAgIDB4MDZVCisKKy8qIFByaXZhdGUgZGVmaW5lIGZvciBAcmVmIFByZXZpb3VzU3RhdGUgdXNhZ2UgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01TSyAgICAgICAgICAgICAoKHVpbnQzMl90KSgodWludDMyX3QpKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfVFggfCAodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1JYKSAmICh1aW50MzJfdCkofigodWludDMyX3QpSEFMX0kyQ19TVEFURV9SRUFEWSkpKSkgLyohPCBNYXNrIFN0YXRlIGRlZmluZSwga2VlcCBvbmx5IFJYIGFuZCBUWCBiaXRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX05PTkUgICAgICAgICAgICAoKHVpbnQzMl90KShIQUxfSTJDX01PREVfTk9ORSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1RYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX01BU1RFUikpICAgICAgICAgICAgLyohPCBNYXN0ZXIgQnVzeSBUWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9SWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9NQVNURVIpKSAgICAgICAgICAgIC8qITwgTWFzdGVyIEJ1c3kgUlgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9TTEFWRV9CVVNZX1RYICAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfVFggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfU0xBVkUpKSAgICAgICAgICAgICAvKiE8IFNsYXZlIEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICAqLworI2RlZmluZSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1JYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX1NMQVZFKSkgICAgICAgICAgICAgLyohPCBTbGF2ZSBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01FTV9CVVNZX1RYICAgICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9UWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9NRU0pKSAgICAgICAgICAgICAgIC8qITwgTWVtb3J5IEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9NRU1fQlVTWV9SWCAgICAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfUlggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfTUVNKSkgICAgICAgICAgICAgICAvKiE8IE1lbW9yeSBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAqLworCisKKy8qIFByaXZhdGUgZGVmaW5lIHRvIGNlbnRyYWxpemUgdGhlIGVuYWJsZS9kaXNhYmxlIG9mIEludGVycnVwdHMgKi8KKyNkZWZpbmUgSTJDX1hGRVJfVFhfSVQgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBJMkNfWEZFUl9SWF9JVCAgICAgICAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIEkyQ19YRkVSX0xJU1RFTl9JVCAgICAgICgweDAwMDAwMDA0VSkKKworI2RlZmluZSBJMkNfWEZFUl9FUlJPUl9JVCAgICAgICAoMHgwMDAwMDAxMVUpCisjZGVmaW5lIEkyQ19YRkVSX0NQTFRfSVQgICAgICAgICgweDAwMDAwMDEyVSkKKyNkZWZpbmUgSTJDX1hGRVJfUkVMT0FEX0lUICAgICAgKDB4MDAwMDAwMTJVKQorCisvKiBQcml2YXRlIGRlZmluZSBTZXF1ZW50aWFsIFRyYW5zZmVyIE9wdGlvbnMgZGVmYXVsdC9yZXNldCB2YWx1ZSAqLworI2RlZmluZSBJMkNfTk9fT1BUSU9OX0ZSQU1FICAgICAoMHhGRkZGMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBoYW5kbGUgRE1BIHRyYW5zZmVyICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQVNsYXZlUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHRvIGhhbmRsZSBJVCB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX0lUQWRkckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyU2VxQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZVNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUTGlzdGVuQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncyk7CitzdGF0aWMgdm9pZCBJMkNfSVRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRXJyb3JDb2RlKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIElUIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVJlYWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIGZvciBJMkMgdHJhbnNmZXIgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0lUKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19NYXN0ZXJfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfU2xhdmVfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGZsYWdzIGR1cmluZyBwb2xsaW5nIHRyYW5zZmVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uUlhORUZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBjZW50cmFsaXplIHRoZSBlbmFibGUvZGlzYWJsZSBvZiBJbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZCBJMkNfRW5hYmxlX0lSUShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgdm9pZCBJMkNfRGlzYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHRvIGZsdXNoIFRYRFIgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19GbHVzaF9UWERSKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiB0byBoYW5kbGUgIHN0YXJ0LCByZXN0YXJ0IG9yIHN0b3AgYSB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX1RyYW5zZmVyQ29uZmlnKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHRvIENvbnZlcnQgU3BlY2lmaWMgb3B0aW9ucyAqLworc3RhdGljIHZvaWQgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgICAgZGVpbml0aWFsaXplIHRoZSBJMkN4IHBlcmlwaGVyYWw6CisKKyAgICAgICgrKSBVc2VyIG11c3QgSW1wbGVtZW50IEhBTF9JMkNfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBETUEsIElUIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSTJDX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgQ2xvY2sgVGltaW5nCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMQorICAgICAgICAoKyspIEFkZHJlc3NpbmcgbW9kZSAoTWFzdGVyLCBTbGF2ZSkKKyAgICAgICAgKCsrKSBEdWFsIEFkZHJlc3NpbmcgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDIKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyIE1hc2sKKyAgICAgICAgKCsrKSBHZW5lcmFsIGNhbGwgbW9kZQorICAgICAgICAoKyspIE5vc3RyZXRjaCBtb2RlCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSTJDX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBJMkN4IHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEkyQyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgSTJDX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgSTJDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaTJjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19PV05fQUREUkVTUzEoaGkyYy0+SW5pdC5Pd25BZGRyZXNzMSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FERFJFU1NJTkdfTU9ERShoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfRFVBTF9BRERSRVNTKGhpMmMtPkluaXQuRHVhbEFkZHJlc3NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MyKGhpMmMtPkluaXQuT3duQWRkcmVzczIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19PV05fQUREUkVTUzJfTUFTSyhoaTJjLT5Jbml0Lk93bkFkZHJlc3MyTWFza3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19HRU5FUkFMX0NBTEwoaGkyYy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19OT19TVFJFVENIKGhpMmMtPkluaXQuTm9TdHJldGNoTW9kZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhpMmMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogSW5pdCB0aGUgSTJDIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgaGkyYy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJUeENwbHRDYWxsYmFjayAqLworICAgIGhpMmMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoaTJjLT5TbGF2ZVR4Q3BsdENhbGxiYWNrICA9IEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlVHhDcGx0Q2FsbGJhY2sgICovCisgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayAgPSBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBTbGF2ZVJ4Q3BsdENhbGxiYWNrICAqLworICAgIGhpMmMtPkxpc3RlbkNwbHRDYWxsYmFjayAgID0gSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgTGlzdGVuQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoaTJjLT5NZW1UeENwbHRDYWxsYmFjayAgICA9IEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIE1lbVR4Q3BsdENhbGxiYWNrICAgICovCisgICAgaGkyYy0+TWVtUnhDcGx0Q2FsbGJhY2sgICAgPSBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBNZW1SeENwbHRDYWxsYmFjayAgICAqLworICAgIGhpMmMtPkVycm9yQ2FsbGJhY2sgICAgICAgID0gSEFMX0kyQ19FcnJvckNhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICBoaTJjLT5BYm9ydENwbHRDYWxsYmFjayAgICA9IEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisgICAgaGkyYy0+QWRkckNhbGxiYWNrICAgICAgICAgPSBIQUxfSTJDX0FkZHJDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBZGRyQ2FsbGJhY2sgICAgICAgICAqLworCisgICAgaWYgKGhpMmMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhpMmMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JMkNfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCisgICAgaGkyYy0+TXNwSW5pdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCisgICAgSEFMX0kyQ19Nc3BJbml0KGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfSTJDX0RJU0FCTEUoaGkyYyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggVElNSU5HUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBGcmVxdWVuY3kgcmFuZ2UgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPlRJTUlOR1IgPSBoaTJjLT5Jbml0LlRpbWluZyAmIFRJTUlOR19DTEVBUl9NQVNLOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBEaXNhYmxlIE93biBBZGRyZXNzMSBiZWZvcmUgc2V0IHRoZSBPd24gQWRkcmVzczEgY29uZmlndXJhdGlvbiAqLworICBoaTJjLT5JbnN0YW5jZS0+T0FSMSAmPSB+STJDX09BUjFfT0ExRU47CisKKyAgLyogQ29uZmlndXJlIEkyQ3g6IE93biBBZGRyZXNzMSBhbmQgYWNrIG93biBhZGRyZXNzMSBtb2RlICovCisgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV83QklUKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPk9BUjEgPSAoSTJDX09BUjFfT0ExRU4gfCBoaTJjLT5Jbml0Lk93bkFkZHJlc3MxKTsKKyAgfQorICBlbHNlIC8qIEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCAqLworICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPk9BUjEgPSAoSTJDX09BUjFfT0ExRU4gfCBJMkNfT0FSMV9PQTFNT0RFIHwgaGkyYy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIEkyQ3g6IEFkZHJlc3NpbmcgTWFzdGVyIG1vZGUgKi8KKyAgaWYgKGhpMmMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiA9IChJMkNfQ1IyX0FERDEwKTsKKyAgfQorICAvKiBFbmFibGUgdGhlIEFVVE9FTkQgYnkgZGVmYXVsdCwgYW5kIGVuYWJsZSBOQUNLIChzaG91bGQgYmUgZGlzYWJsZSBvbmx5IGR1cmluZyBTbGF2ZSBwcm9jZXNzICovCisgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gKEkyQ19DUjJfQVVUT0VORCB8IEkyQ19DUjJfTkFDSyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggT0FSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIERpc2FibGUgT3duIEFkZHJlc3MyIGJlZm9yZSBzZXQgdGhlIE93biBBZGRyZXNzMiBjb25maWd1cmF0aW9uICovCisgIGhpMmMtPkluc3RhbmNlLT5PQVIyICY9IH5JMkNfRFVBTEFERFJFU1NfRU5BQkxFOworCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBEdWFsIG1vZGUgYW5kIE93biBBZGRyZXNzMiAqLworICBoaTJjLT5JbnN0YW5jZS0+T0FSMiA9IChoaTJjLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSB8IGhpMmMtPkluaXQuT3duQWRkcmVzczIgfCAoaGkyYy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzIDw8IDgpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIEkyQ3g6IEdlbmVyYWxjYWxsIGFuZCBOb1N0cmV0Y2ggbW9kZSAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxID0gKGhpMmMtPkluaXQuR2VuZXJhbENhbGxNb2RlIHwgaGkyYy0+SW5pdC5Ob1N0cmV0Y2hNb2RlKTsKKworICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBJMkMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19EZUluaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIENoZWNrIHRoZSBJMkMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhpMmMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIEkyQyBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGkyYy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBoaTJjLT5Nc3BEZUluaXRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfSTJDX01zcERlSW5pdChoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRVNFVDsKKyAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgSTJDIE1TUC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19Nc3BJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIEkyQyBNU1AuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTXNwRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIEkyQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01FTV9UWF9DT01QTEVURV9DQl9JRCBNZW1vcnkgVHggVHJhbnNmZXIgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NRU1fUlhfQ09NUExFVEVfQ0JfSUQgTWVtb3J5IFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfQUJPUlRfQ0JfSUQgQWJvcnQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfUmVnaXN0ZXJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgSEFMX0kyQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSTJDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmIChIQUxfSTJDX1NUQVRFX1JFQURZID09IGhpMmMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0kyQ19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPkxpc3RlbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NRU1fVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NZW1UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NRU1fUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NZW1SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhpMmMtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfQUJPUlRfQ0JfSUQgOgorICAgICAgICBoaTJjLT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9JMkNfU1RBVEVfUkVTRVQgPT0gaGkyYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfSTJDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIEkyQyBDYWxsYmFjaworICAqICAgICAgICAgSTJDIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19MSVNURU5fQ09NUExFVEVfQ0JfSUQgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTUVNX1RYX0NPTVBMRVRFX0NCX0lEIE1lbW9yeSBUeCBUcmFuc2ZlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01FTV9SWF9DT01QTEVURV9DQl9JRCBNZW1vcnkgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19BQk9SVF9DQl9JRCBBYm9ydCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBIQUxfSTJDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmIChIQUxfSTJDX1NUQVRFX1JFQURZID09IGhpMmMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0kyQ19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclR4Q3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJSeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+U2xhdmVUeENwbHRDYWxsYmFjayA9IEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBTbGF2ZVR4Q3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayA9IEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBTbGF2ZVJ4Q3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPkxpc3RlbkNwbHRDYWxsYmFjayA9IEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgTGlzdGVuQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NRU1fVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5NZW1UeENwbHRDYWxsYmFjayA9IEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1lbVR4Q3BsdENhbGxiYWNrICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUVNX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWVtUnhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBNZW1SeENwbHRDYWxsYmFjayAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9JMkNfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX0FCT1JUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfSTJDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSTJDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9JMkNfU1RBVEVfUkVTRVQgPT0gaGkyYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfSTJDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfSTJDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSTJDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgdGhlIFNsYXZlIEFkZHJlc3MgTWF0Y2ggSTJDIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX0kyQ19BZGRyQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBBZGRyZXNzIE1hdGNoIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCBwSTJDX0FkZHJDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoSEFMX0kyQ19TVEFURV9SRUFEWSA9PSBoaTJjLT5TdGF0ZSkKKyAgeworICAgIGhpMmMtPkFkZHJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFNsYXZlIEFkZHJlc3MgTWF0Y2ggSTJDIENhbGxiYWNrCisgICogICAgICAgICBJbmZvIFJlYWR5IEkyQyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmIChIQUxfSTJDX1NUQVRFX1JFQURZID09IGhpMmMtPlN0YXRlKQorICB7CisgICAgaGkyYy0+QWRkckNhbGxiYWNrID0gSEFMX0kyQ19BZGRyQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFkZHJDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJMkMgZGF0YQorICAgIHRyYW5zZmVycy4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgIG9yIERNQS4gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBzdGFydHVwLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgSTJDIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fV3JpdGUoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtX1JlYWQoKQorICAgICAgICAoKyspIEhBTF9JMkNfSXNEZXZpY2VSZWFkeSgpCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9Xcml0ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fUmVhZF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtX1JlYWRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gbm9uIEJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHMgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19CVVNZLCBTRVQsIEkyQ19USU1FT1VUX0JVU1ksIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworICAgIH0KKworICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKmhpMmMtPnBCdWZmUHRyOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKworICAgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgIT0gMFUpICYmIChoaTJjLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZXMgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhpMmMtPlhmZXJJU1IgICA9IE5VTEw7CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKworICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uUlhORUZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKworICAgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgIT0gMFUpICYmIChoaTJjLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXRzIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBXYWl0IHVudGlsIEFERFIgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQUREUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgLyogSWYgMTBiaXQgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgaWYgKGhpMmMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgQUREUiBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0FERFIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgRElSIGZsYWcgaXMgc2V0IFRyYW5zbWl0dGVyIG1vZGUgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfRElSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgd2hpbGUgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKmhpMmMtPnBCdWZmUHRyOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgU1RPUCBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgaWYgKGhpMmMtPkVycm9yQ29kZSA9PSBIQUxfSTJDX0VSUk9SX0FGKQorICAgICAgeworICAgICAgICAvKiBOb3JtYWwgdXNlIGNhc2UgZm9yIFRyYW5zbWl0dGVyIG1vZGUgKi8KKyAgICAgICAgLyogQSBOQUNLIGlzIGdlbmVyYXRlZCB0byBjb25maXJtIHRoZSBlbmQgb2YgdHJhbnNmZXIgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIFdhaXQgdW50aWwgQlVTWSBmbGFnIGlzIHJlc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBXYWl0IHVudGlsIEFERFIgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQUREUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgLyogV2FpdCB1bnRpbCBESVIgZmxhZyBpcyByZXNldCBSZWNlaXZlciBtb2RlICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0RJUiwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX1dhaXRPblJYTkVGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgICAgICAgLyogU3RvcmUgTGFzdCByZWNlaXZlIGRhdGEgaWYgYW55ICovCisgICAgICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfUlhORSkgPT0gU0VUKQorICAgICAgICB7CisgICAgICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKmhpMmMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBTVE9QIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBXYWl0IHVudGlsIEJVU1kgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19CVVNZLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgeGZlcm1vZGU7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFJYSSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX1NsYXZlX0lTUl9JVDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFJYSSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoaGkyYy0+WGZlclNpemUgPiAwVSkKKyAgICB7CisgICAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyVHJhbnNtaXRDcGx0OworCisgICAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQV9QQVJBTTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKworICAgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9FUlJPUl9JVCk7CisKKyAgICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBUcmFuc2ZlciBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaGkyYy0+WGZlcklTUiA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIGdlbmVyYXRlIFNUQVJUIGNvbmRpdGlvbiAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfRE1BOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIGlmIChoaTJjLT5YZmVyU2l6ZSA+IDBVKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdDsKKworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdClwRGF0YSwgaGkyYy0+WGZlclNpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgICAgLyogU2V0IE5CWVRFUyB0byByZWFkIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0VSUk9SX0lUKTsKKworICAgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIFRyYW5zZmVyIElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoaTJjLT5YZmVySVNSID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byByZWFkIGFuZCBnZW5lcmF0ZSBTVEFSVCBjb25kaXRpb24gKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfRE1BOworCisgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQVNsYXZlVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hdHgsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+VFhEUiwgaGkyYy0+WGZlclNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0ssIEFERFIgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfVFhETUFFTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfRE1BOworCisgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQVNsYXZlUmVjZWl2ZUNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+UlhEUiwgKHVpbnQzMl90KXBEYXRhLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQV9QQVJBTTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgU1RPUCwgTkFDSywgQUREUiBpbnRlcnJ1cHRzICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fV3JpdGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhpMmMtPlhmZXJJU1IgICA9IE5VTEw7CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaWYgKEkyQ19SZXF1ZXN0TWVtb3J5V3JpdGUoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25UWElTRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICpoaTJjLT5wQnVmZlB0cjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisKKyAgICAgIGlmICgoaGkyYy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaGkyYy0+WGZlclNpemUgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRDUiBmbGFnIGlzIHNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVENSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSk7CisKKyAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX01FTUFERF9TSVpFKE1lbUFkZFNpemUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQlVTWSwgU0VULCBJMkNfVElNRU9VVF9CVVNZLCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBpZiAoSTJDX1JlcXVlc3RNZW1vcnlSZWFkKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1JYTkUsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKmhpMmMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICBpZiAoKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhpMmMtPlhmZXJTaXplID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUQ1IgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KSBoaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSk7CisKKyAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBpZiAoSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShoaTJjLCBEZXZBZGRyZXNzLCBNZW1BZGRyZXNzLCBNZW1BZGRTaXplLCBJMkNfVElNRU9VVF9GTEFHLCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19OT19TVEFSVFNUT1ApOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB4ZmVybW9kZTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX01FTUFERF9TSVpFKE1lbUFkZFNpemUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfTUVNOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVJlYWQoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIHRvIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaWYgKEkyQ19SZXF1ZXN0TWVtb3J5V3JpdGUoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfTk9fU1RBUlRTVE9QKTsKKworICAgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9FUlJPUl9JVCk7CisKKyAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1RYRE1BRU47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWFkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaWYgKEkyQ19SZXF1ZXN0TWVtb3J5UmVhZChoaTJjLCBEZXZBZGRyZXNzLCBNZW1BZGRyZXNzLCBNZW1BZGRTaXplLCBJMkNfVElNRU9VVF9GTEFHLCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgZG1heGZlcnN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5SWERSLCAodWludDMyX3QpcERhdGEsIGhpMmMtPlhmZXJTaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCBNZW1vcnkgZGV2aWNlcworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBUcmlhbHMgTnVtYmVyIG9mIHRyaWFscworICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0lzRGV2aWNlUmVhZHkoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQzMl90IFRyaWFscywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIF9fSU8gdWludDMyX3QgSTJDX1RyaWFscyA9IDBVTDsKKworICBGbGFnU3RhdHVzIHRtcDE7CisgIEZsYWdTdGF0dXMgdG1wMjsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIFN0YXJ0ICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyID0gSTJDX0dFTkVSQVRFX1NUQVJUKGhpMmMtPkluaXQuQWRkcmVzc2luZ01vZGUsIERldkFkZHJlc3MpOworCisgICAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0IG9yIGEgTkFDSyBmbGFnIGlzIHNldCovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICB0bXAxID0gX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKyAgICAgIHRtcDIgPSBfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICB3aGlsZSAoKHRtcDEgPT0gUkVTRVQpICYmICh0bXAyID09IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wMSA9IF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisgICAgICAgIHRtcDIgPSBfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgTkFDS0YgZmxhZyBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAgICAgLyogRGV2aWNlIGlzIHJlYWR5ICovCisgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcsIGF1dG8gZ2VuZXJhdGVkIHdpdGggYXV0b2VuZCovCisgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgdHJpYWxzIGhhcyBiZWVuIHJlYWNoZWQgKi8KKyAgICAgIGlmIChJMkNfVHJpYWxzID09IFRyaWFscykKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfU1RPUDsKKworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKyAgICAgIH0KKworICAgICAgLyogSW5jcmVtZW50IFRyaWFscyAqLworICAgICAgSTJDX1RyaWFscysrOworICAgIH0KKyAgICB3aGlsZSAoSTJDX1RyaWFscyA8IFRyaWFscyk7CisKKyAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfVElNRU9VVDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICB1aW50MzJfdCB4ZmVycmVxdWVzdCA9IEkyQ19HRU5FUkFURV9TVEFSVF9XUklURTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgLyogSWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUsIHVzZSByZWxvYWQgbW9kZSAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgfQorCisgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UgYW5kIHRoZXJlIGlzIG5vIHJlcXVlc3QgdG8gc3RhcnQgYW5vdGhlciBmcmFtZSwgZG8gbm90IGdlbmVyYXRlIFJlc3RhcnQgQ29uZGl0aW9uICovCisgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKyAgICBpZiAoKGhpMmMtPlByZXZpb3VzU3RhdGUgPT0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYKSAmJiAoSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykgPT0gMCkpCisgICAgeworICAgICAgeGZlcnJlcXVlc3QgPSBJMkNfTk9fU1RBUlRTVE9QOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICBJMkNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaGkyYyk7CisKKyAgICAgIC8qIFVwZGF0ZSB4ZmVybW9kZSBhY2NvcmRpbmdseSBpZiBubyByZWxvYWQgaXMgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50IDwgTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBzZXQgTkJZVEVTIHRvIHdyaXRlICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgeGZlcnJlcXVlc3QpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHRyYW5zbWl0IGluIG1hc3RlciBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIHVpbnQzMl90IHhmZXJyZXF1ZXN0ID0gSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFOworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX01hc3Rlcl9JU1JfRE1BOworCisgICAgLyogSWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUsIHVzZSByZWxvYWQgbW9kZSAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgfQorCisgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UgYW5kIHRoZXJlIGlzIG5vIHJlcXVlc3QgdG8gc3RhcnQgYW5vdGhlciBmcmFtZSwgZG8gbm90IGdlbmVyYXRlIFJlc3RhcnQgQ29uZGl0aW9uICovCisgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKyAgICBpZiAoKGhpMmMtPlByZXZpb3VzU3RhdGUgPT0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYKSAmJiAoSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykgPT0gMCkpCisgICAgeworICAgICAgeGZlcnJlcXVlc3QgPSBJMkNfTk9fU1RBUlRTVE9QOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICBJMkNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaGkyYyk7CisKKyAgICAgIC8qIFVwZGF0ZSB4ZmVybW9kZSBhY2NvcmRpbmdseSBpZiBubyByZWxvYWQgaXMgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50IDwgTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhpMmMtPlhmZXJTaXplID4gMFUpCisgICAgeworICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdDsKKworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hdHgsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+VFhEUiwgaGkyYy0+WGZlclNpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIHNldCBOQllURVMgdG8gd3JpdGUgKi8KKyAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgeGZlcnJlcXVlc3QpOworCisgICAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0VSUk9SX0lUKTsKKworICAgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1RYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIFRyYW5zZmVyIElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoaTJjLT5YZmVySVNSID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgZ2VuZXJhdGUgU1RBUlQgY29uZGl0aW9uICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB4ZmVybW9kZTsKKyAgdWludDMyX3QgeGZlcnJlcXVlc3QgPSBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgLyogSWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUsIHVzZSByZWxvYWQgbW9kZSAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgfQorCisgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UgYW5kIHRoZXJlIGlzIG5vIHJlcXVlc3QgdG8gc3RhcnQgYW5vdGhlciBmcmFtZSwgZG8gbm90IGdlbmVyYXRlIFJlc3RhcnQgQ29uZGl0aW9uICovCisgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKyAgICBpZiAoKGhpMmMtPlByZXZpb3VzU3RhdGUgPT0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYKSAmJiAoSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykgPT0gMCkpCisgICAgeworICAgICAgeGZlcnJlcXVlc3QgPSBJMkNfTk9fU1RBUlRTVE9QOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICBJMkNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaGkyYyk7CisKKyAgICAgIC8qIFVwZGF0ZSB4ZmVybW9kZSBhY2NvcmRpbmdseSBpZiBubyByZWxvYWQgaXMgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50IDwgTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBzZXQgTkJZVEVTIHRvIHJlYWQgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCB4ZmVycmVxdWVzdCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgcmVjZWl2ZSBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB4ZmVybW9kZTsKKyAgdWludDMyX3QgeGZlcnJlcXVlc3QgPSBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIC8qIElmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFLCB1c2UgcmVsb2FkIG1vZGUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgIH0KKworICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlIGFuZCB0aGVyZSBpcyBubyByZXF1ZXN0IHRvIHN0YXJ0IGFub3RoZXIgZnJhbWUsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgaWYgKChoaTJjLT5QcmV2aW91c1N0YXRlID09IEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWCkgJiYgKElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpID09IDApKQorICAgIHsKKyAgICAgIHhmZXJyZXF1ZXN0ID0gSTJDX05PX1NUQVJUU1RPUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhpMmMpOworCisgICAgICAvKiBVcGRhdGUgeGZlcm1vZGUgYWNjb3JkaW5nbHkgaWYgbm8gcmVsb2FkIGlzIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA8IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoaTJjLT5YZmVyU2l6ZSA+IDBVKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdDsKKworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdClwRGF0YSwgaGkyYy0+WGZlclNpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIHNldCBOQllURVMgdG8gcmVhZCAqLworICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCB4ZmVycmVxdWVzdCk7CisKKyAgICAgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfUlhETUFFTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgVHJhbnNmZXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPlhmZXJJU1IgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgICAvKiBTZXQgTkJZVEVTIHRvIHJlYWQgYW5kIGdlbmVyYXRlIFNUQVJUIGNvbmRpdGlvbiAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHRyYW5zbWl0IGluIHNsYXZlL2RldmljZSBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKCh1aW50MzJfdCloaTJjLT5TdGF0ZSAmICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikgPT0gKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJMkMgY2Fubm90IG1hbmFnZSBmdWxsIGR1cGxleCBleGNoYW5nZSBzbyBkaXNhYmxlIHByZXZpb3VzIElUIGVuYWJsZWQgaWYgYW55ICovCisgICAgLyogYW5kIHRoZW4gdG9nZ2xlIHRoZSBIQUwgc2xhdmUgUlggc3RhdGUgdG8gVFggc3RhdGUgKi8KKyAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGFzc29jaWF0ZWQgSW50ZXJydXB0cyAqLworICAgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgICAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hcngpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU47CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICBpZiAoSTJDX0dFVF9ESVIoaGkyYykgPT0gSTJDX0RJUkVDVElPTl9SRUNFSVZFKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBNYXN0ZXIgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQgfCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pID09ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfVFhfSVQpOworCisgICAgLyogSTJDIGNhbm5vdCBtYW5hZ2UgZnVsbCBkdXBsZXggZXhjaGFuZ2Ugc28gZGlzYWJsZSBwcmV2aW91cyBJVCBlbmFibGVkIGlmIGFueSAqLworICAgIC8qIGFuZCB0aGVuIHRvZ2dsZSB0aGUgSEFMIHNsYXZlIFJYIHN0YXRlIHRvIFRYIHN0YXRlICovCisgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBhc3NvY2lhdGVkIEludGVycnVwdHMgKi8KKyAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAgIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfUlhETUFFTikgPT0gSTJDX0NSMV9SWERNQUVOKQorICAgICAgeworICAgICAgICAvKiBBYm9ydCBETUEgWGZlciBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgICAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBYZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWFyeCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pCisgICAgeworICAgICAgaWYgKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9UWERNQUVOKSA9PSBJMkNfQ1IxX1RYRE1BRU4pCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgICAgICAvKiBBYm9ydCBETUEgWGZlciBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBYZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWF0eCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTjsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX1NsYXZlX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQV9QQVJBTTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIFJlc2V0IFhmZXJTaXplICovCisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChJMkNfR0VUX0RJUihoaTJjKSA9PSBJMkNfRElSRUNUSU9OX1JFQ0VJVkUpCisgICAgeworICAgICAgLyogQ2xlYXIgQUREUiBmbGFnIGFmdGVyIHByZXBhcmUgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICAgIC8qIFRoaXMgYWN0aW9uIHdpbGwgZ2VuZXJhdGUgYW4gYWNrbm93bGVkZ2UgdG8gdGhlIE1hc3RlciAqLworICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0ssIEFERFIgaW50ZXJydXB0cyAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfVFhETUFFTjsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgcmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKCh1aW50MzJfdCloaTJjLT5TdGF0ZSAmICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikgPT0gKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJMkMgY2Fubm90IG1hbmFnZSBmdWxsIGR1cGxleCBleGNoYW5nZSBzbyBkaXNhYmxlIHByZXZpb3VzIElUIGVuYWJsZWQgaWYgYW55ICovCisgICAgLyogYW5kIHRoZW4gdG9nZ2xlIHRoZSBIQUwgc2xhdmUgVFggc3RhdGUgdG8gUlggc3RhdGUgKi8KKyAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGFzc29jaWF0ZWQgSW50ZXJydXB0cyAqLworICAgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgICAgaWYgKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9UWERNQUVOKSA9PSBJMkNfQ1IxX1RYRE1BRU4pCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgICAgICAvKiBBYm9ydCBETUEgWGZlciBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBYZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWF0eCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYX0xJU1RFTjsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworICAgIGhpMmMtPlhmZXJJU1IgICAgID0gSTJDX1NsYXZlX0lTUl9JVDsKKworICAgIGlmIChJMkNfR0VUX0RJUihoaTJjKSA9PSBJMkNfRElSRUNUSU9OX1RSQU5TTUlUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBNYXN0ZXIgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCByZWNlaXZlIGluIHNsYXZlL2RldmljZSBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSA9PSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEkyQyBjYW5ub3QgbWFuYWdlIGZ1bGwgZHVwbGV4IGV4Y2hhbmdlIHNvIGRpc2FibGUgcHJldmlvdXMgSVQgZW5hYmxlZCBpZiBhbnkgKi8KKyAgICAvKiBhbmQgdGhlbiB0b2dnbGUgdGhlIEhBTCBzbGF2ZSBUWCBzdGF0ZSB0byBSWCBzdGF0ZSAqLworICAgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYXNzb2NpYXRlZCBJbnRlcnJ1cHRzICovCisgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworCisgICAgICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1RYRE1BRU4pID09IEkyQ19DUjFfVFhETUFFTikKKyAgICAgIHsKKyAgICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hdHgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOKQorICAgIHsKKyAgICAgIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfUlhETUFFTikgPT0gSTJDX0NSMV9SWERNQUVOKQorICAgICAgeworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hcngpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU47CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfRE1BOworCisgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQVNsYXZlUmVjZWl2ZUNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+UlhEUiwgKHVpbnQzMl90KXBEYXRhLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQV9QQVJBTTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIFJlc2V0IFhmZXJTaXplICovCisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChJMkNfR0VUX0RJUihoaTJjKSA9PSBJMkNfRElSRUNUSU9OX1RSQU5TTUlUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBNYXN0ZXIgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRW5hYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+WGZlcklTUiA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICAvKiBFbmFibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0Rpc2FibGVMaXN0ZW5fSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIERlY2xhcmF0aW9uIG9mIHRtcCB0byBwcmV2ZW50IHVuZGVmaW5lZCBiZWhhdmlvciBvZiB2b2xhdGlsZSB1c2FnZSAqLworICB1aW50MzJfdCB0bXA7CisKKyAgLyogRGlzYWJsZSBBZGRyZXNzIGxpc3RlbiBtb2RlIG9ubHkgaWYgYSB0cmFuc2ZlciBpcyBub3Qgb25nb2luZyAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICB0bXAgPSAodWludDMyX3QpKGhpMmMtPlN0YXRlKSAmIEkyQ19TVEFURV9NU0s7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IHRtcCB8ICh1aW50MzJfdCkoaGkyYy0+TW9kZSk7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKyAgICBoaTJjLT5YZmVySVNSID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IGEgbWFzdGVyIEkyQyBJVCBvciBETUEgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcykKK3sKKyAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01BU1RFUikKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIFNldCBTdGF0ZSBhdCBIQUxfSTJDX1NUQVRFX0FCT1JUICovCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0FCT1JUOworCisgICAgLyogU2V0IE5CWVRFUyB0byAxIHRvIGdlbmVyYXRlIGEgZHVtbXkgcmVhZCBvbiBJMkMgcGVyaXBoZXJhbCAqLworICAgIC8qIFNldCBBVVRPRU5EIG1vZGUsIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIE5BQ0sgdGhlbiBTVE9QIGNvbmRpdGlvbiB0byBhYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAxLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RPUCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogV3JvbmcgdXNhZ2Ugb2YgYWJvcnQgZnVuY3Rpb24gKi8KKyAgICAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gY2FzZSBvZiBhYm9ydCBtb25pdG9yZWQgYnkgbWFzdGVyIGRldmljZSAqLworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBldmVudCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSTJDX0VWX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIEdldCBjdXJyZW50IElUIEZsYWdzIGFuZCBJVCBzb3VyY2VzIHZhbHVlICovCisgIHVpbnQzMl90IGl0ZmxhZ3MgICA9IFJFQURfUkVHKGhpMmMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBJMkMgZXZlbnRzIHRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKGhpMmMtPlhmZXJJU1IgIT0gTlVMTCkKKyAgeworICAgIGhpMmMtPlhmZXJJU1IoaGkyYywgaXRmbGFncywgaXRzb3VyY2VzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgZXJyb3IgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ19FUl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgaXRzb3VyY2VzID0gUkVBRF9SRUcoaGkyYy0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IHRtcGVycm9yOworCisgIC8qIEkyQyBCdXMgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoaXRmbGFncywgSTJDX0ZMQUdfQkVSUikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlcywgSTJDX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0JFUlI7CisKKyAgICAvKiBDbGVhciBCRVJSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19CRVJSKTsKKyAgfQorCisgIC8qIEkyQyBPdmVyLVJ1bi9VbmRlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKEkyQ19DSEVDS19GTEFHKGl0ZmxhZ3MsIEkyQ19GTEFHX09WUikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlcywgSTJDX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX09WUjsKKworICAgIC8qIENsZWFyIE9WUiBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfT1ZSKTsKKyAgfQorCisgIC8qIEkyQyBBcmJpdHJhdGlvbiBMb3NzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyhpdGZsYWdzLCBJMkNfRkxBR19BUkxPKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2VzLCBJMkNfSVRfRVJSSSkgIT0gUkVTRVQpKQorICB7CisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQVJMTzsKKworICAgIC8qIENsZWFyIEFSTE8gZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FSTE8pOworICB9CisKKyAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBoaTJjLT5FcnJvckNvZGUsIG1pc3JhIHJ1bGUgKi8KKyAgdG1wZXJyb3IgPSBoaTJjLT5FcnJvckNvZGU7CisKKyAgLyogQ2FsbCB0aGUgRXJyb3IgQ2FsbGJhY2sgaW4gY2FzZSBvZiBFcnJvciBkZXRlY3RlZCAqLworICBpZiAoKHRtcGVycm9yICYgKEhBTF9JMkNfRVJST1JfQkVSUiB8IEhBTF9JMkNfRVJST1JfT1ZSIHwgSEFMX0kyQ19FUlJPUl9BUkxPKSkgIT0gIEhBTF9JMkNfRVJST1JfTk9ORSkKKyAgeworICAgIEkyQ19JVEVycm9yKGhpMmMsIHRtcGVycm9yKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqIEBicmllZiAgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIE1hc3RlciByZXF1ZXN0IFRyYW5zZmVyIERpcmVjdGlvbiAoV3JpdGUvUmVhZCksIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJESVJFQ1RJT04KKyAgKiBAcGFyYW0gIEFkZHJNYXRjaENvZGUgQWRkcmVzcyBNYXRjaCBDb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX0FkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisgIFVOVVNFRChUcmFuc2ZlckRpcmVjdGlvbik7CisgIFVOVVNFRChBZGRyTWF0Y2hDb2RlKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19BZGRyQ2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWVtb3J5IFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBNZW1vcnkgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19FcnJvckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIGFib3J0IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUsIE1vZGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUsIE1vZGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUsIE1vZGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdCB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfSTJDX1N0YXRlVHlwZURlZiBIQUxfSTJDX0dldFN0YXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBSZXR1cm4gSTJDIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGkyYy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgSTJDIE1hc3RlciwgU2xhdmUsIE1lbW9yeSBvciBubyBtb2RlLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMkMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgbW9kZQorICAqLworSEFMX0kyQ19Nb2RlVHlwZURlZiBIQUxfSTJDX0dldE1vZGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIHJldHVybiBoaTJjLT5Nb2RlOworfQorCisvKioKKyogQGJyaWVmICBSZXR1cm4gdGhlIEkyQyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorKiBAcmV0dmFsIEkyQyBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX0kyQ19HZXRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgcmV0dXJuIGhpMmMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIE1hc3RlciBNb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHBhcmFtICBJVFNvdXJjZXMgSW50ZXJydXB0IHNvdXJjZXMgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICB1aW50MTZfdCBkZXZhZGRyZXNzOworICB1aW50MzJfdCB0bXBJVEZsYWdzID0gSVRGbGFnczsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgLyogU2V0IGNvcnJlc3BvbmRpbmcgRXJyb3IgQ29kZSAqLworICAgIC8qIE5vIG5lZWQgdG8gZ2VuZXJhdGUgU1RPUCwgaXQgaXMgYXV0b21hdGljYWxseSBkb25lICovCisgICAgLyogRXJyb3IgY2FsbGJhY2sgd2lsbCBiZSBzZW5kIGR1cmluZyBzdG9wIGZsYWcgdHJlYXRtZW50ICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisKKyAgICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfUlhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBSZW1vdmUgUlhORSBmbGFnIG9uIHRlbXBvcmFyeSB2YXJpYWJsZSBhcyByZWFkIGRvbmUgKi8KKyAgICB0bXBJVEZsYWdzICY9IH5JMkNfRkxBR19SWE5FOworCisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgaGkyYy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1RYSVMpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9UWEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gKmhpMmMtPnBCdWZmUHRyOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgaGkyYy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1RDUikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1RDSSkgIT0gUkVTRVQpKQorICB7CisgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgIT0gMFUpICYmIChoaTJjLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgZGV2YWRkcmVzcyA9ICh1aW50MTZfdCkoaGkyYy0+SW5zdGFuY2UtPkNSMiAmIEkyQ19DUjJfU0FERCk7CisKKyAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJPcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgZGV2YWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIGhpMmMtPlhmZXJPcHRpb25zLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgZGV2YWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDYWxsIFR4Q3BsdENhbGxiYWNrKCkgaWYgbm8gc3RvcCBtb2RlIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19HRVRfU1RPUF9NT0RFKGhpMmMpICE9IEkyQ19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUTWFzdGVyU2VxQ3BsdChoaTJjKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV3Jvbmcgc2l6ZSBTdGF0dXMgcmVnYXJkaW5nIFRDUiBmbGFnIGV2ZW50ICovCisgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX1NJWkUpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfVEMpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9UQ0kpICE9IFJFU0VUKSkKKyAgeworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgaWYgKEkyQ19HRVRfU1RPUF9NT0RFKGhpMmMpICE9IEkyQ19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gaW4gY2FzZSBvZiBubyB0cmFuc2ZlciBvcHRpb24gKi8KKyAgICAgICAgaWYgKGhpMmMtPlhmZXJPcHRpb25zID09IEkyQ19OT19PUFRJT05fRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZW5lcmF0ZSBTdG9wICovCisgICAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCBJMkMgTWFzdGVyIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVE1hc3RlclNlcUNwbHQoaGkyYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyb25nIHNpemUgU3RhdHVzIHJlZ2FyZGluZyBUQyBmbGFnIGV2ZW50ICovCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfU0laRSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgTWFzdGVyIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRNYXN0ZXJDcGx0KGhpMmMsIHRtcElURmxhZ3MpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgU2xhdmUgTW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEBwYXJhbSAgSVRTb3VyY2VzIEludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1NsYXZlX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICB1aW50MzJfdCB0bXBvcHRpb25zID0gaGkyYy0+WGZlck9wdGlvbnM7CisgIHVpbnQzMl90IHRtcElURmxhZ3MgPSBJVEZsYWdzOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19BRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX05BQ0tJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDaGVjayB0aGF0IEkyQyB0cmFuc2ZlciBmaW5pc2hlZCAqLworICAgIC8qIGlmIHllcywgbm9ybWFsIHVzZSBjYXNlLCBhIE5BQ0sgaXMgc2VudCBieSB0aGUgTUFTVEVSIHdoZW4gVHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKyAgICAvKiBNZWFuIFhmZXJDb3VudCA9PSAwKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICYmICh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSkpIC8qIFNhbWUgYWN0aW9uIG11c3QgYmUgZG9uZSBmb3IgKHRtcG9wdGlvbnMgPT0gSTJDX0xBU1RfRlJBTUUpIHdoaWNoIHJlbW92ZWQgZm9yIFdhcm5pbmdbUGExMzRdOiBsZWZ0IGFuZCByaWdodCBvcGVyYW5kcyBhcmUgaWRlbnRpY2FsICovCisgICAgICB7CisgICAgICAgIC8qIENhbGwgSTJDIExpc3RlbiBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVExpc3RlbkNwbHQoaGkyYywgdG1wSVRGbGFncyk7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikgJiYgKHRtcG9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkpCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICAgICAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisKKyAgICAgICAgLyogTGFzdCBCeXRlIGlzIFRyYW5zbWl0dGVkICovCisgICAgICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiBubywgZXJyb3IgdXNlIGNhc2UsIGEgTm9uLUFja25vd2xlZGdlIG9mIGxhc3QgRGF0YSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1BU1RFUiovCisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgICAgaWYgKCh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9GUkFNRSkgfHwgKHRtcG9wdGlvbnMgPT0gSTJDX05FWFRfRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgSTJDX0lURXJyb3IoaGkyYywgaGkyYy0+RXJyb3JDb2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9SWEkpICE9IFJFU0VUKSkKKyAgeworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBSZW1vdmUgUlhORSBmbGFnIG9uIHRlbXBvcmFyeSB2YXJpYWJsZSBhcyByZWFkIGRvbmUgKi8KKyAgICAgIHRtcElURmxhZ3MgJj0gfkkyQ19GTEFHX1JYTkU7CisKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBpZiAoKGhpMmMtPlhmZXJDb3VudCA9PSAwVSkgJiYgXAorICAgICAgICAodG1wb3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKSkKKyAgICB7CisgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX0FERFIpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9BRERSSSkgIT0gUkVTRVQpKQorICB7CisgICAgSTJDX0lUQWRkckNwbHQoaGkyYywgdG1wSVRGbGFncyk7CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1RYSVMpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9UWEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiBvbmx5IGlmIFhmZXJDb3VudCBub3QgcmVhY2ggIjAiICovCisgICAgLyogQSBUWElTIGZsYWcgY2FuIGJlIHNldCwgZHVyaW5nIFNUT1AgdHJlYXRtZW50ICAgICAgKi8KKyAgICAvKiBDaGVjayBpZiBhbGwgRGF0YXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB0aGlzIGxhc3Qgd3JpdGUgaW4gVFhEUiBpcyBub3Qgc2VudCwgY29ycmVzcG9uZCB0byBhIGR1bW15IFRYSVMgZXZlbnQgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICpoaTJjLT5wQnVmZlB0cjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKHRtcG9wdGlvbnMgPT0gSTJDX05FWFRfRlJBTUUpIHx8ICh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9GUkFNRSkpCisgICAgICB7CisgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIHRtcElURmxhZ3MpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgTWFzdGVyIE1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19NYXN0ZXJfSVNSX0RNQShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKQoreworICB1aW50MTZfdCBkZXZhZGRyZXNzOworICB1aW50MzJfdCB4ZmVybW9kZTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgLyogU2V0IGNvcnJlc3BvbmRpbmcgRXJyb3IgQ29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworCisgICAgLyogTm8gbmVlZCB0byBnZW5lcmF0ZSBTVE9QLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgKi8KKyAgICAvKiBCdXQgZW5hYmxlIFNUT1AgaW50ZXJydXB0LCB0byB0cmVhdCBpdCAqLworICAgIC8qIEVycm9yIGNhbGxiYWNrIHdpbGwgYmUgc2VuZCBkdXJpbmcgc3RvcCBmbGFnIHRyZWF0bWVudCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0NQTFRfSVQpOworCisgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfVENSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDIGludGVycnVwdCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFX0lUKGhpMmMsIEkyQ19JVF9UQ0kpOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkKKyAgICB7CisgICAgICAvKiBSZWNvdmVyIFNsYXZlIGFkZHJlc3MgKi8KKyAgICAgIGRldmFkZHJlc3MgPSAodWludDE2X3QpKGhpMmMtPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1NBREQpOworCisgICAgICAvKiBQcmVwYXJlIHRoZSBuZXcgWGZlclNpemUgdG8gdHJhbnNmZXIgKi8KKyAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgICBpZiAoaGkyYy0+WGZlck9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkKKyAgICAgICAgeworICAgICAgICAgIHhmZXJtb2RlID0gaGkyYy0+WGZlck9wdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNldCB0aGUgbmV3IFhmZXJTaXplIGluIE5ieXRlcyByZWdpc3RlciAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX05PX1NUQVJUU1RPUCk7CisKKyAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYKQorICAgICAgeworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfUlhETUFFTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1RYRE1BRU47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDYWxsIFR4Q3BsdENhbGxiYWNrKCkgaWYgbm8gc3RvcCBtb2RlIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19HRVRfU1RPUF9NT0RFKGhpMmMpICE9IEkyQ19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUTWFzdGVyU2VxQ3BsdChoaTJjKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV3Jvbmcgc2l6ZSBTdGF0dXMgcmVnYXJkaW5nIFRDUiBmbGFnIGV2ZW50ICovCisgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX1NJWkUpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfVEMpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9UQ0kpICE9IFJFU0VUKSkKKyAgeworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgaWYgKEkyQ19HRVRfU1RPUF9NT0RFKGhpMmMpICE9IEkyQ19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gaW4gY2FzZSBvZiBubyB0cmFuc2ZlciBvcHRpb24gKi8KKyAgICAgICAgaWYgKGhpMmMtPlhmZXJPcHRpb25zID09IEkyQ19OT19PUFRJT05fRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZW5lcmF0ZSBTdG9wICovCisgICAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCBJMkMgTWFzdGVyIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVE1hc3RlclNlcUNwbHQoaGkyYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyb25nIHNpemUgU3RhdHVzIHJlZ2FyZGluZyBUQyBmbGFnIGV2ZW50ICovCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfU0laRSk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVE1hc3RlckNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgU2xhdmUgTW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEBwYXJhbSAgSVRTb3VyY2VzIEludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1NsYXZlX0lTUl9ETUEoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDMyX3QgdG1wb3B0aW9ucyA9IGhpMmMtPlhmZXJPcHRpb25zOworICB1aW50MzJfdCB0cmVhdGRtYW5hY2sgPSAwVTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2hlY2sgdGhhdCBJMkMgdHJhbnNmZXIgZmluaXNoZWQgKi8KKyAgICAvKiBpZiB5ZXMsIG5vcm1hbCB1c2UgY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIE1BU1RFUiB3aGVuIFRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisgICAgLyogTWVhbiBYZmVyQ291bnQgPT0gMCAqLworICAgIC8qIFNvIGNsZWFyIEZsYWcgTkFDS0Ygb25seSAqLworICAgIGlmICgoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfVFhETUFFTikgIT0gUkVTRVQpIHx8CisgICAgICAgIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0NSMV9SWERNQUVOKSAhPSBSRVNFVCkpCisgICAgeworICAgICAgLyogU3BsaXQgY2hlY2sgb2YgaGRtYXJ4LCBmb3IgTUlTUkEgY29tcGxpYW5jZSAqLworICAgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWFyeCkgPT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgdHJlYXRkbWFuYWNrID0gMVU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNwbGl0IGNoZWNrIG9mIGhkbWF0eCwgZm9yIE1JU1JBIGNvbXBsaWFuY2UgICovCisgICAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0NSMV9UWERNQUVOKSAhPSBSRVNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX0hBTF9ETUFfR0VUX0NPVU5URVIoaGkyYy0+aGRtYXR4KSA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0cmVhdGRtYW5hY2sgPSAxVTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRyZWF0ZG1hbmFjayA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgaWYgKChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikgJiYgKHRtcG9wdGlvbnMgPT0gSTJDX0ZJUlNUX0FORF9MQVNUX0ZSQU1FKSkgLyogU2FtZSBhY3Rpb24gbXVzdCBiZSBkb25lIGZvciAodG1wb3B0aW9ucyA9PSBJMkNfTEFTVF9GUkFNRSkgd2hpY2ggcmVtb3ZlZCBmb3IgV2FybmluZ1tQYTEzNF06IGxlZnQgYW5kIHJpZ2h0IG9wZXJhbmRzIGFyZSBpZGVudGljYWwgKi8KKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSTJDIExpc3RlbiBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgICAgSTJDX0lUTGlzdGVuQ3BsdChoaTJjLCBJVEZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikgJiYgKHRtcG9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgICAgICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICAgICAgICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgICAgICAgLyogTGFzdCBCeXRlIGlzIFRyYW5zbWl0dGVkICovCisgICAgICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBpZiBubywgZXJyb3IgdXNlIGNhc2UsIGEgTm9uLUFja25vd2xlZGdlIG9mIGxhc3QgRGF0YSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1BU1RFUiovCisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworCisgICAgICAgIGlmICgodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpIHx8ICh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE9ubHkgQ2xlYXIgTkFDSyBGbGFnLCBubyBETUEgdHJlYXRtZW50IGlzIHBlbmRpbmcgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FERFIpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9BRERSSSkgIT0gUkVTRVQpKQorICB7CisgICAgSTJDX0lUQWRkckNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfU1RPUEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENhbGwgSTJDIFNsYXZlIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRTbGF2ZUNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgc2VuZHMgdGFyZ2V0IGRldmljZSBhZGRyZXNzIGZvbGxvd2VkIGJ5IGludGVybmFsIG1lbW9yeSBhZGRyZXNzIGZvciB3cml0ZSByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdClNZW1BZGRTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogSWYgTWVtb3J5IGFkZHJlc3Mgc2l6ZSBpcyA4Qml0ICovCisgIGlmIChNZW1BZGRTaXplID09IEkyQ19NRU1BRERfU0laRV84QklUKQorICB7CisgICAgLyogU2VuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTFNCKE1lbUFkZHJlc3MpOworICB9CisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgMTZCaXQgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2VuZCBNU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX01TQihNZW1BZGRyZXNzKTsKKworICAgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZW5kIExTQiBvZiBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTFNCKE1lbUFkZHJlc3MpOworICB9CisKKyAgLyogV2FpdCB1bnRpbCBUQ1IgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDUiwgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIHNlbmRzIHRhcmdldCBkZXZpY2UgYWRkcmVzcyBmb2xsb3dlZCBieSBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcyBmb3IgcmVhZCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfUmVxdWVzdE1lbW9yeVJlYWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KU1lbUFkZFNpemUsIEkyQ19TT0ZURU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogSWYgTWVtb3J5IGFkZHJlc3Mgc2l6ZSBpcyA4Qml0ICovCisgIGlmIChNZW1BZGRTaXplID09IEkyQ19NRU1BRERfU0laRV84QklUKQorICB7CisgICAgLyogU2VuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTFNCKE1lbUFkZHJlc3MpOworICB9CisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgMTZCaXQgKi8KKyAgZWxzZQorICB7CisgICAgLyogU2VuZCBNU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX01TQihNZW1BZGRyZXNzKTsKKworICAgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZW5kIExTQiBvZiBNZW1vcnkgQWRkcmVzcyAqLworICAgIGhpMmMtPkluc3RhbmNlLT5UWERSID0gSTJDX01FTV9BRERfTFNCKE1lbUFkZHJlc3MpOworICB9CisKKyAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCAqLworICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVEMsIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBBZGRyZXNzIGNvbXBsZXRlIHByb2Nlc3MgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRBZGRyQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncykKK3sKKyAgdWludDhfdCB0cmFuc2ZlcmRpcmVjdGlvbjsKKyAgdWludDE2X3Qgc2xhdmVhZGRyY29kZTsKKyAgdWludDE2X3Qgb3duYWRkMWNvZGU7CisgIHVpbnQxNl90IG93bmFkZDJjb2RlOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKElURmxhZ3MpOworCisgIC8qIEluIGNhc2Ugb2YgTGlzdGVuIHN0YXRlLCBuZWVkIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBhZGRyZXNzIG1hdGNoIGNvZGUgZXZlbnQgKi8KKyAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pID09ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgeworICAgIHRyYW5zZmVyZGlyZWN0aW9uID0gSTJDX0dFVF9ESVIoaGkyYyk7CisgICAgc2xhdmVhZGRyY29kZSAgICAgPSBJMkNfR0VUX0FERFJfTUFUQ0goaGkyYyk7CisgICAgb3duYWRkMWNvZGUgICAgICAgPSBJMkNfR0VUX09XTl9BRERSRVNTMShoaTJjKTsKKyAgICBvd25hZGQyY29kZSAgICAgICA9IEkyQ19HRVRfT1dOX0FERFJFU1MyKGhpMmMpOworCisgICAgLyogSWYgMTBiaXRzIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZCAqLworICAgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgICB7CisgICAgICBpZiAoKHNsYXZlYWRkcmNvZGUgJiBTbGF2ZUFkZHJfTVNLKSA9PSAoKG93bmFkZDFjb2RlID4+IFNsYXZlQWRkcl9TSElGVCkgJiBTbGF2ZUFkZHJfTVNLKSkKKyAgICAgIHsKKyAgICAgICAgc2xhdmVhZGRyY29kZSA9IG93bmFkZDFjb2RlOworICAgICAgICBoaTJjLT5BZGRyRXZlbnRDb3VudCsrOworICAgICAgICBpZiAoaGkyYy0+QWRkckV2ZW50Q291bnQgPT0gMlUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZXNldCBBZGRyZXNzIEV2ZW50IGNvdW50ZXIgKi8KKyAgICAgICAgICBoaTJjLT5BZGRyRXZlbnRDb3VudCA9IDBVOworCisgICAgICAgICAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgICAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUREUik7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgICAgLyogQ2FsbCBTbGF2ZSBBZGRyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIGhpMmMtPkFkZHJDYWxsYmFjayhoaTJjLCB0cmFuc2ZlcmRpcmVjdGlvbiwgc2xhdmVhZGRyY29kZSk7CisjZWxzZQorICAgICAgICAgIEhBTF9JMkNfQWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzbGF2ZWFkZHJjb2RlID0gb3duYWRkMmNvZGU7CisKKyAgICAgICAgLyogRGlzYWJsZSBBRERSIEludGVycnVwdHMgKi8KKyAgICAgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgLyogQ2FsbCBTbGF2ZSBBZGRyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBoaTJjLT5BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2Vsc2UKKyAgICAgICAgSEFMX0kyQ19BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICAvKiBlbHNlIDcgYml0cyBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSBBRERSIEludGVycnVwdHMgKi8KKyAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhpMmMtPkFkZHJDYWxsYmFjayhoaTJjLCB0cmFuc2ZlcmRpcmVjdGlvbiwgc2xhdmVhZGRyY29kZSk7CisjZWxzZQorICAgICAgSEFMX0kyQ19BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBFbHNlIGNsZWFyIGFkZHJlc3MgZmxhZyBvbmx5ICovCisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBNYXN0ZXIgc2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyU2VxQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUmVzZXQgSTJDIGhhbmRsZSBtb2RlICovCisgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAvKiBObyBHZW5lcmF0ZSBTdG9wLCB0byBwZXJtaXQgcmVzdGFydCBtb2RlICovCisgIC8qIFRoZSBzdG9wIHdpbGwgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyLCB3aGVuIEkyQ19BVVRPRU5EX01PREUgZW5hYmxlICovCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgLyogaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYICovCisgIGVsc2UKKyAgeworICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfUlg7CisgICAgaGkyYy0+WGZlcklTUiAgICAgICA9IE5VTEw7CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBTbGF2ZSBzZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRTbGF2ZVNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFJlc2V0IEkyQyBoYW5kbGUgbW9kZSAqLworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pCisgIHsKKyAgICAvKiBSZW1vdmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1RYLCBrZWVwIG9ubHkgSEFMX0kyQ19TVEFURV9MSVNURU4gKi8KKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9TTEFWRV9CVVNZX1RYOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+U2xhdmVUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYX0xJU1RFTikKKyAgeworICAgIC8qIFJlbW92ZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfUlgsIGtlZXAgb25seSBIQUxfSTJDX1NUQVRFX0xJU1RFTiAqLworICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX1NMQVZFX0JVU1lfUlg7CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIE1hc3RlciBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUTWFzdGVyQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncykKK3sKKyAgdWludDMyX3QgdG1wZXJyb3I7CisKKyAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworICBoaTJjLT5YZmVyT3B0aW9ucyAgID0gSTJDX05PX09QVElPTl9GUkFNRTsKKworICBpZiAoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgLyogU2V0IGFja25vd2xlZGdlIGVycm9yIGNvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKyAgfQorCisgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQgfCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBoaTJjLT5FcnJvckNvZGUsIG1pc3JhIHJ1bGUgKi8KKyAgdG1wZXJyb3IgPSBoaTJjLT5FcnJvckNvZGU7CisKKyAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9BQk9SVCkgfHwgKHRtcGVycm9yICE9IEhBTF9JMkNfRVJST1JfTk9ORSkpCisgIHsKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICBJMkNfSVRFcnJvcihoaTJjLCBoaTJjLT5FcnJvckNvZGUpOworICB9CisgIC8qIGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWCAqLworICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICBpZiAoaGkyYy0+TW9kZSA9PSBIQUxfSTJDX01PREVfTUVNKQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NZW1UeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhpMmMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICAgIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAqLworICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICBpZiAoaGkyYy0+TW9kZSA9PSBIQUxfSTJDX01PREVfTUVNKQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NZW1SeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhpMmMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICAgIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUU2xhdmVDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKQoreworICB1aW50MzJfdCB0bXBjcjF2YWx1ZSA9IFJFQURfUkVHKGhpMmMtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCB0bXBJVEZsYWdzID0gSVRGbGFnczsKKworICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBJZiBhIERNQSBpcyBvbmdvaW5nLCBVcGRhdGUgaGFuZGxlIHNpemUgY29udGV4dCAqLworICBpZiAoSTJDX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgSTJDX0NSMV9UWERNQUVOKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyQ291bnQgPSAodWludDE2X3QpX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWF0eCk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEkyQ19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgaGkyYy0+WGZlckNvdW50ID0gKHVpbnQxNl90KV9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgaWYgKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1JYTkUpICE9IFJFU0VUKQorICB7CisgICAgLyogUmVtb3ZlIFJYTkUgZmxhZyBvbiB0ZW1wb3JhcnkgdmFyaWFibGUgYXMgcmVhZCBkb25lICovCisgICAgdG1wSVRGbGFncyAmPSB+STJDX0ZMQUdfUlhORTsKKworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICBpZiAoKGhpMmMtPlhmZXJTaXplID4gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICB9CisgIH0KKworICAvKiBBbGwgZGF0YSBhcmUgbm90IHRyYW5zZmVycmVkLCBzbyBzZXQgZXJyb3IgY29kZSBhY2NvcmRpbmdseSAqLworICBpZiAoaGkyYy0+WGZlckNvdW50ICE9IDBVKQorICB7CisgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgIH0KKworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKyAgaGkyYy0+WGZlcklTUiA9IE5VTEw7CisKKyAgaWYgKGhpMmMtPkVycm9yQ29kZSAhPSBIQUxfSTJDX0VSUk9SX05PTkUpCisgIHsKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICBJMkNfSVRFcnJvcihoaTJjLCBoaTJjLT5FcnJvckNvZGUpOworCisgICAgLyogQ2FsbCB0aGUgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBMaXN0ZW4gdXNlY2FzZSAqLworICAgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgSTJDX0lUTGlzdGVuQ3BsdChoaTJjLCB0bXBJVEZsYWdzKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGkyYy0+WGZlck9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkKKyAgeworICAgIC8qIENhbGwgdGhlIFNlcXVlbnRpYWwgQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIFRyYW5mZXIgKi8KKyAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjaywgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgTGlzdGVuIHVzZWNhc2UgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+TGlzdGVuQ3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5TbGF2ZVR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTGlzdGVuIGNvbXBsZXRlIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRMaXN0ZW5DcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKQoreworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJJU1IgPSBOVUxMOworCisgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICBpZiAoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgKmhpMmMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgaWYgKChoaTJjLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSBhbGwgSW50ZXJydXB0cyovCisgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIC8qIENhbGwgdGhlIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjaywgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgTGlzdGVuIHVzZWNhc2UgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhpMmMtPkxpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBpbnRlcnJ1cHRzIGVycm9yIHByb2Nlc3MuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHBhcmFtICBFcnJvckNvZGUgRXJyb3IgY29kZSB0byBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfSVRFcnJvcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRXJyb3JDb2RlKQoreworICBIQUxfSTJDX1N0YXRlVHlwZURlZiB0bXBzdGF0ZSA9IGhpMmMtPlN0YXRlOworCisgIC8qIFJlc2V0IGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIGhpMmMtPk1vZGUgICAgICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKyAgaGkyYy0+WGZlck9wdGlvbnMgICA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgIGhpMmMtPlhmZXJDb3VudCAgICAgPSAwVTsKKworICAvKiBTZXQgbmV3IGVycm9yIGNvZGUgKi8KKyAgaGkyYy0+RXJyb3JDb2RlIHw9IEVycm9yQ29kZTsKKworICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgaWYgKCh0bXBzdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0xJU1RFTikgICAgICAgICB8fAorICAgICAgKHRtcHN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pIHx8CisgICAgICAodG1wc3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYX0xJU1RFTikpCisgIHsKKyAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBleGNlcHQgaW50ZXJydXB0cyByZWxhdGVkIHRvIExJU1RFTiBzdGF0ZSAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIGtlZXAgSEFMX0kyQ19TVEFURV9MSVNURU4gaWYgc2V0ICovCisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgICBoaTJjLT5YZmVySVNSICAgICAgID0gSTJDX1NsYXZlX0lTUl9JVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1JYX0lUIHwgSTJDX1hGRVJfVFhfSVQpOworCisgICAgLyogSWYgc3RhdGUgaXMgYW4gYWJvcnQgdHJlYXRtZW50IG9uIGdvaW5kLCBkb24ndCBjaGFuZ2Ugc3RhdGUgKi8KKyAgICAvKiBUaGlzIGNoYW5nZSB3aWxsIGJlIGRvIGxhdGVyICovCisgICAgaWYgKGhpMmMtPlN0YXRlICE9IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgICAgeworICAgICAgLyogU2V0IEhBTF9JMkNfU1RBVEVfUkVBRFkgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIH0KKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgICA9IE5VTEw7CisgIH0KKworICAvKiBBYm9ydCBETUEgVFggdHJhbnNmZXIgaWYgYW55ICovCisgIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfVFhETUFFTikgPT0gSTJDX0NSMV9UWERNQUVOKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9UWERNQUVOOworCisgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0kyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJMkNfRE1BQWJvcnQ7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaTJjLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBYZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaGkyYy0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQWJvcnQgRE1BIFJYIHRyYW5zZmVyIGlmIGFueSAqLworICBlbHNlIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfUlhETUFFTikgPT0gSTJDX0NSMV9SWERNQUVOKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaGkyYy0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9BQk9SVCkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5FcnJvckNhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgVHggZGF0YSByZWdpc3RlciBmbHVzaCBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0ZsdXNoX1RYRFIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIElmIGEgcGVuZGluZyBUWElTIGZsYWcgaXMgc2V0ICovCisgIC8qIFdyaXRlIGEgZHVtbXkgZGF0YSBpbiBUWERSIHRvIGNsZWFyIGl0ICovCisgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfVFhJUykgIT0gUkVTRVQpCisgIHsKKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IDB4MDBVOworICB9CisKKyAgLyogRmx1c2ggVFggcmVnaXN0ZXIgaWYgbm90IGVtcHR5ICovCisgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfVFhFKSA9PSBSRVNFVCkKKyAgeworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1RYRSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJDIG1hc3RlciB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBEaXNhYmxlIERNQSBSZXF1ZXN0ICovCisgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAvKiBJZiBsYXN0IHRyYW5zZmVyLCBlbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgaWYgKGhpMmMtPlhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0NQTFRfSVQpOworICB9CisgIC8qIGVsc2UgcHJlcGFyZSBhIG5ldyBETUEgdHJhbnNmZXIgYW5kIGVuYWJsZSBUQ1JlbG9hZCBpbnRlcnJ1cHQgKi8KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEJ1ZmZlciBwb2ludGVyICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgKz0gaGkyYy0+WGZlclNpemU7CisKKyAgICAvKiBTZXQgdGhlIFhmZXJTaXplIHRvIHRyYW5zZmVyICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpaGkyYy0+cEJ1ZmZQdHIsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX0RNQSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUkVMT0FEX0lUKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJDIHNsYXZlIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFTbGF2ZVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKworICBpZiAoKHRtcG9wdGlvbnMgPT0gSTJDX05FWFRfRlJBTUUpIHx8ICh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9GUkFNRSkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBSZXF1ZXN0ICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9UWERNQUVOOworCisgICAgLyogTGFzdCBCeXRlIGlzIFRyYW5zbWl0dGVkICovCisgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vIHNwZWNpZmljIGFjdGlvbiwgTWFzdGVyIGZ1bGx5IG1hbmFnZSB0aGUgZ2VuZXJhdGlvbiBvZiBTVE9QIGNvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gdGhhdCB0aGlzIGdlbmVyYXRpb24gY2FuIGFycml2ZSBhdCBhbnkgdGltZSwgYXQgdGhlIGVuZCBvciBkdXJpbmcgRE1BIHByb2Nlc3MgKi8KKyAgICAvKiBTbyBTVE9QIGNvbmRpdGlvbiBzaG91bGQgYmUgbWFuYWdlIHRocm91Z2ggSW50ZXJydXB0IHRyZWF0bWVudCAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgSTJDIG1hc3RlciByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFNYXN0ZXJSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgLyogSWYgbGFzdCB0cmFuc2ZlciwgZW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKyAgfQorICAvKiBlbHNlIHByZXBhcmUgYSBuZXcgRE1BIHRyYW5zZmVyIGFuZCBlbmFibGUgVENSZWxvYWQgaW50ZXJydXB0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyICs9IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogU2V0IHRoZSBYZmVyU2l6ZSB0byB0cmFuc2ZlciAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+UlhEUiwgKHVpbnQzMl90KWhpMmMtPnBCdWZmUHRyLCBoaTJjLT5YZmVyU2l6ZSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9ETUEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIFRDIGludGVycnVwdHMgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JFTE9BRF9JVCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyQyBzbGF2ZSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFTbGF2ZVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKyAgdWludDMyX3QgdG1wb3B0aW9ucyA9IGhpMmMtPlhmZXJPcHRpb25zOworCisgIGlmICgoX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWFyeCkgPT0gMFUpICYmIFwKKyAgICAgICh0bXBvcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfUlhETUFFTjsKKworICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBObyBzcGVjaWZpYyBhY3Rpb24sIE1hc3RlciBmdWxseSBtYW5hZ2UgdGhlIGdlbmVyYXRpb24gb2YgU1RPUCBjb25kaXRpb24gKi8KKyAgICAvKiBNZWFuIHRoYXQgdGhpcyBnZW5lcmF0aW9uIGNhbiBhcnJpdmUgYXQgYW55IHRpbWUsIGF0IHRoZSBlbmQgb3IgZHVyaW5nIERNQSBwcm9jZXNzICovCisgICAgLyogU28gU1RPUCBjb25kaXRpb24gc2hvdWxkIGJlIG1hbmFnZSB0aHJvdWdoIEludGVycnVwdCB0cmVhdG1lbnQgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgQWNrbm93bGVkZ2UgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfRE1BKTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBJMkMgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaworICAqICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlKS4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQUFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBSZXNldCBBYm9ydENwbHRDYWxsYmFjayAqLworICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgY29tZSBmcm9tIGFib3J0IGZyb20gdXNlciAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9BQk9SVCkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoaTJjLT5BYm9ydENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+RXJyb3JDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19FcnJvckNhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIEZsYWcgU3BlY2lmaWVzIHRoZSBJMkMgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyBUaGUgbmV3IEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEZsYWcpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0IGZvciBzcGVjaWZpYyB1c2FnZSBvZiBUWElTIGZsYWcuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19UWElTKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIGEgTkFDSyBpcyBkZXRlY3RlZCAqLworICAgIGlmIChJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChoaTJjLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBDb21tdW5pY2F0aW9uIFRpbWVvdXQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIFNUT1AgZmxhZy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKSA9PSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIGEgTkFDSyBpcyBkZXRlY3RlZCAqLworICAgIGlmIChJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChoaTJjLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJDIENvbW11bmljYXRpb24gVGltZW91dCBmb3Igc3BlY2lmaWMgdXNhZ2Ugb2YgUlhORSBmbGFnLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblJYTkVGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfUlhORSkgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBhIE5BQ0sgaXMgZGV0ZWN0ZWQgKi8KKyAgICBpZiAoSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBhIFNUT1BGIGlzIGRldGVjdGVkICovCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gU0VUKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIGFuIFJYTkUgaXMgcGVuZGluZyAqLworICAgICAgLyogU3RvcmUgTGFzdCByZWNlaXZlIGRhdGEgaWYgYW55ICovCisgICAgICBpZiAoKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19SWE5FKSA9PSBTRVQpICYmIChoaTJjLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogUmV0dXJuIEhBTF9PSyAqLworICAgICAgICAvKiBUaGUgUmVhZGluZyBvZiBkYXRhIGZyb20gUlhEUiB3aWxsIGJlIGRvbmUgaW4gY2FsbGVyIGZ1bmN0aW9uICovCisgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQWNrbm93bGVkZ2UgZmFpbGVkIGRldGVjdGlvbiBkdXJpbmcgYW4gSTJDIENvbW11bmljYXRpb24uCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKSA9PSBTRVQpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFNUT1AgRmxhZyBpcyByZXNldCAqLworICAgIC8qIEF1dG9FbmQgc2hvdWxkIGJlIGluaXRpYXRlIGFmdGVyIEFGICovCisgICAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgTkFDS0YgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisKKyAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBJMkN4IGNvbW11bmljYXRpb24gd2hlbiBzdGFydGluZyB0cmFuc2ZlciBvciBkdXJpbmcgdHJhbnNmZXIgKFRDIG9yIFRDUiBmbGFnIGFyZSBzZXQpLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBTcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNpemUgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS4KKyAgKiBAcGFyYW0gIE1vZGUgTmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgSTJDX1JFTE9BRF9NT0RFIEVuYWJsZSBSZWxvYWQgbW9kZSAuCisgICogICAgIEBhcmcgQHJlZiBJMkNfQVVUT0VORF9NT0RFIEVuYWJsZSBBdXRvbWF0aWMgZW5kIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBJMkNfU09GVEVORF9NT0RFIEVuYWJsZSBTb2Z0d2FyZSBlbmQgbW9kZS4KKyAgKiBAcGFyYW0gIFJlcXVlc3QgTmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgSTJDX05PX1NUQVJUU1RPUCBEb24ndCBHZW5lcmF0ZSBzdG9wIGFuZCBzdGFydCBjb25kaXRpb24uCisgICogICAgIEBhcmcgQHJlZiBJMkNfR0VORVJBVEVfU1RPUCBHZW5lcmF0ZSBzdG9wIGNvbmRpdGlvbiAoU2l6ZSBzaG91bGQgYmUgc2V0IHRvIDApLgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfVHJhbnNmZXJDb25maWcoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RSQU5TRkVSX01PREUoTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFJBTlNGRVJfUkVRVUVTVChSZXF1ZXN0KSk7CisKKyAgLyogdXBkYXRlIENSMiByZWdpc3RlciAqLworICBNT0RJRllfUkVHKGhpMmMtPkluc3RhbmNlLT5DUjIsICgoSTJDX0NSMl9TQUREIHwgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX1JFTE9BRCB8IEkyQ19DUjJfQVVUT0VORCB8IChJMkNfQ1IyX1JEX1dSTiAmICh1aW50MzJfdCkoUmVxdWVzdCA+PiAoMzFVIC0gSTJDX0NSMl9SRF9XUk5fUG9zKSkpIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfU1RPUCkpLCBcCisgICAgICAgICAgICAgKHVpbnQzMl90KSgoKHVpbnQzMl90KURldkFkZHJlc3MgJiBJMkNfQ1IyX1NBREQpIHwgKCgodWludDMyX3QpU2l6ZSA8PCBJMkNfQ1IyX05CWVRFU19Qb3MpICYgSTJDX0NSMl9OQllURVMpIHwgKHVpbnQzMl90KU1vZGUgfCAodWludDMyX3QpUmVxdWVzdCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgZW5hYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0VuYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpCit7CisgIHVpbnQzMl90IHRtcGlzciA9IDBVOworCisgIGlmICgoaGkyYy0+WGZlcklTUiA9PSBJMkNfTWFzdGVyX0lTUl9ETUEpIHx8IFwKKyAgICAgIChoaTJjLT5YZmVySVNSID09IEkyQ19TbGF2ZV9JU1JfRE1BKSkKKyAgeworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0xJU1RFTl9JVCkgPT0gSTJDX1hGRVJfTElTVEVOX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0sgYW5kIEFERFIgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0VSUk9SX0lUKSA9PSBJMkNfWEZFUl9FUlJPUl9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9OQUNLSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9DUExUX0lUKSA9PSBJMkNfWEZFUl9DUExUX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEk7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfUkVMT0FEX0lUKSA9PSBJMkNfWEZFUl9SRUxPQURfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIFRDIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfVENJOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9MSVNURU5fSVQpID09IEkyQ19YRkVSX0xJU1RFTl9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBTVE9QLCBOQUNLLCBhbmQgQUREUiBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0FERFJJIHwgSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0VSUkk7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfVFhfSVQpID09IEkyQ19YRkVSX1RYX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLIGFuZCBSWEkgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9UWEk7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfUlhfSVQpID09IEkyQ19YRkVSX1JYX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLIGFuZCBUWEkgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9SWEk7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfQ1BMVF9JVCkgPT0gSTJDX1hGRVJfQ1BMVF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlICovCisgIC8qIGFsbCBpbnRlcnJ1cHRzIHJlcXVlc3RlZCBkb25lICovCisgIF9fSEFMX0kyQ19FTkFCTEVfSVQoaGkyYywgdG1waXNyKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGRpc2FibGluZyBvZiBJbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJbnRlcnJ1cHRSZXF1ZXN0IFZhbHVlIG9mIEByZWYgSTJDX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24uCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRGlzYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpCit7CisgIHVpbnQzMl90IHRtcGlzciA9IDBVOworCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1RYX0lUKSA9PSBJMkNfWEZFUl9UWF9JVCkKKyAgeworICAgIC8qIERpc2FibGUgVEMgYW5kIFRYSSBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9UQ0kgfCBJMkNfSVRfVFhJOworCisgICAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pICE9ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIE5BQ0sgYW5kIFNUT1AgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICAgIH0KKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JYX0lUKSA9PSBJMkNfWEZFUl9SWF9JVCkKKyAgeworICAgIC8qIERpc2FibGUgVEMgYW5kIFJYSSBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9UQ0kgfCBJMkNfSVRfUlhJOworCisgICAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pICE9ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIE5BQ0sgYW5kIFNUT1AgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICAgIH0KKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0xJU1RFTl9JVCkgPT0gSTJDX1hGRVJfTElTVEVOX0lUKQorICB7CisgICAgLyogRGlzYWJsZSBBRERSLCBOQUNLIGFuZCBTVE9QIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX0FERFJJIHwgSTJDX0lUX1NUT1BJIHwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9FUlJPUl9JVCkgPT0gSTJDX1hGRVJfRVJST1JfSVQpCisgIHsKKyAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX0VSUkkgfCBJMkNfSVRfTkFDS0k7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9DUExUX0lUKSA9PSBJMkNfWEZFUl9DUExUX0lUKQorICB7CisgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9SRUxPQURfSVQpID09IEkyQ19YRkVSX1JFTE9BRF9JVCkKKyAgeworICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9UQ0k7CisgIH0KKworICAvKiBEaXNhYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIGEgYnJlYWtpbmcgc2l0dWF0aW9uIGxpa2UgYXQgInQiIHRpbWUgKi8KKyAgLyogYWxsIGRpc2FibGUgaW50ZXJydXB0cyByZXF1ZXN0IGFyZSBub3QgZG9uZSAqLworICBfX0hBTF9JMkNfRElTQUJMRV9JVChoaTJjLCB0bXBpc3IpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgSTJDeCBPVEhFUl94eHggWGZlck9wdGlvbnMgdG8gZnVuY3Rpb25uYWwgWGZlck9wdGlvbnMuCisgICogQHBhcmFtICBoaTJjIEkyQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIEkyQ19PVEhFUl9GUkFNRSAgICAgICAgICAgICovCisgIC8qIGl0IHJlcXVlc3QgaW1wbGljaXRseSB0byBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBJMkNfRklSU1RfRlJBTUUgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfT1RIRVJfRlJBTUUpCisgIHsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19GSVJTVF9GUkFNRTsKKyAgfQorICAvKiBlbHNlIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIEkyQ19PVEhFUl9BTkRfTEFTVF9GUkFNRSAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAqLworICAvKiB0aGVuIGdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gYXQgdGhlIGVuZCBvZiB0cmFuc2ZlciAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gSTJDX0ZJUlNUX0FORF9MQVNUX0ZSQU1FICAgICAgICAgICAgICAqLworICBlbHNlIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfT1RIRVJfQU5EX0xBU1RfRlJBTUUpCisgIHsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9pMmNfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX2kyY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDliOWUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9pMmNfZXguYwpAQCAtMCwwICsxLDMzMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfaTJjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIEkyQyBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIEkyQyBwZXJpcGhlcmFsIEV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dIENvbXBhcmluZyB0byBvdGhlciBwcmV2aW91cyBkZXZpY2VzLCB0aGUgSTJDIGludGVyZmFjZSBmb3IgU1RNMzJHMHh4CisgICAgICAgZGV2aWNlcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMKKworICAgICAgICgrKSBQb3NzaWJpbGl0eSB0byBkaXNhYmxlIG9yIGVuYWJsZSBBbmFsb2cgTm9pc2UgRmlsdGVyCisgICAgICAgKCspIFVzZSBvZiBhIGNvbmZpZ3VyZWQgRGlnaXRhbCBOb2lzZSBGaWx0ZXIKKyAgICAgICAoKykgRGlzYWJsZSBvciBlbmFibGUgd2FrZXVwIGZyb20gU3RvcCBtb2RlKHMpCisgICAgICAgKCspIERpc2FibGUgb3IgZW5hYmxlIEZhc3QgTW9kZSBQbHVzCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBOb2lzZSBGaWx0ZXIgYW5kIFdha2UgVXAgRmVhdHVyZQorICAgICgjKSBDb25maWd1cmUgSTJDIEFuYWxvZyBub2lzZSBmaWx0ZXIgdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIoKQorICAgICgjKSBDb25maWd1cmUgSTJDIERpZ2l0YWwgbm9pc2UgZmlsdGVyIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcigpCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgZW5hYmxlIG9yIGRpc2FibGUgb2YgSTJDIFdha2UgVXAgTW9kZSB1c2luZyB0aGUgZnVuY3Rpb25zIDoKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9FbmFibGVXYWtlVXAoKQorICAgICAgICAgICgrKykgSEFMX0kyQ0V4X0Rpc2FibGVXYWtlVXAoKQorICAgICgjKSBDb25maWd1cmUgdGhlIGVuYWJsZSBvciBkaXNhYmxlIG9mIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSB1c2luZyB0aGUgZnVuY3Rpb25zIDoKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9FbmFibGVGYXN0TW9kZVBsdXMoKQorICAgICAgICAgICgrKykgSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoKQorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeCBJMkNFeAorICAqIEBicmllZiBJMkMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0kyQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBOb2lzZSBGaWx0ZXJzCisgICAgICAoKykgQ29uZmlndXJlIFdha2UgVXAgRmVhdHVyZQorICAgICAgKCspIENvbmZpZ3VyZSBGYXN0IE1vZGUgUGx1cworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkMgQW5hbG9nIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDeCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgQW5hbG9nRmlsdGVyIE5ldyBzdGF0ZSBvZiB0aGUgQW5hbG9nIGZpbHRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9Db25maWdBbmFsb2dGaWx0ZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTkFMT0dfRklMVEVSKEFuYWxvZ0ZpbHRlcikpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogUmVzZXQgSTJDeCBBTk9GRiBiaXQgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH4oSTJDX0NSMV9BTkZPRkYpOworCisgICAgLyogU2V0IGFuYWxvZyBmaWx0ZXIgYml0Ki8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEFuYWxvZ0ZpbHRlcjsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSTJDIERpZ2l0YWwgbm9pc2UgZmlsdGVyLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkN4IHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIENvZWZmaWNpZW50IG9mIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgwRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9Db25maWdEaWdpdGFsRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19ESUdJVEFMX0ZJTFRFUihEaWdpdGFsRmlsdGVyKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJDX0RJU0FCTEUoaGkyYyk7CisKKyAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLworICAgIHRtcHJlZyA9IGhpMmMtPkluc3RhbmNlLT5DUjE7CisKKyAgICAvKiBSZXNldCBJMkN4IERORiBiaXRzIFsxMTo4XSAqLworICAgIHRtcHJlZyAmPSB+KEkyQ19DUjFfRE5GKTsKKworICAgIC8qIFNldCBJMkN4IERORiBjb2VmZmljaWVudCAqLworICAgIHRtcHJlZyB8PSBEaWdpdGFsRmlsdGVyIDw8IDhVOworCisgICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgPSB0bXByZWc7CisKKyAgICBfX0hBTF9JMkNfRU5BQkxFKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEkyQyB3YWtldXAgZnJvbSBTdG9wIG1vZGUocykuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9FbmFibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJDX0RJU0FCTEUoaGkyYyk7CisKKyAgICAvKiBFbmFibGUgd2FrZXVwIGZyb20gc3RvcCBtb2RlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1dVUEVOOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSTJDIHdha2V1cCBmcm9tIFN0b3AgbW9kZShzKS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDeCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0Rpc2FibGVXYWtlVXAoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJDX0RJU0FCTEUoaGkyYyk7CisKKyAgICAvKiBFbmFibGUgd2FrZXVwIGZyb20gc3RvcCBtb2RlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+KEkyQ19DUjFfV1VQRU4pOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5LgorICAqIEBwYXJhbSBDb25maWdGYXN0TW9kZVBsdXMgU2VsZWN0cyB0aGUgcGluLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgQHJlZiBJMkNFeF9GYXN0TW9kZVBsdXMgdmFsdWVzCisgICogQG5vdGUgIEZvciBJMkMxLCBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGVuYWJsZWQgb24gYWxsIHNlbGVjdGVkCisgICogICAgICAgIEkyQzEgcGlucyB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyIG9yIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgb24gZWFjaCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwaW5zIFBCNiwgUEI3LCBQQjggYW5kIFBCOS4KKyAgKiBAbm90ZSAgRm9yIHJlbWFpbmluZyBJMkMxIHBpbnMgKFBBMTQsIFBBMTUuLi4pIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQorICAqICAgICAgICBjYW4gYmUgZW5hYmxlZCBvbmx5IGJ5IHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMSBwYXJhbWV0ZXIuCisgICogQG5vdGUgIEZvciBhbGwgSTJDMiBwaW5zIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBjYW4gYmUgZW5hYmxlZAorICAqICAgICAgICBvbmx5IGJ5IHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMiBwYXJhbWV0ZXIuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMkNFeF9FbmFibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfRkFTVE1PREVQTFVTKENvbmZpZ0Zhc3RNb2RlUGx1cykpOworCisgIC8qIEVuYWJsZSBTWVNDRkcgY2xvY2sgKi8KKyAgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCk7CisKKyAgLyogRW5hYmxlIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBmb3Igc2VsZWN0ZWQgcGluICovCisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgKHVpbnQzMl90KUNvbmZpZ0Zhc3RNb2RlUGx1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5LgorICAqIEBwYXJhbSBDb25maWdGYXN0TW9kZVBsdXMgU2VsZWN0cyB0aGUgcGluLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgQHJlZiBJMkNFeF9GYXN0TW9kZVBsdXMgdmFsdWVzCisgICogQG5vdGUgIEZvciBJMkMxLCBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGRpc2FibGVkIG9uIGFsbCBzZWxlY3RlZAorICAqICAgICAgICBJMkMxIHBpbnMgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMxIHBhcmFtZXRlciBvciBpbmRlcGVuZGVudGx5CisgICogICAgICAgIG9uIGVhY2ggb25lIG9mIHRoZSBmb2xsb3dpbmcgcGlucyBQQjYsIFBCNywgUEI4IGFuZCBQQjkuCisgICogQG5vdGUgIEZvciByZW1haW5pbmcgSTJDMSBwaW5zIChQQTE0LCBQQTE1Li4uKSBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkKKyAgKiAgICAgICAgY2FuIGJlIGRpc2FibGVkIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMxIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgRm9yIGFsbCBJMkMyIHBpbnMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBkaXNhYmxlZAorICAqICAgICAgICBvbmx5IGJ5IHVzaW5nIEkyQ19GQVNUTU9ERVBMVVNfSTJDMiBwYXJhbWV0ZXIuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0ZBU1RNT0RFUExVUyhDb25maWdGYXN0TW9kZVBsdXMpKTsKKworICAvKiBFbmFibGUgU1lTQ0ZHIGNsb2NrICovCisgIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpOworCisgIC8qIERpc2FibGUgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGZvciBzZWxlY3RlZCBwaW4gKi8KKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsICh1aW50MzJfdClDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX2kycy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfaTJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkMzYzZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2kycy5jCkBAIC0wLDAgKzEsMTc5MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfaTJzLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEkyUyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJbnRlZ3JhdGVkIEludGVyY2hpcCBTb3VuZCAoSTJTKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGUgSTJTIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93OgorCisgICAgKCMpIERlY2xhcmUgYSBJMlNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBJMlMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnQgdGhlIEhBTF9JMlNfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIFNQSXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAoIyMpIEkyUyBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgSTJTIEdQSU9zLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIEkyUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLgorICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9JMlNfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfSTJTX1JlY2VpdmVfSVQoKSBBUElzKS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgSTJTeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgSTJTIElSUSBoYW5kbGUuCisgICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfSTJTX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9JMlNfUmVjZWl2ZV9ETUEoKSBBUElzOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggU3RyZWFtL0NoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZCBUeC9SeCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggU3RyZWFtL0NoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIEkyUyBETUEgVHgvUnggaGFuZGxlLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZQorICAgICAgICAgICAgICAgICAgRE1BIFR4L1J4IFN0cmVhbS9DaGFubmVsLgorCisgICAoIykgUHJvZ3JhbSB0aGUgTW9kZSwgU3RhbmRhcmQsIERhdGEgRm9ybWF0LCBNQ0xLIE91dHB1dCwgQXVkaW8gZnJlcXVlbmN5IGFuZCBQb2xhcml0eQorICAgICAgIHVzaW5nIEhBTF9JMlNfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAtQC0gVGhlIHNwZWNpZmljIEkyUyBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgIF9fSEFMX0kyU19FTkFCTEVfSVQoKSBhbmQgX19IQUxfSTJTX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisgICAtQC0gTWFrZSBzdXJlIHRoYXQgZWl0aGVyOgorICAgICAgICAoK0ApIFNZU0NMSyBpcyBjb25maWd1cmVkIG9yCisgICAgICAgICgrQCkgUExMUENMSyBvdXRwdXQgaXMgY29uZmlndXJlZCBvcgorICAgICAgICAoK0ApIEhTSSBpcyBlbmFibGVkIG9yCisgICAgICAgICgrQCkgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIGNvbmZpZ3VyZWQgYWZ0ZXIgc2V0dGluZyBjb3JyZWN0bHkKKyAgICAgICAgICAgICB0aGUgZGVmaW5lIGNvbnN0YW50IEVYVEVSTkFMX0kyUzFfQ0xPQ0tfVkFMVUUgaW4gdGhlIHN0bTMyZzB4eF9oYWxfY29uZi5oIGZpbGUuCisKKyAgICAoIykgVGhyZWUgbW9kZSBvZiBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJTX1RyYW5zbWl0KCkKKyAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJTX1JlY2VpdmUoKQorCisgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0kyU19UcmFuc21pdF9JVCgpCisgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjaworICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjaworICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSTJTX1JlY2VpdmVfSVQoKQorICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sKKyAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2sKKyAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9JMlNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19FcnJvckNhbGxiYWNrCisKKyAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX0kyU19UcmFuc21pdF9ETUEoKQorICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiBoYWxmIHRyYW5zZmVyIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sKKyAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0kyU19UeENwbHRDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2sKKyAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX0kyU19SZWNlaXZlX0RNQSgpCisgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIGhhbGYgdHJhbnNmZXIgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjaworICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0kyU19SeENwbHRDYWxsYmFjaworICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX0Vycm9yQ2FsbGJhY2sKKyAgICAgKCspIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX0kyU19ETUFQYXVzZSgpCisgICAgICgrKSBSZXN1bWUgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfSTJTX0RNQVJlc3VtZSgpCisgICAgICgrKSBTdG9wIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX0kyU19ETUFTdG9wKCkKKworICAgKioqIEkyUyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJMlMgSEFMIGRyaXZlci4KKworICAgICAgKCspIF9fSEFMX0kyU19FTkFCTEU6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkKKyAgICAgICgrKSBfX0hBTF9JMlNfRElTQUJMRTogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsIChpbiBJMlMgbW9kZSkKKyAgICAgICgrKSBfX0hBTF9JMlNfRU5BQkxFX0lUIDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgSTJTIGludGVycnVwdHMKKyAgICAgICgrKSBfX0hBTF9JMlNfRElTQUJMRV9JVCA6IERpc2FibGUgdGhlIHNwZWNpZmllZCBJMlMgaW50ZXJydXB0cworICAgICAgKCspIF9fSEFMX0kyU19HRVRfRkxBRzogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyUyBmbGFnIGlzIHNldCBvciBub3QKKworICAgIFsuLl0KKyAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBJMlMgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgICoqKiBJMlMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dCisgICAgICAgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uOgorCisgICAgICAoIykgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDFVCisgICAgICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgICAgICBVc2UgRnVuY3Rpb25zIEhBTF9JMlNfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKworICAgICAgICAgIEZ1bmN0aW9uIEhBTF9JMlNfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICAgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICA6IEkyUyBUeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgOiBJMlMgUnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgIDogSTJTIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgIDogSTJTIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogSTJTIEVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogSTJTIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogSTJTIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgICAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworCisgICAgICAoIykgVXNlIGZ1bmN0aW9uIEhBTF9JMlNfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICAgICAgIEhBTF9JMlNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogSTJTIFR4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IEkyUyBSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBJMlMgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBJMlMgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgOiBJMlMgRXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBJMlMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBJMlMgTXNwIERlSW5pdCBjYWxsYmFjaworCisgICAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9JMlNfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfSTJTX1NUQVRFX1JFU0VUCisgICAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICAgIGV4YW1wbGVzIEhBTF9JMlNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSwgSEFMX0kyU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpLgorICAgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgSEFMX0kyU19Jbml0KCkvIEhBTF9JMlNfRGVJbml0KCkgb25seSB3aGVuCisgICAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBIQUxfSTJTX0luaXQoKS8gSEFMX0kyU19EZUluaXQoKQorICAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorCisgICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfSTJTX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgICAgaW4gSEFMX0kyU19TVEFURV9SRUFEWSBvciBIQUxfSTJTX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICAgIHVzaW5nIEhBTF9JMlNfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9JMlNfRGVJbml0KCkKKyAgICAgICBvciBIQUxfSTJTX0luaXQoKSBmdW5jdGlvbi4KKworICAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKyNpZmRlZiBIQUxfSTJTX01PRFVMRV9FTkFCTEVECisKKyNpZiBkZWZpbmVkKFNQSV9JMlNfU1VQUE9SVCkKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJTIEkyUworICAqIEBicmllZiBJMlMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX1ByaXZhdGVfRnVuY3Rpb25zIEkyUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19ETUFSeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBJMlNfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19UcmFuc21pdF9JVChJMlNfSGFuZGxlVHlwZURlZiAqaGkycyk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIEkyU19SZWNlaXZlX0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiAgSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCAgSTJTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgICAgZGUtaW5pdGlhbGl6ZSB0aGUgSTJTeCBwZXJpcGhlcmFsIGluIHNpbXBsZXggbW9kZToKKworICAgICAgKCspIFVzZXIgbXVzdCBJbXBsZW1lbnQgSEFMX0kyU19Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9JMlNfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBNb2RlCisgICAgICAgICgrKykgU3RhbmRhcmQKKyAgICAgICAgKCsrKSBEYXRhIEZvcm1hdAorICAgICAgICAoKyspIE1DTEsgT3V0cHV0CisgICAgICAgICgrKykgQXVkaW8gZnJlcXVlbmN5CisgICAgICAgICgrKykgUG9sYXJpdHkKKworICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyU19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgSTJTeCBwZXJpcGhlcmFsLgorICBAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBJMlMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIEkyU19Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19Jbml0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICB1aW50MzJfdCBpMnNkaXY7CisgIHVpbnQzMl90IGkyc29kZDsKKyAgdWludDMyX3QgcGFja2V0bGVuZ3RoOworICB1aW50MzJfdCB0bXA7CisgIHVpbnQzMl90IGkyc2NsazsKKworICAvKiBDaGVjayB0aGUgSTJTIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaTJzID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIEkyUyBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMlNfQUxMX0lOU1RBTkNFKGhpMnMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfTU9ERShoaTJzLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyU19TVEFOREFSRChoaTJzLT5Jbml0LlN0YW5kYXJkKSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfREFUQV9GT1JNQVQoaGkycy0+SW5pdC5EYXRhRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfTUNMS19PVVRQVVQoaGkycy0+SW5pdC5NQ0xLT3V0cHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19JMlNfQVVESU9fRlJFUShoaTJzLT5Jbml0LkF1ZGlvRnJlcSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0NQT0woaGkycy0+SW5pdC5DUE9MKSk7CisKKyAgaWYgKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGkycy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgLyogSW5pdCB0aGUgSTJTIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgaGkycy0+VHhDcGx0Q2FsbGJhY2sgICAgICAgPSBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAqLworICAgIGhpMnMtPlJ4Q3BsdENhbGxiYWNrICAgICAgID0gSEFMX0kyU19SeENwbHRDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICBoaTJzLT5UeEhhbGZDcGx0Q2FsbGJhY2sgICA9IEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgaGkycy0+UnhIYWxmQ3BsdENhbGxiYWNrICAgPSBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgIGhpMnMtPkVycm9yQ2FsbGJhY2sgICAgICAgID0gSEFMX0kyU19FcnJvckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKworICAgIGlmIChoaTJzLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoaTJzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfSTJTX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgICBoaTJzLT5Nc3BJbml0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMgKi8KKyAgICBIQUxfSTJTX01zcEluaXQoaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfQlVTWTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTQ0ZHUiAmIEkyU1BSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENsZWFyIEkyU01PRCwgSTJTRSwgSTJTQ0ZHLCBQQ01TWU5DLCBJMlNTVEQsIENLUE9MLCBEQVRMRU4gYW5kIENITEVOIGJpdHMgKi8KKyAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSLCAoU1BJX0kyU0NGR1JfQ0hMRU4gfCBTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DS1BPTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTU1REIHwgU1BJX0kyU0NGR1JfUENNU1lOQyB8IFNQSV9JMlNDRkdSX0kyU0NGRyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTRSB8IFNQSV9JMlNDRkdSX0kyU01PRCkpOworICBoaTJzLT5JbnN0YW5jZS0+STJTUFIgPSAweDAwMDJVOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJTUFI6IEkyU0RJViBhbmQgT0REIENhbGN1bGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogSWYgdGhlIHJlcXVlc3RlZCBhdWRpbyBmcmVxdWVuY3kgaXMgbm90IHRoZSBkZWZhdWx0LCBjb21wdXRlIHRoZSBwcmVzY2FsZXIgKi8KKyAgaWYgKGhpMnMtPkluaXQuQXVkaW9GcmVxICE9IEkyU19BVURJT0ZSRVFfREVGQVVMVCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBmcmFtZSBsZW5ndGggKEZvciB0aGUgUHJlc2NhbGVyIGNvbXB1dGluZykgKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGhpMnMtPkluaXQuRGF0YUZvcm1hdCA9PSBJMlNfREFUQUZPUk1BVF8xNkIpCisgICAgeworICAgICAgLyogUGFja2V0IGxlbmd0aCBpcyAxNiBiaXRzICovCisgICAgICBwYWNrZXRsZW5ndGggPSAxNlU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQYWNrZXQgbGVuZ3RoIGlzIDMyIGJpdHMgKi8KKyAgICAgIHBhY2tldGxlbmd0aCA9IDMyVTsKKyAgICB9CisKKyAgICAvKiBJMlMgc3RhbmRhcmQgKi8KKyAgICBpZiAoaGkycy0+SW5pdC5TdGFuZGFyZCA8PSBJMlNfU1RBTkRBUkRfTFNCKQorICAgIHsKKyAgICAgIC8qIEluIEkyUyBzdGFuZGFyZCBwYWNrZXQgbGVuZ2h0IGlzIG11bHRpcGxpZWQgYnkgMiAqLworICAgICAgcGFja2V0bGVuZ3RoID0gcGFja2V0bGVuZ3RoICogMlU7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBzb3VyY2UgY2xvY2sgdmFsdWU6IGJhc2VkIG9uIFN5c3RlbSBDbG9jayB2YWx1ZSAqLworICAgIGkyc2NsayA9IEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxKFJDQ19QRVJJUEhDTEtfSTJTMSk7CisKKyAgICAvKiBDb21wdXRlIHRoZSBSZWFsIGRpdmlkZXIgZGVwZW5kaW5nIG9uIHRoZSBNQ0xLIG91dHB1dCBzdGF0ZSwgd2l0aCBhIGZsb2F0aW5nIHBvaW50ICovCisgICAgaWYgKGhpMnMtPkluaXQuTUNMS091dHB1dCA9PSBJMlNfTUNMS09VVFBVVF9FTkFCTEUpCisgICAgeworICAgICAgLyogTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCAqLworICAgICAgaWYgKGhpMnMtPkluaXQuRGF0YUZvcm1hdCAhPSBJMlNfREFUQUZPUk1BVF8xNkIpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MzJfdCkoKCgoKGkyc2NsayAvIChwYWNrZXRsZW5ndGggKiA0VSkpICogMTBVKSAvIGhpMnMtPkluaXQuQXVkaW9GcmVxKSkgKyA1VSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MzJfdCkoKCgoKGkyc2NsayAvIChwYWNrZXRsZW5ndGggKiA4VSkpICogMTBVKSAvIGhpMnMtPkluaXQuQXVkaW9GcmVxKSkgKyA1VSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBNQ0xLIG91dHB1dCBpcyBkaXNhYmxlZCAqLworICAgICAgdG1wID0gKHVpbnQzMl90KSgoKCgoaTJzY2xrIC8gcGFja2V0bGVuZ3RoKSAqIDEwVSkgLyBoaTJzLT5Jbml0LkF1ZGlvRnJlcSkpICsgNVUpOworICAgIH0KKworICAgIC8qIFJlbW92ZSB0aGUgZmxhdHRpbmcgcG9pbnQgKi8KKyAgICB0bXAgPSB0bXAgLyAxMFU7CisKKyAgICAvKiBDaGVjayB0aGUgcGFyaXR5IG9mIHRoZSBkaXZpZGVyICovCisgICAgaTJzb2RkID0gKHVpbnQzMl90KSh0bXAgJiAodWludDMyX3QpMVUpOworCisgICAgLyogQ29tcHV0ZSB0aGUgaTJzZGl2IHByZXNjYWxlciAqLworICAgIGkyc2RpdiA9ICh1aW50MzJfdCkoKHRtcCAtIGkyc29kZCkgLyAyVSk7CisKKyAgICAvKiBHZXQgdGhlIE1hc2sgZm9yIHRoZSBPZGQgYml0IChTUElfSTJTUFJbOF0pIHJlZ2lzdGVyICovCisgICAgaTJzb2RkID0gKHVpbnQzMl90KShpMnNvZGQgPDwgOFUpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBpMnNkaXYgPSAyVTsKKyAgICBpMnNvZGQgPSAwVTsKKyAgfQorCisgIC8qIFRlc3QgaWYgdGhlIGRpdmlkZXIgaXMgMSBvciAwIG9yIGdyZWF0ZXIgdGhhbiAweEZGICovCisgIGlmICgoaTJzZGl2IDwgMlUpIHx8IChpMnNkaXYgPiAweEZGVSkpCisgIHsKKyAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX1BSRVNDQUxFUik7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggSTJTQ0ZHUiAmIEkyU1BSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyogV3JpdGUgdG8gU1BJeCBJMlNQUiByZWdpc3RlciB0aGUgY29tcHV0ZWQgdmFsdWUgKi8KKyAgaGkycy0+SW5zdGFuY2UtPkkyU1BSID0gKHVpbnQzMl90KSgodWludDMyX3QpaTJzZGl2IHwgKHVpbnQzMl90KShpMnNvZGQgfCAodWludDMyX3QpaGkycy0+SW5pdC5NQ0xLT3V0cHV0KSk7CisKKyAgLyogQ2xlYXIgSTJTTU9ELCBJMlNFLCBJMlNDRkcsIFBDTVNZTkMsIEkyU1NURCwgQ0tQT0wsIERBVExFTiBhbmQgQ0hMRU4gYml0cyAqLworICAvKiBBbmQgY29uZmlndXJlIHRoZSBJMlMgd2l0aCB0aGUgSTJTX0luaXRTdHJ1Y3QgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IsIChTUElfSTJTQ0ZHUl9DSExFTiB8IFNQSV9JMlNDRkdSX0RBVExFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0NLUE9MIHwgU1BJX0kyU0NGR1JfSTJTU1REIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfUENNU1lOQyB8IFNQSV9JMlNDRkdSX0kyU0NGRyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9JMlNDRkdSX0kyU0UgIHwgU1BJX0kyU0NGR1JfSTJTTU9EKSwgXAorICAgICAgICAgICAgIChTUElfSTJTQ0ZHUl9JMlNNT0QgfCBoaTJzLT5Jbml0Lk1vZGUgfCBcCisgICAgICAgICAgICAgIGhpMnMtPkluaXQuU3RhbmRhcmQgfCBoaTJzLT5Jbml0LkRhdGFGb3JtYXQgfCBcCisgICAgICAgICAgICAgIGhpMnMtPkluaXQuQ1BPTCkpOworCisjaWYgZGVmaW5lZChTUElfSTJTQ0ZHUl9BU1RSVEVOKQorICBpZiAoKGhpMnMtPkluaXQuU3RhbmRhcmQgPT0gSTJTX1NUQU5EQVJEX1BDTV9TSE9SVCkgfHwgKChoaTJzLT5Jbml0LlN0YW5kYXJkID09IEkyU19TVEFOREFSRF9QQ01fTE9ORykpKQorICB7CisgICAgLyogV3JpdGUgdG8gU1BJeCBJMlNDRkdSICovCisgICAgU0VUX0JJVChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfQVNUUlRFTik7CisgIH0KKyNlbmRpZgorCisgIGhpMnMtPkVycm9yQ29kZSA9IEhBTF9JMlNfRVJST1JfTk9ORTsKKyAgaGkycy0+U3RhdGUgICAgID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplcyB0aGUgSTJTIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19EZUluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIENoZWNrIHRoZSBJMlMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhpMnMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FMTF9JTlNUQU5DRShoaTJzLT5JbnN0YW5jZSkpOworCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIEkyUyBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX0kyU19ESVNBQkxFKGhpMnMpOworCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhpMnMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoaTJzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JMlNfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgaGkycy0+TXNwRGVJbml0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgSEFMX0kyU19Nc3BEZUluaXQoaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5TdGF0ZSAgICAgPSBIQUxfSTJTX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkycyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEkyUyBNU1AgSW5pdAorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJTX01zcEluaXQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIEkyUyBNU1AgRGVJbml0CisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfTXNwRGVJbml0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBJMlMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoaTJzIFBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyUy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19SZWdpc3RlckNhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCBIQUxfSTJTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBJMlNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhpMnMtPkVycm9yQ29kZSB8PSBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYgKEhBTF9JMlNfU1RBVEVfUkVBRFkgPT0gaGkycy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfSTJTX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkycy0+VHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19UWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkycy0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaTJzLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkycy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9JMlNfU1RBVEVfUkVTRVQgPT0gaGkycy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfSTJTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGkycy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gSTJTIENhbGxiYWNrCisgICogICAgICAgICBJMlMgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoaTJzIFBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyUy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19VblJlZ2lzdGVyQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIEhBTF9JMlNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYgKEhBTF9JMlNfU1RBVEVfUkVBRFkgPT0gaGkycy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfSTJTX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkycy0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkycy0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJzLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMlNfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMnMtPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhpMnMtPkVycm9yQ2FsbGJhY2sgPSBIQUxfSTJTX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkycy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMnMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyU19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0kyU19TVEFURV9SRVNFVCA9PSBoaTJzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMlNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMnMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JMlNfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaTJzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JMlNfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJMlMgZGF0YQorICAgIHRyYW5zZmVycy4KKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgVGhlIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgIG9yIERNQS4gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBzdGFydHVwLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgSTJTIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyU19UcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX0kyU19SZWNlaXZlKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKyspIEhBTF9JMlNfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9JMlNfUmVjZWl2ZV9JVCgpCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBETUEgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJTX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyU19SZWNlaXZlX0RNQSgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBub24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1RyYW5zbWl0KEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRtcHJlZ19jZmdyOworCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworCisgIGlmIChoaTJzLT5TdGF0ZSAhPSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFNldCBzdGF0ZSBhbmQgcmVzZXQgZXJyb3IgY29kZSAqLworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfQlVTWV9UWDsKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5wVHhCdWZmUHRyID0gcERhdGE7CisKKyAgdG1wcmVnX2NmZ3IgPSBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTik7CisKKyAgaWYgKCh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8yNEIpIHx8ICh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICB7CisgICAgaGkycy0+VHhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIH0KKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSOworCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMlNfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoaTJzLCBJMlNfRkxBR19UWEUsIFNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgd2hpbGUgKGhpMnMtPlR4WGZlckNvdW50ID4gMFUpCisgIHsKKyAgICBoaTJzLT5JbnN0YW5jZS0+RFIgPSAoKmhpMnMtPnBUeEJ1ZmZQdHIpOworICAgIGhpMnMtPnBUeEJ1ZmZQdHIrKzsKKyAgICBoaTJzLT5UeFhmZXJDb3VudC0tOworCisgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfVFhFLCBTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX1RJTUVPVVQpOworICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBhbiB1bmRlcnJ1biBvY2N1cnMgKi8KKyAgICBpZiAoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEkyU19GTEFHX1VEUikgPT0gU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHVuZGVycnVuIGZsYWcgKi8KKyAgICAgIF9fSEFMX0kyU19DTEVBUl9VRFJGTEFHKGhpMnMpOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX1VEUik7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgU2xhdmUgbW9kZSBpcyBzZWxlY3RlZCAqLworICBpZiAoKCh0bXByZWdfY2ZnciAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfU0xBVkVfVFgpIHx8ICgodG1wcmVnX2NmZ3IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX1NMQVZFX1JYKSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgQnVzeSBmbGFnIGlzIHJlc2V0ICovCisgICAgaWYgKEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhpMnMsIEkyU19GTEFHX0JTWSwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX1RJTUVPVVQpOworICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQG5vdGUgICBJbiBJMlMgTWFzdGVyIFJlY2VpdmVyIG1vZGUsIGp1c3QgYWZ0ZXIgZW5hYmxpbmcgdGhlIHBlcmlwaGVyYWwgdGhlIGNsb2NrIHdpbGwgYmUgZ2VuZXJhdGUKKyAgKiAgICAgICAgIGluIGNvbnRpbnVvdXMgd2F5IGFuZCBhcyB0aGUgSTJTIGlzIG5vdCBkaXNhYmxlZCBhdCB0aGUgZW5kIG9mIHRoZSBJMlMgdHJhbnNhY3Rpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmUoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdG1wcmVnX2NmZ3I7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIE1hc3RlciBSZWNlaXZlciBtb2RlIGlzIHNlbGVjdGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNDRkcpID09IEkyU19NT0RFX01BU1RFUl9SWCkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIEZsYWcgYnkgYSByZWFkIG9wZXJhdGlvbiBvbiB0aGUgU1BJX0RSIHJlZ2lzdGVyIGZvbGxvd2VkIGJ5IGEgcmVhZAorICAgIGFjY2VzcyB0byB0aGUgU1BJX1NSIHJlZ2lzdGVyLiAqLworICAgIF9fSEFMX0kyU19DTEVBUl9PVlJGTEFHKGhpMnMpOworICB9CisKKyAgLyogUmVjZWl2ZSBkYXRhICovCisgIHdoaWxlIChoaTJzLT5SeFhmZXJDb3VudCA+IDBVKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhpMnMsIEkyU19GTEFHX1JYTkUsIFNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgICgqaGkycy0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpaGkycy0+SW5zdGFuY2UtPkRSOworICAgIGhpMnMtPnBSeEJ1ZmZQdHIrKzsKKyAgICBoaTJzLT5SeFhmZXJDb3VudC0tOworCisgICAgLyogQ2hlY2sgaWYgYW4gb3ZlcnJ1biBvY2N1cnMgKi8KKyAgICBpZiAoX19IQUxfSTJTX0dFVF9GTEFHKGhpMnMsIEkyU19GTEFHX09WUikgPT0gU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIG92ZXJydW4gZmxhZyAqLworICAgICAgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoaGkycyk7CisKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfT1ZSKTsKKyAgICB9CisgIH0KKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBudW1iZXIgb2YgZGF0YSBzYW1wbGUgdG8gYmUgc2VudDoKKyAgKiBAbm90ZSAgIFdoZW4gYSAxNi1iaXQgZGF0YSBmcmFtZSBvciBhIDE2LWJpdCBkYXRhIGZyYW1lIGV4dGVuZGVkIGlzIHNlbGVjdGVkIGR1cmluZyB0aGUgSTJTCisgICogICAgICAgICBjb25maWd1cmF0aW9uIHBoYXNlLCB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGgKKyAgKiAgICAgICAgIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgd2hlbiBhIDI0LWJpdCBkYXRhIGZyYW1lIG9yIGEgMzItYml0IGRhdGEgZnJhbWUgaXMgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHRoZSBTaXplIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBkYXRhIGxlbmd0aC4KKyAgKiBAbm90ZSAgIFRoZSBJMlMgaXMga2VwdCBlbmFibGVkIGF0IHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdG8gYXZvaWQgdGhlIGNsb2NrIGRlLXN5bmNocm9uaXphdGlvbgorICAqICAgICAgICAgYmV0d2VlbiBNYXN0ZXIgYW5kIFNsYXZlKGV4YW1wbGU6IGF1ZGlvIHN0cmVhbWluZykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1RyYW5zbWl0X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzLCB1aW50MTZfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRtcHJlZ19jZmdyOworCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworCisgIGlmIChoaTJzLT5TdGF0ZSAhPSBIQUxfSTJTX1NUQVRFX1JFQURZKQorICB7CisgICAgX19IQUxfVU5MT0NLKGhpMnMpOworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFNldCBzdGF0ZSBhbmQgcmVzZXQgZXJyb3IgY29kZSAqLworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfQlVTWV9UWDsKKyAgaGkycy0+RXJyb3JDb2RlID0gSEFMX0kyU19FUlJPUl9OT05FOworICBoaTJzLT5wVHhCdWZmUHRyID0gcERhdGE7CisKKyAgdG1wcmVnX2NmZ3IgPSBoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIChTUElfSTJTQ0ZHUl9EQVRMRU4gfCBTUElfSTJTQ0ZHUl9DSExFTik7CisKKyAgaWYgKCh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8yNEIpIHx8ICh0bXByZWdfY2ZnciA9PSBJMlNfREFUQUZPUk1BVF8zMkIpKQorICB7CisgICAgaGkycy0+VHhYZmVyU2l6ZSA9IChTaXplIDw8IDFVKTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IChTaXplIDw8IDFVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIH0KKworICAvKiBFbmFibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9UWEUgfCBJMlNfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0UpICE9IFNQSV9JMlNDRkdSX0kyU0UpCisgIHsKKyAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICB9CisKKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byB0aGUgUmVjZWl2ZSBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQG5vdGUgICBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiAgICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEBub3RlICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIERNQSBmb3IgdGhlIEkyUyByZWNlaXZlciB0byBhdm9pZCBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiBiZXR3ZWVuIE1hc3RlciBhbmQgU2xhdmUgb3RoZXJ3aXNlIHRoZSBJMlMgaW50ZXJydXB0IHNob3VsZCBiZSBvcHRpbWl6ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX1JlY2VpdmVfSVQoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdG1wcmVnX2NmZ3I7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1JYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5SeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIEVuYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX0kyU19FTkFCTEVfSVQoaGkycywgKEkyU19JVF9SWE5FIHwgSTJTX0lUX0VSUikpOworCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiBTUElfSTJTQ0ZHUl9JMlNFKSAhPSBTUElfSTJTQ0ZHUl9JMlNFKQorICB7CisgICAgLyogRW5hYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0VOQUJMRShoaTJzKTsKKyAgfQorCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQQorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBwRGF0YSBhIDE2LWJpdCBwb2ludGVyIHRvIHRoZSBUcmFuc21pdCBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQG5vdGUgICBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiAgICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19UcmFuc21pdF9ETUEoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMsIHVpbnQxNl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdG1wcmVnX2NmZ3I7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkycyk7CisKKyAgaWYgKGhpMnMtPlN0YXRlICE9IEhBTF9JMlNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogU2V0IHN0YXRlIGFuZCByZXNldCBlcnJvciBjb2RlICovCisgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9CVVNZX1RYOworICBoaTJzLT5FcnJvckNvZGUgPSBIQUxfSTJTX0VSUk9SX05PTkU7CisgIGhpMnMtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKworICB0bXByZWdfY2ZnciA9IGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSICYgKFNQSV9JMlNDRkdSX0RBVExFTiB8IFNQSV9JMlNDRkdSX0NITEVOKTsKKworICBpZiAoKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzI0QikgfHwgKHRtcHJlZ19jZmdyID09IEkyU19EQVRBRk9STUFUXzMyQikpCisgIHsKKyAgICBoaTJzLT5UeFhmZXJTaXplID0gKFNpemUgPDwgMVUpOworICAgIGhpMnMtPlR4WGZlckNvdW50ID0gKFNpemUgPDwgMVUpOworICB9CisgIGVsc2UKKyAgeworICAgIGhpMnMtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhpMnMtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgfQorCisgIC8qIFNldCB0aGUgSTJTIFR4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpMnMtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJMlNfRE1BVHhIYWxmQ3BsdDsKKworICAvKiBTZXQgdGhlIEkyUyBUeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGkycy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJTX0RNQVR4Q3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoaTJzLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJTX0RNQUVycm9yOworCisgIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbS9DaGFubmVsICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoaTJzLT5oZG1hdHgsICh1aW50MzJfdCloaTJzLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhpMnMtPkluc3RhbmNlLT5EUiwgaGkycy0+VHhYZmVyU2l6ZSkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9ETUEpOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIEkyUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKyAgeworICAgIC8qIEVuYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGUgSTJTIFR4IHJlcXVlc3QgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoaTJzLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKQorICB7CisgICAgLyogRW5hYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgU0VUX0JJVChoaTJzLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworICB9CisKKyAgX19IQUxfVU5MT0NLKGhpMnMpOworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEBwYXJhbSAgcERhdGEgYSAxNi1iaXQgcG9pbnRlciB0byB0aGUgUmVjZWl2ZSBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgbnVtYmVyIG9mIGRhdGEgc2FtcGxlIHRvIGJlIHNlbnQ6CisgICogQG5vdGUgICBXaGVuIGEgMTYtYml0IGRhdGEgZnJhbWUgb3IgYSAxNi1iaXQgZGF0YSBmcmFtZSBleHRlbmRlZCBpcyBzZWxlY3RlZCBkdXJpbmcgdGhlIEkyUworICAqICAgICAgICAgY29uZmlndXJhdGlvbiBwaGFzZSwgdGhlIFNpemUgcGFyYW1ldGVyIG1lYW5zIHRoZSBudW1iZXIgb2YgMTYtYml0IGRhdGEgbGVuZ3RoCisgICogICAgICAgICBpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIHdoZW4gYSAyNC1iaXQgZGF0YSBmcmFtZSBvciBhIDMyLWJpdCBkYXRhIGZyYW1lIGlzIHNlbGVjdGVkCisgICogICAgICAgICB0aGUgU2l6ZSBwYXJhbWV0ZXIgbWVhbnMgdGhlIG51bWJlciBvZiAxNi1iaXQgZGF0YSBsZW5ndGguCisgICogQG5vdGUgICBUaGUgSTJTIGlzIGtlcHQgZW5hYmxlZCBhdCB0aGUgZW5kIG9mIHRyYW5zYWN0aW9uIHRvIGF2b2lkIHRoZSBjbG9jayBkZS1zeW5jaHJvbml6YXRpb24KKyAgKiAgICAgICAgIGJldHdlZW4gTWFzdGVyIGFuZCBTbGF2ZShleGFtcGxlOiBhdWRpbyBzdHJlYW1pbmcpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19SZWNlaXZlX0RNQShJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDE2X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0bXByZWdfY2ZncjsKKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoaGkycy0+U3RhdGUgIT0gSEFMX0kyU19TVEFURV9SRUFEWSkKKyAgeworICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKworICAvKiBTZXQgc3RhdGUgYW5kIHJlc2V0IGVycm9yIGNvZGUgKi8KKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX0JVU1lfUlg7CisgIGhpMnMtPkVycm9yQ29kZSA9IEhBTF9JMlNfRVJST1JfTk9ORTsKKyAgaGkycy0+cFJ4QnVmZlB0ciA9IHBEYXRhOworCisgIHRtcHJlZ19jZmdyID0gaGkycy0+SW5zdGFuY2UtPkkyU0NGR1IgJiAoU1BJX0kyU0NGR1JfREFUTEVOIHwgU1BJX0kyU0NGR1JfQ0hMRU4pOworCisgIGlmICgodG1wcmVnX2NmZ3IgPT0gSTJTX0RBVEFGT1JNQVRfMjRCKSB8fCAodG1wcmVnX2NmZ3IgPT0gSTJTX0RBVEFGT1JNQVRfMzJCKSkKKyAgeworICAgIGhpMnMtPlJ4WGZlclNpemUgPSAoU2l6ZSA8PCAxVSk7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSAoU2l6ZSA8PCAxVSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaGkycy0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSBTaXplOworICB9CisKKyAgLyogU2V0IHRoZSBJMlMgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGkycy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEkyU19ETUFSeEhhbGZDcGx0OworCisgIC8qIFNldCB0aGUgSTJTIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaTJzLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMlNfRE1BUnhDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGhpMnMtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMlNfRE1BRXJyb3I7CisKKyAgLyogQ2hlY2sgaWYgTWFzdGVyIFJlY2VpdmVyIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgaWYgKChoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiAmIFNQSV9JMlNDRkdSX0kyU0NGRykgPT0gSTJTX01PREVfTUFTVEVSX1JYKQorICB7CisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gRmxhZyBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIHRoZSBTUElfRFIgcmVnaXN0ZXIgZm9sbG93ZWQgYnkgYSByZWFkCisgICAgYWNjZXNzIHRvIHRoZSBTUElfU1IgcmVnaXN0ZXIuICovCisgICAgX19IQUxfSTJTX0NMRUFSX09WUkZMQUcoaGkycyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaGkycy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMnMtPkluc3RhbmNlLT5EUiwgKHVpbnQzMl90KWhpMnMtPnBSeEJ1ZmZQdHIsIGhpMnMtPlJ4WGZlclNpemUpKQorICB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgICBfX0hBTF9VTkxPQ0soaGkycyk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBJMlMgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoaTJzLT5JbnN0YW5jZS0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTRSkpCisgIHsKKyAgICAvKiBFbmFibGUgSTJTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMlNfRU5BQkxFKGhpMnMpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIEkyUyBSeCByZXF1ZXN0IGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgeworICAgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICAgIFNFVF9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKyAgfQorCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBQYXVzZXMgdGhlIGF1ZGlvIERNQSBTdHJlYW0vQ2hhbm5lbCBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVBhdXNlKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMnMpOworCisgIGlmIChoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKyAgfQorICBlbHNlIGlmIChoaTJzLT5TdGF0ZSA9PSBIQUxfSTJTX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZXMgdGhlIGF1ZGlvIERNQSBTdHJlYW0vQ2hhbm5lbCBwbGF5aW5nIGZyb20gdGhlIE1lZGlhLgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJTX0RNQVJlc3VtZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJzKTsKKworICBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJMlMgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisgIH0KKyAgZWxzZSBpZiAoaGkycy0+U3RhdGUgPT0gSEFMX0kyU19TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJMlMgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogSWYgdGhlIEkyUyBwZXJpcGhlcmFsIGlzIHN0aWxsIG5vdCBlbmFibGVkLCBlbmFibGUgaXQgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhpMnMtPkluc3RhbmNlLT5JMlNDRkdSLCBTUElfSTJTQ0ZHUl9JMlNFKSkKKyAgeworICAgIC8qIEVuYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyU19FTkFCTEUoaGkycyk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBhdWRpbyBETUEgU3RyZWFtL0NoYW5uZWwgcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyU19ETUFTdG9wKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgU1BJIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX0kyU19UeENwbHRDYWxsYmFjaygpIG9yIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soKQorICAgICB3aGVuIGNhbGxpbmcgSEFMX0RNQV9BYm9ydCgpIEFQSSB0aGUgRE1BIFRYIG9yIFJYIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQKKyAgICAgYW5kIHRoZSBjb3JyZXNwb25kIGNhbGwgYmFjayBpcyBleGVjdXRlZCBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX0kyU19SeENwbHRDYWxsYmFjaygpCisgICAgICovCisKKyAgLyogRGlzYWJsZSB0aGUgSTJTIFR4L1J4IERNQSByZXF1ZXN0cyAqLworICBDTEVBUl9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKyAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogQWJvcnQgdGhlIEkyUyBETUEgdHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgaWYgKGhpMnMtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hdHgpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0RNQSk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogQWJvcnQgdGhlIEkyUyBETUEgcnggU3RyZWFtL0NoYW5uZWwgKi8KKyAgaWYgKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hcngpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0RNQSk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSBJMlMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9JMlNfRElTQUJMRShoaTJzKTsKKworICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJTIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMlNfSVJRSGFuZGxlcihJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgdWludDMyX3QgaXRzb3VyY2UgPSBoaTJzLT5JbnN0YW5jZS0+Q1IyOworICB1aW50MzJfdCBpdGZsYWcgICA9IGhpMnMtPkluc3RhbmNlLT5TUjsKKworICAvKiBJMlMgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKEkyU19DSEVDS19GTEFHKGl0ZmxhZywgSTJTX0ZMQUdfT1ZSKSA9PSBSRVNFVCkgJiYKKyAgICAgIChJMlNfQ0hFQ0tfRkxBRyhpdGZsYWcsIEkyU19GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoSTJTX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgSTJTX0lUX1JYTkUpICE9IFJFU0VUKSkKKyAgeworICAgIEkyU19SZWNlaXZlX0lUKGhpMnMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEkyUyBpbiBtb2RlIFRyYW1pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoSTJTX0NIRUNLX0ZMQUcoaXRmbGFnLCBJMlNfRkxBR19UWEUpICE9IFJFU0VUKSAmJiAoSTJTX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgSTJTX0lUX1RYRSkgIT0gUkVTRVQpKQorICB7CisgICAgSTJTX1RyYW5zbWl0X0lUKGhpMnMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEkyUyBpbnRlcnJ1cHQgZXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChJMlNfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBJMlNfSVRfRVJSKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEkyUyBPdmVycnVuIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChJMlNfQ0hFQ0tfRkxBRyhpdGZsYWcsIEkyU19GTEFHX09WUikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9PVlIpOworICAgIH0KKworICAgIC8qIEkyUyBVbmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChJMlNfQ0hFQ0tfRkxBRyhpdGZsYWcsIEkyU19GTEFHX1VEUikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgYW5kIGV4ZWN1dGUgZXJyb3IgY2FsbGJhY2sqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVURSKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIEkyUyBTdGF0ZSByZWFkeSAqLworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaGkycy0+RXJyb3JDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgICAgSEFMX0kyU19FcnJvckNhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgSGFsZiBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfVHhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19UeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgaGFsZiBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfUnhIYWxmQ3BsdENhbGxiYWNrKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyU19SeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMlNfUnhDcGx0Q2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSTJTIGVycm9yIGNhbGxiYWNrcworICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMnMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJTX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMlNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJTIHN0YXRlCisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0kyU19TdGF0ZVR5cGVEZWYgSEFMX0kyU19HZXRTdGF0ZShJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKK3sKKyAgcmV0dXJuIGhpMnMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgSTJTIGVycm9yIGNvZGUKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgSTJTIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9JMlNfR2V0RXJyb3IoSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMpCit7CisgIHJldHVybiBoaTJzLT5FcnJvckNvZGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX1ByaXZhdGVfRnVuY3Rpb25zIEkyUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMgPSAoSTJTX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIGlmIERNQSBpcyBjb25maWd1cmVkIGluIERNQV9OT1JNQUwgTW9kZSAqLworICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpCisgIHsKKyAgICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgICBoaTJzLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgfQorICAvKiBDYWxsIHVzZXIgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoaTJzLT5UeENwbHRDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyUyB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiAqaGkycyA9IChJMlNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogQ2FsbCB1c2VyIFR4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoaTJzLT5UeEhhbGZDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX1R4SGFsZkNwbHRDYWxsYmFjayhoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJTIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMgPSAoSTJTX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIGlmIERNQSBpcyBjb25maWd1cmVkIGluIERNQV9OT1JNQUwgTW9kZSAqLworICBpZiAoaGRtYS0+SW5pdC5Nb2RlID09IERNQV9OT1JNQUwpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisgICAgaGkycy0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgIH0KKyAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaGkycy0+UnhDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrKGhpMnMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMlMgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMlNfSGFuZGxlVHlwZURlZiAqaGkycyA9IChJMlNfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogQ2FsbCB1c2VyIFJ4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoaTJzLT5SeEhhbGZDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX1J4SGFsZkNwbHRDYWxsYmFjayhoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJTIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJTX0hhbmRsZVR5cGVEZWYgKmhpMnMgPSAoSTJTX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgUnggYW5kIFR4IERNQSBSZXF1ZXN0ICovCisgIENMRUFSX0JJVChoaTJzLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9SWERNQUVOIHwgU1BJX0NSMl9UWERNQUVOKSk7CisgIGhpMnMtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpMnMtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworCisgIC8qIFNldCB0aGUgZXJyb3IgY29kZSBhbmQgZXhlY3V0ZSBlcnJvciBjYWxsYmFjayovCisgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX0RNQSk7CisgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhpMnMtPkVycm9yQ2FsbGJhY2soaGkycyk7CisjZWxzZQorICBIQUxfSTJTX0Vycm9yQ2FsbGJhY2soaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMnMgcG9pbnRlciB0byBhIEkyU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJTIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJTX1RyYW5zbWl0X0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBUcmFuc21pdCBkYXRhICovCisgIGhpMnMtPkluc3RhbmNlLT5EUiA9ICgqaGkycy0+cFR4QnVmZlB0cik7CisgIGhpMnMtPnBUeEJ1ZmZQdHIrKzsKKyAgaGkycy0+VHhYZmVyQ291bnQtLTsKKworICBpZiAoaGkycy0+VHhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX0kyU19ESVNBQkxFX0lUKGhpMnMsIChJMlNfSVRfVFhFIHwgSTJTX0lUX0VSUikpOworCisgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgIC8qIENhbGwgdXNlciBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaGkycy0+VHhDcGx0Q2FsbGJhY2soaGkycyk7CisjZWxzZQorICAgIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soaGkycyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMlNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQHBhcmFtICBoaTJzIHBvaW50ZXIgdG8gYSBJMlNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIEkyUyBtb2R1bGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyU19SZWNlaXZlX0lUKEkyU19IYW5kbGVUeXBlRGVmICpoaTJzKQoreworICAvKiBSZWNlaXZlIGRhdGEgKi8KKyAgKCpoaTJzLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloaTJzLT5JbnN0YW5jZS0+RFI7CisgIGhpMnMtPnBSeEJ1ZmZQdHIrKzsKKyAgaGkycy0+UnhYZmVyQ291bnQtLTsKKworICBpZiAoaGkycy0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9JMlNfRElTQUJMRV9JVChoaTJzLCAoSTJTX0lUX1JYTkUgfCBJMlNfSVRfRVJSKSk7CisKKyAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoaTJzLT5SeENwbHRDYWxsYmFjayhoaTJzKTsKKyNlbHNlCisgICAgSEFMX0kyU19SeENwbHRDYWxsYmFjayhoaTJzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMlMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGkycyBwb2ludGVyIHRvIGEgSTJTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBJMlMgbW9kdWxlCisgICogQHBhcmFtICBGbGFnIEZsYWcgY2hlY2tlZAorICAqIEBwYXJhbSAgU3RhdGUgVmFsdWUgb2YgdGhlIGZsYWcgZXhwZWN0ZWQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgRHVyYXRpb24gb2YgdGhlIHRpbWVvdXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMlNfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChJMlNfSGFuZGxlVHlwZURlZiAqaGkycywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEdldCB0aWNrICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCB0byBzdGF0dXMqLworICB3aGlsZSAoKChfX0hBTF9JMlNfR0VUX0ZMQUcoaGkycywgRmxhZykpID8gU0VUIDogUkVTRVQpICE9IFN0YXRlKQorICB7CisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJzKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogU1BJX0kyU19TVVBQT1JUICovCisKKyNlbmRpZiAvKiBIQUxfSTJTX01PRFVMRV9FTkFCTEVEICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9pcmRhLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9pcmRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxYzM1MwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2lyZGEuYwpAQCAtMCwwICsxLDI5NTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2lyZGEuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSVJEQSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJckRBIChJbmZyYXJlZCBEYXRhIEFzc29jaWF0aW9uKSBQZXJpcGhlcmFsCisgICogICAgICAgICAgKElSREEpCisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgSVJEQSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIElSREFfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gSVJEQV9IYW5kbGVUeXBlRGVmIGhpcmRhKS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgSVJEQSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX0lSREFfTXNwSW5pdCgpIEFQSQorICAgICAgICBpbiBzZXR0aW5nIHRoZSBhc3NvY2lhdGVkIFVTQVJUIG9yIFVBUlQgaW4gSVJEQSBtb2RlOgorICAgICAgICAoKyspIEVuYWJsZSB0aGUgVVNBUlR4L1VBUlR4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgKCsrKSBVU0FSVHgvVUFSVHggcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFVTQVJUeC9VQVJUeCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVU0FSVHgvVUFSVHggcGlucyAoVFggYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAsIFJYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBJbnB1dCkuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX0lSREFfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfSVJEQV9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeC9VQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlR4L1VBUlR4IElSUSBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBUaGUgc3BlY2lmaWMgSVJEQSBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgICAgICBfX0hBTF9JUkRBX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9JUkRBX1JlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIElSREEgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisKKyAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCBhbmQgUGFyaXR5IGFuZCBNb2RlKFJlY2VpdmVyL1RyYW5zbWl0dGVyKSwKKyAgICAgICAgdGhlIG5vcm1hbCBvciBsb3cgcG93ZXIgbW9kZSBhbmQgdGhlIGNsb2NrIHByZXNjYWxlciBpbiB0aGUgaGlyZGEgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIElSREEgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9JUkRBX0luaXQoKSBBUEk6CisgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9JUkRBX01zcEluaXQoKSBBUEkuCisKKyAgICAgICAgIC1AQC0gVGhlIHNwZWNpZmljIElSREEgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICBSWE5FIGludGVycnVwdCBhbmQgRXJyb3IgSW50ZXJydXB0cykgd2lsbCBiZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MKKyAgICAgICAgICAgICBfX0hBTF9JUkRBX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9JUkRBX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICAoIykgVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JUkRBX1RyYW5zbWl0KCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9JUkRBX1JlY2VpdmUoKQorCisgICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdF9JVCgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlX0lUKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBoYWxmIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9JUkRBX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGhhbGYgb2YgdHJhbnNmZXIgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICoqKiBJUkRBIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBJUkRBIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfSVJEQV9FTkFCTEU6IEVuYWJsZSB0aGUgSVJEQSBwZXJpcGhlcmFsCisgICAgICAgKCspIF9fSEFMX0lSREFfRElTQUJMRTogRGlzYWJsZSB0aGUgSVJEQSBwZXJpcGhlcmFsCisgICAgICAgKCspIF9fSEFMX0lSREFfR0VUX0ZMQUcgOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJEQSBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICAoKykgX19IQUxfSVJEQV9DTEVBUl9GTEFHIDogQ2xlYXIgdGhlIHNwZWNpZmllZCBJUkRBIHBlbmRpbmcgZmxhZworICAgICAgICgrKSBfX0hBTF9JUkRBX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfSVJEQV9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfSVJEQV9HRVRfSVRfU09VUkNFOiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IGlzIGVuYWJsZWQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIElSREEgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9JUkRBX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suCisgICAgRnVuY3Rpb24gQHJlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogVHggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgOiBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogSVJEQSBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogSVJEQSBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBJUkRBIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgOiBJUkRBIE1zcERlSW5pdC4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfSVJEQV9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9JUkRBX1NUQVRFX1JFU0VUCisgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczoKKyAgICBleGFtcGxlcyBAcmVmIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0lSREFfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX0lSREFfRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9JUkRBX0luaXQoKSBhbmQgQHJlZiBIQUxfSVJEQV9EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfSVJEQV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgaW4gSEFMX0lSREFfU1RBVEVfUkVBRFkgb3IgSEFMX0lSREFfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfSVJEQV9EZUluaXQoKQorICAgIG9yIEByZWYgSEFMX0lSREFfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBIElSREEKKyAgKiBAYnJpZWYgSEFMIElSREEgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9Qcml2YXRlX0NvbnN0YW50cyBJUkRBIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9URUFDS19SRUFDS19USU1FT1VUICAgICAgICAgICAgMTAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVJEQSBUWCBvciBSWCBlbmFibGUgYWNrbm93bGVkZ2UgdGltZS1vdXQgdmFsdWUgICovCisKKyNkZWZpbmUgSVJEQV9DUjFfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBJUkRBX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUlOICAgIDB4MTBVICAgICAgICAvKiE8IFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUFYICAgIDB4MDAwMEZGRkZVICAvKiE8IFVTQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfUHJpdmF0ZV9NYWNyb3MgSVJEQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmICBCUlIgZGl2aXNpb24gb3BlcmF0aW9uIHRvIHNldCBCUlIgcmVnaXN0ZXIgaW4gMTYtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gSVJEQSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBJUkRBIGNsb2NrIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICAqLworI2RlZmluZSBJUkRBX0RJVl9TQU1QTElORzE2KF9fUENMS19fLCBfX0JBVURfXywgX19QUkVTQ0FMRVJfXykgICgoKChfX1BDTEtfXykvSVJEQVByZXNjVGFibGVbKF9fUFJFU0NBTEVSX18pXSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIElSREFfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9TZXRDb25maWcoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9DaGVja0lkbGVTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFJ4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyB2b2lkIElSREFfRW5kVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zIElSREEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGluIGFzeW5jaHJvbm91cyBJUkRBIG1vZGUuCisgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAoKyspIFBvd2VyIG1vZGUKKyAgICAgICgrKykgUHJlc2NhbGVyIHNldHRpbmcKKyAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKworICBbLi5dCisgIFRoZSBIQUxfSVJEQV9Jbml0KCkgQVBJIGZvbGxvd3MgdGhlIFVTQVJUIGFzeW5jaHJvbm91cyBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMKKyAgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKK0BlbmR2ZXJiYXRpbQorCisgIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbGVuZ3RoIGRlZmluZWQgYnkgdGhlIE0xIGFuZCBNMCBiaXRzICg3LWJpdCwKKyAgOC1iaXQgb3IgOS1iaXQpLCB0aGUgcG9zc2libGUgSVJEQSBmcmFtZSBmb3JtYXRzIGFyZSBsaXN0ZWQgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZS4KKworICAgIFRhYmxlIDEuIElSREEgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgSVJEQSBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBJUkRBX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9Jbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIENoZWNrIHRoZSBJUkRBIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaXJkYSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVC9VQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpOworCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhpcmRhLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgSVJEQV9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGhpcmRhKTsKKworICAgIGlmIChoaXJkYS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX0lSREFfTXNwSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgLyogU2V0IHRoZSBJUkRBIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoSVJEQV9TZXRDb25maWcoaGlyZGEpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworCisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgaGlyZGEtPkluc3RhbmNlLT5DUjMgfD0gVVNBUlRfQ1IzX0lSRU47CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRU5BQkxFKGhpcmRhKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKElSREFfQ2hlY2tJZGxlU3RhdGUoaGlyZGEpKTsKK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBDaGVjayB0aGUgSVJEQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGlyZGEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgVVNBUlQvVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9JTlNUQU5DRShoaXJkYS0+SW5zdGFuY2UpKTsKKworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworI2lmIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICBpZiAoaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSVJEQV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIEhBTF9JUkRBX01zcERlSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgIGhpcmRhLT5nU3RhdGUgICAgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsKKyAgaGlyZGEtPlJ4U3RhdGUgICA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgTVNQLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX01zcEluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0lSREFfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBNU1AuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfTXNwRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9JUkRBX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBJUkRBIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSVJEQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBJUkRBIGNhbGxiYWNrCisgICogICAgICAgICBJUkRBIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoSEFMX0lSREFfU1RBVEVfUkVBRFkgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0lSREFfU1RBVEVfUkVTRVQgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBJUkRBIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJUkRBIGRhdGEgdHJhbnNmZXJzLgorCisgIFsuLl0KKyAgICBJckRBIGlzIGEgaGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiBwcm90b2NvbC4gSWYgdGhlIFRyYW5zbWl0dGVyIGlzIGJ1c3ksIGFueSBkYXRhCisgICAgb24gdGhlIElyREEgcmVjZWl2ZSBsaW5lIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgSXJEQSBkZWNvZGVyIGFuZCBpZiB0aGUgUmVjZWl2ZXIKKyAgICBpcyBidXN5LCBkYXRhIG9uIHRoZSBUWCBmcm9tIHRoZSBVU0FSVCB0byBJckRBIHdpbGwgbm90IGJlIGVuY29kZWQgYnkgSXJEQS4KKyAgICBXaGlsZSByZWNlaXZpbmcgZGF0YSwgdHJhbnNtaXNzaW9uIHNob3VsZCBiZSBhdm9pZGVkIGFzIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkCisgICAgY291bGQgYmUgY29ycnVwdGVkLgorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogdGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiB0aGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgIG9yIERNQSwgdGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgIGRlZGljYXRlZCBJUkRBIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIFRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgIFRoZSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBBUElzIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JUkRBX1JlY2VpdmUoKQorCisgICAgKCMpIE5vbiBCbG9ja2luZyBtb2RlIEFQSXMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfSVJRSGFuZGxlcigpCisKKyAgICAoIykgTm9uIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggRE1BIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0RNQVJlc3VtZSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BU3RvcCgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9JUkRBX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgUmVjb3ZlcmFibGUgYW5kIG5vbiBibG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIGdvIHRpbGwgZW5kLCBidXQgZXJyb3Igc2V2ZXJpdHkgaXMKKyAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgIGFuZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIElSREEgc2lkZS4KKyAgICAgICAgICAgIElmIHVzZXIgd2FudHMgdG8gYWJvcnQgaXQsIEFib3J0IHNlcnZpY2VzIHNob3VsZCBiZSBjYWxsZWQgYnkgdXNlci4KKyAgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgVGhpcyBjb25jZXJucyBPdmVycnVuIEVycm9yIEluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSBUaW1lb3V0IFNwZWNpZnkgdGltZW91dCB2YWx1ZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnBkYXRhMTZiaXRzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaGlyZGEtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBEYXRhOyAvKiBEZXJvZ2F0aW9uIFIuMTEuMyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoaGlyZGEtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaGlyZGEtPlR4WGZlckNvdW50LS07CisKKyAgICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIElSREFfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwZGF0YTE2Yml0cyAmIDB4MDFGRlUpOworICAgICAgICBwZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcGRhdGE4Yml0cyAmIDB4RkZVKTsKKyAgICAgICAgcGRhdGE4Yml0cysrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIElSREFfRkxBR19UQywgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSBUaW1lb3V0IFNwZWNpZnkgdGltZW91dCB2YWx1ZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwZGF0YThiaXRzOworICB1aW50MTZfdCAqcGRhdGExNmJpdHM7CisgIHVpbnQxNl90IHVoTWFzazsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIHJlY2VpdmVkIGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCh1aW50MzJfdClwRGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaXJkYS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIHRoZSBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlcgorICAgICAgIG9mIHRoZSBVQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgKi8KKyAgICBJUkRBX01BU0tfQ09NUFVUQVRJT04oaGlyZGEpOworICAgIHVoTWFzayA9IGhpcmRhLT5NYXNrOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBEYXRhOyAvKiBEZXJvZ2F0aW9uIFIuMTEuMyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBkYXRhIHJlbWFpbmluZyB0byBiZSByZWNlaXZlZCAqLworICAgIHdoaWxlIChoaXJkYS0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBoaXJkYS0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgSVJEQV9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgKnBkYXRhMTZiaXRzID0gKHVpbnQxNl90KShoaXJkYS0+SW5zdGFuY2UtPlJEUiAmIHVoTWFzayk7CisgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICpwZGF0YThiaXRzID0gKHVpbnQ4X3QpKGhpcmRhLT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgICAgcGRhdGE4Yml0cysrOworICAgICAgfQorICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtdGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgZmlsbGVkIGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCh1aW50MzJfdClwRGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworLyoqCisgICogQG5vdGUgICBXaGVuIElSREEgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBmb3Igc3RvcmluZyBkYXRhIHRvIGJlIHJlY2VpdmVkLCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyByZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBEYXRhLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoaXJkYS0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIHRoZSBtYXNrIHRvIGFwcGx5IHRvIHRoZSBSRFIgcmVnaXN0ZXIKKyAgICAgICBvZiB0aGUgVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBICovCisgICAgSVJEQV9NQVNLX0NPTVBVVEFUSU9OKGhpcmRhKTsKKworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKy8qKgorICAqIEBub3RlICAgV2hlbiBJUkRBIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW10ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSBjb3B5IGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIGJ5IERNQSBmcm9tIGEgdTE2IGZyb250aWVyLiAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaGlyZGEtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIFNldCB0aGUgSVJEQSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSVJEQV9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIElSREEgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IElSREFfRE1BVHJhbnNtaXRIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJUkRBX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoaXJkYS0+aGRtYXR4LCAodWludDMyX3QpaGlyZGEtPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaGlyZGEtPkluc3RhbmNlLT5URFIsIFNpemUpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfVENGKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIHJlYWR5ICovCisgICAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIElSREEgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWlucworICAqICAgICAgICAgdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworLyoqCisgICogQG5vdGUgICBXaGVuIElSREEgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBmb3Igc3RvcmluZyBkYXRhIHRvIGJlIHJlY2VpdmVkLCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyByZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCBieSBETUEgZnJvbSBoYWxmd29yZCBmcm9udGllcikuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoaXJkYS0+UnhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBTZXQgdGhlIElSREEgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IElSREFfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIElSREEgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IElSREFfRE1BUmVjZWl2ZUhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IElSREFfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoaXJkYS0+aGRtYXJ4LCAodWludDMyX3QpJmhpcmRhLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaGlyZGEtPnBSeEJ1ZmZQdHIsIFNpemUpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIHJlYWR5ICovCisgICAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgUGF1c2UgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RNQVBhdXNlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgICB9CisgIH0KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUmVzdW1lKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBmbGFnIGJlZm9yZSByZXN1bWluZyB0aGUgUnggdHJhbnNmZXIqLworICAgIF9fSEFMX0lSREFfQ0xFQVJfT1JFRkxBRyhoaXJkYSk7CisKKyAgICAvKiBSZWVuYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RNQVN0b3AoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCisgICAgIHRvIGNhbGwgdGhlIEhBTCBJUkRBIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSAvIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkgLworICAgICBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2sgLyBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2s6CisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlCisgICAgIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgdGhlIERNQSB0cmFuc2ZlciBpbnRlcnJ1cHRpb24gb2NjdXJzIGF0IHRoZSBtaWRkbGUgb3IgYXQgdGhlIGVuZCBvZgorICAgICB0aGUgc3RyZWFtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQuICovCisKKyAgLyogU3RvcCBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgVHggY2hhbm5lbCAqLworICAgICAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaGlyZGEtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBJUkRBX0VuZFR4VHJhbnNmZXIoaGlyZGEpOworICAgIH0KKyAgfQorCisgIC8qIFN0b3AgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsICovCisgICAgICBpZiAoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoaXJkYS0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfRE1BOworCisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIElSREFfRW5kUnhUcmFuc2ZlcihoaXJkYSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSBhbmQgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBIYW5kbGUgRXJyb3JDb2RlIHRvIE5vIEVycm9yICovCisgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaGlyZGEtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoaXJkYS0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKKworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IElSREFfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElSREEgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElSREEgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSBhbmQgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaGlyZGEtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVR4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGlyZGEtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaGlyZGEtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhpcmRhLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBJUkRBIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpcmRhLT5oZG1hcngpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaGlyZGEtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIElSREEgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGhpcmRhICBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0lSREFfSVJRSGFuZGxlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCBpc3JmbGFncyAgID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBjcjFpdHMgICAgID0gUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCBjcjNpdHM7CisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisKKyAgLyogSWYgbm8gZXJyb3Igb2NjdXJzICovCisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gMFUpCisgIHsKKyAgICAvKiBJUkRBIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBJUkRBX1JlY2VpdmVfSVQoaGlyZGEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGNyM2l0cyA9IFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IzKTsKKyAgaWYgKChlcnJvcmZsYWdzICE9IDBVKQorICAgICAgJiYgKCgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSAwVSkpKQorICB7CisgICAgLyogSVJEQSBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1BFKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUEVJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfUEVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBJUkRBIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9JUkRBX0NMRUFSX0lUKGhpcmRhLCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfRkU7CisgICAgfQorCisgICAgLyogSVJEQSBub2lzZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX05FKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfSVJEQV9DTEVBUl9JVChoaXJkYSwgSVJEQV9DTEVBUl9ORUYpOworCisgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX05FOworICAgIH0KKworICAgIC8qIElSREEgT3Zlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9PUkUpICE9IDBVKSAmJgorICAgICAgICAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKSB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkpCisgICAgeworICAgICAgX19IQUxfSVJEQV9DTEVBUl9JVChoaXJkYSwgSVJEQV9DTEVBUl9PUkVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9PUkU7CisgICAgfQorCisgICAgLyogQ2FsbCBJUkRBIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaGlyZGEtPkVycm9yQ29kZSAhPSBIQUxfSVJEQV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIElSREEgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIElSREFfUmVjZWl2ZV9JVChoaXJkYSk7CisgICAgICB9CisKKyAgICAgIC8qIElmIE92ZXJydW4gZXJyb3Igb2NjdXJzLCBvciBpZiBhbnkgZXJyb3Igb2NjdXJzIGluIERNQSBtb2RlIHJlY2VwdGlvbiwKKyAgICAgICAgIGNvbnNpZGVyIGVycm9yIGFzIGJsb2NraW5nICovCisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHx8CisgICAgICAgICAgKChoaXJkYS0+RXJyb3JDb2RlICYgSEFMX0lSREFfRVJST1JfT1JFKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgICBTZXQgdGhlIElSREEgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKKyAgICAgICAgICAgRGlzYWJsZSBSeCBJbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSBSeCBETUEgcmVxdWVzdCwgaWYgb25nb2luZyAqLworICAgICAgICBJUkRBX0VuZFJ4VHJhbnNmZXIoaGlyZGEpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICAgICAgeworICAgICAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaGlyZGEtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgSVJEQSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IElSREFfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpcmRhLT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgaGlyZGEtPkVycm9yQ2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIGhpcmRhLT5FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKworICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworCisgIC8qIElSREEgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSAhPSAwVSkpCisgIHsKKyAgICBJUkRBX1RyYW5zbWl0X0lUKGhpcmRhKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBJUkRBIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpCisgIHsKKyAgICBJUkRBX0VuZFRyYW5zbWl0X0lUKGhpcmRhKTsKKyAgICByZXR1cm47CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJUkRBIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIElSREEgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogIEBicmllZiAgIElSREEgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byByZXR1cm4gdGhlIFN0YXRlIG9mIElyREEKKyAgICBjb21tdW5pY2F0aW9uIHByb2Nlc3MgYW5kIGFsc28gcmV0dXJuIFBlcmlwaGVyYWwgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHByb2Nlc3MKKyAgICAgKCspIEhBTF9JUkRBX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZQorICAgICAgICAgb2YgdGhlIElSREEgcGVyaXBoZXJhbCBoYW5kbGUuCisgICAgICgrKSBIQUxfSVJEQV9HZXRFcnJvcigpIGNoZWNrcyBpbiBydW4tdGltZSBlcnJvcnMgdGhhdCBjb3VsZCBvY2N1ciBkdXJpbmcKKyAgICAgICAgIGNvbW11bmljYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIElSREEgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9JUkRBX1N0YXRlVHlwZURlZiBIQUxfSVJEQV9HZXRTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBSZXR1cm4gSVJEQSBoYW5kbGUgc3RhdGUgKi8KKyAgdWludDMyX3QgdGVtcDEsIHRlbXAyOworICB0ZW1wMSA9ICh1aW50MzJfdCloaXJkYS0+Z1N0YXRlOworICB0ZW1wMiA9ICh1aW50MzJfdCloaXJkYS0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9JUkRBX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIElSREEgaGFuZGxlIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSVJEQSBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfSVJEQV9HZXRFcnJvcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICByZXR1cm4gaGlyZGEtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1ByaXZhdGVfRnVuY3Rpb25zIElSREEgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2tzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgaGlyZGEgSVJEQSBoYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCit2b2lkIElSREFfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBJbml0IHRoZSBJUkRBIENhbGxiYWNrIHNldHRpbmdzICovCisgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBoaXJkYS0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaGlyZGEtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGhpcmRhLT5SeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBoaXJkYS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaGlyZGEtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGhpcmRhLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKworfQorI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgSVJEQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1NldENvbmZpZyhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MzJfdCB0bXByZWc7CisgIElSREFfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7CisgIGNvbnN0IHVpbnQxNl90IElSREFQcmVzY1RhYmxlWzEyXSA9IHsxVSwgMlUsIDRVLCA2VSwgOFUsIDEwVSwgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsKKworICAvKiBDaGVjayB0aGUgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0JBVURSQVRFKGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1dPUkRfTEVOR1RIKGhpcmRhLT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfUEFSSVRZKGhpcmRhLT5Jbml0LlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9UWF9SWF9NT0RFKGhpcmRhLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfUFJFU0NBTEVSKGhpcmRhLT5Jbml0LlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9QT1dFUk1PREUoaGlyZGEtPkluaXQuUG93ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX0NMT0NLUFJFU0NBTEVSKGhpcmRhLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSB0aGUgSVJEQSBXb3JkIExlbmd0aCwgUGFyaXR5IGFuZCB0cmFuc2ZlciBNb2RlOgorICAgICBTZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaGlyZGEtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAgICBTZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgICAgU2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5Nb2RlIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCloaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoIHwgaGlyZGEtPkluaXQuUGFyaXR5IHwgaGlyZGEtPkluaXQuTW9kZSA7CisKKyAgTU9ESUZZX1JFRyhoaXJkYS0+SW5zdGFuY2UtPkNSMSwgSVJEQV9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSVJMUCwgaGlyZGEtPkluaXQuUG93ZXJNb2RlKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBjbG9jayBQUkVTQyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUKKyAgKiAtIElSREEgQ2xvY2sgUHJlc2NhbGVyOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwgaGlyZGEtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+R1RQUiwgKHVpbnQxNl90KVVTQVJUX0dUUFJfUFNDLCBoaXJkYS0+SW5pdC5QcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBJUkRBX0dFVENMT0NLU09VUkNFKGhpcmRhLCBjbG9ja3NvdXJjZSk7CisgIHRtcHJlZyA9ICAgMFU7CisgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgIHsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKElSREFfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaGlyZGEtPkluaXQuQmF1ZFJhdGUsIGhpcmRhLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhTSV9WQUxVRSwgaGlyZGEtPkluaXQuQmF1ZFJhdGUsIGhpcmRhLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGhpcmRhLT5Jbml0LkJhdWRSYXRlLCBoaXJkYS0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNigodWludDMyX3QpTFNFX1ZBTFVFLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSwgaGlyZGEtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgKi8KKyAgaWYgKCh0bXByZWcgPj0gVVNBUlRfQlJSX01JTikgJiYgKHRtcHJlZyA8PSBVU0FSVF9CUlJfTUFYKSkKKyAgeworICAgIGhpcmRhLT5JbnN0YW5jZS0+QlJSID0gdG1wcmVnOworICB9CisgIGVsc2UKKyAgeworICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICAqIEBicmllZiBDaGVjayB0aGUgSVJEQSBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX0NoZWNrSWRsZVN0YXRlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0aWFsaXplIHRoZSBJUkRBIEVycm9yQ29kZSAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIGlmIHRoZSBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisgIGlmICgoaGlyZGEtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfVEUpID09IFVTQVJUX0NSMV9URSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVEVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpcmRhLCBVU0FSVF9JU1JfVEVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIElSREFfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChoaXJkYS0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9SRSkgPT0gVVNBUlRfQ1IxX1JFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSVJEQV9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIElSREEgc3RhdGUqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBJUkRBIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIElSREEgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKQorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoX19IQUxfSVJEQV9HRVRfRkxBRyhoaXJkYSwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICAgICAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gSVJEQSBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFRyYW5zbWl0IGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSBhbmQgVENJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKworICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBSZWNlcHRpb24gY29tcGxldGlvbikuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRW5kUnhUcmFuc2ZlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgSVJEQSBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgIH0KKyAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+VHhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFUcmFuc21pdEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPlR4SGFsZkNwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIElSREEgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIH0KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIElSREEgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLworICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIElSREEgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogU3RvcCBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworICAgICAgSVJEQV9FbmRUeFRyYW5zZmVyKGhpcmRhKTsKKyAgICB9CisgIH0KKworICAvKiBTdG9wIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworICAgICAgSVJEQV9FbmRSeFRyYW5zZmVyKGhpcmRhKTsKKyAgICB9CisgIH0KKworICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBoaXJkYS0+RXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBoaXJkYS0+RXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSBhbmQgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPkFib3J0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpcmRhLT5UeFhmZXJDb3VudCA9IDBVOworICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSBhbmQgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPkFib3J0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIElSREEgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRfSVQgQVBJIChBYm9ydCBvbmx5IFR4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFR4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaGlyZGEtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUIEFQSSAoQWJvcnQgb25seSBSeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBSeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaGlyZGEtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9JUkRBX1RyYW5zbWl0X0lUKCkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDE2X3QgKnRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoaGlyZGEtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIElSREEgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QgKikgaGlyZGEtPnBUeEJ1ZmZQdHI7IC8qIERlcm9nYXRpb24gUi4xMS4zICovCisgICAgICAgIGhpcmRhLT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqdG1wICYgMHgwMUZGVSk7CisgICAgICAgIGhpcmRhLT5wVHhCdWZmUHRyICs9IDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaGlyZGEtPnBUeEJ1ZmZQdHIgJiAweEZGVSk7CisgICAgICAgIGhpcmRhLT5wVHhCdWZmUHRyKys7CisgICAgICB9CisgICAgICBoaXJkYS0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXcmFwIHVwIHRyYW5zbWlzc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9FbmRUcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIHRoZSBJUkRBIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKworICAvKiBUeCBwcm9jZXNzIGlzIGVuZGVkLCByZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpcmRhLT5UeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9JUkRBX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDE2X3QgKnRtcDsKKyAgdWludDE2X3QgIHVoTWFzayA9IGhpcmRhLT5NYXNrOworICB1aW50MTZfdCAgdWhkYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5SeFN0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+UkRSKTsKKyAgICBpZiAoKGhpcmRhLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzlCKSAmJiAoaGlyZGEtPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBoaXJkYS0+cFJ4QnVmZlB0cjsgLyogRGVyb2dhdGlvbiBSLjExLjMgKi8KKyAgICAgICp0bXAgPSAodWludDE2X3QpKHVoZGF0YSAmIHVoTWFzayk7CisgICAgICBoaXJkYS0+cFJ4QnVmZlB0ciAgKz0gMlU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAqaGlyZGEtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgIGhpcmRhLT5wUnhCdWZmUHRyKys7CisgICAgfQorCisgICAgaGlyZGEtPlJ4WGZlckNvdW50LS07CisgICAgaWYgKGhpcmRhLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0ICovCisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaGlyZGEtPlJ4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfSVJEQV9TRU5EX1JFUShoaXJkYSwgSVJEQV9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9JUkRBX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfaXdkZy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfaXdkZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTJlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9pd2RnLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX2l3ZGcuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSVdERyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBJbmRlcGVuZGVudCBXYXRjaGRvZyAoSVdERykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgU3RhcnQgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgSVdERyBHZW5lcmljIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRoZSBJV0RHIGNhbiBiZSBzdGFydGVkIGJ5IGVpdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSAoY29uZmlndXJhYmxlCisgICAgICAgIHRocm91Z2ggb3B0aW9uIGJ5dGUpLgorCisgICAgKCspIFRoZSBJV0RHIGlzIGNsb2NrZWQgYnkgTG93LVNwZWVkIGNsb2NrIChMU0kpIGFuZCB0aHVzIHN0YXlzIGFjdGl2ZSBldmVuCisgICAgICAgIGlmIHRoZSBtYWluIGNsb2NrIGZhaWxzLgorCisgICAgKCspIE9uY2UgdGhlIElXREcgaXMgc3RhcnRlZCwgdGhlIExTSSBpcyBmb3JjZWQgT04gYW5kIGJvdGggY2FuIG5vdCBiZQorICAgICAgICBkaXNhYmxlZC4gVGhlIGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGRvd24gZnJvbSB0aGUgcmVzZXQgdmFsdWUgKDB4RkZGKS4KKyAgICAgICAgV2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgY291bnQgdmFsdWUgKDB4MDAwKSBhIHJlc2V0IHNpZ25hbCBpcworICAgICAgICBnZW5lcmF0ZWQgKElXREcgcmVzZXQpLgorCisgICAgKCspIFdoZW5ldmVyIHRoZSBrZXkgdmFsdWUgMHgwMDAwIEFBQUEgaXMgd3JpdHRlbiBpbiB0aGUgSVdER19LUiByZWdpc3RlciwKKyAgICAgICAgdGhlIElXREdfUkxSIHZhbHVlIGlzIHJlbG9hZGVkIGluIHRoZSBjb3VudGVyIGFuZCB0aGUgd2F0Y2hkb2cgcmVzZXQgaXMKKyAgICAgICAgcHJldmVudGVkLgorCisgICAgKCspIFRoZSBJV0RHIGlzIGltcGxlbWVudGVkIGluIHRoZSBWREQgdm9sdGFnZSBkb21haW4gdGhhdCBpcyBzdGlsbCBmdW5jdGlvbmFsCisgICAgICAgIGluIFNUT1AgYW5kIFNUQU5EQlkgbW9kZSAoSVdERyByZXNldCBjYW4gd2FrZS11cCBmcm9tIFNUQU5EQlkpLgorICAgICAgICBJV0RHUlNUIGZsYWcgaW4gUkNDX0NTUiByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBpbmZvcm0gd2hlbiBhbiBJV0RHCisgICAgICAgIHJlc2V0IG9jY3Vycy4KKworICAgICgrKSBEZWJ1ZyBtb2RlIDogV2hlbiB0aGUgbWljcm9jb250cm9sbGVyIGVudGVycyBkZWJ1ZyBtb2RlIChjb3JlIGhhbHRlZCksCisgICAgICAgIHRoZSBJV0RHIGNvdW50ZXIgZWl0aGVyIGNvbnRpbnVlcyB0byB3b3JrIG5vcm1hbGx5IG9yIHN0b3BzLCBkZXBlbmRpbmcKKyAgICAgICAgb24gREJHX0lXREdfU1RPUCBjb25maWd1cmF0aW9uIGJpdCBpbiBEQkcgbW9kdWxlLCBhY2Nlc3NpYmxlIHRocm91Z2gKKyAgICAgICAgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHKCkgYW5kIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgbWFjcm9zCisKKyAgICBbLi5dIE1pbi1tYXggdGltZW91dCB2YWx1ZSBAMzJLSHogKExTSSk6IH4xMjV1cyAvIH4zMi43cworICAgICAgICAgVGhlIElXREcgdGltZW91dCBtYXkgdmFyeSBkdWUgdG8gTFNJIGZyZXF1ZW5jeSBkaXNwZXJzaW9uLiBTVE0zMkcweHgKKyAgICAgICAgIGRldmljZXMgcHJvdmlkZSB0aGUgY2FwYWJpbGl0eSB0byBtZWFzdXJlIHRoZSBMU0kgZnJlcXVlbmN5IChMU0kgY2xvY2sKKyAgICAgICAgIGNvbm5lY3RlZCBpbnRlcm5hbGx5IHRvIFRJTTE2IENIMSBpbnB1dCBjYXB0dXJlKS4gVGhlIG1lYXN1cmVkIHZhbHVlCisgICAgICAgICBjYW4gYmUgdXNlZCB0byBoYXZlIGFuIElXREcgdGltZW91dCB3aXRoIGFuIGFjY2VwdGFibGUgYWNjdXJhY3kuCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoIykgVXNlIElXREcgdXNpbmcgSEFMX0lXREdfSW5pdCgpIGZ1bmN0aW9uIHRvIDoKKyAgICAgICgrKSBFbmFibGUgaW5zdGFuY2UgYnkgd3JpdGluZyBTdGFydCBrZXl3b3JkIGluIElXREdfS0VZIHJlZ2lzdGVyLiBMU0kKKyAgICAgICAgICAgY2xvY2sgaXMgZm9yY2VkIE9OIGFuZCBJV0RHIGNvdW50ZXIgc3RhcnRzIGRvd25jb3VudGluZy4KKyAgICAgICgrKSBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6IElXREdfUFIsIElXREdfUkxSICYKKyAgICAgICAgICAgSVdER19XSU5SLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgSVdERyBwcmVzY2FsZXIgYW5kIGNvdW50ZXIgcmVsb2FkIHZhbHVlLiBUaGlzIHJlbG9hZAorICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIGxvYWRlZCBpbiB0aGUgSVdERyBjb3VudGVyIGVhY2ggdGltZSB0aGUgd2F0Y2hkb2cgaXMKKyAgICAgICAgICAgcmVsb2FkZWQsIHRoZW4gdGhlIElXREcgd2lsbCBzdGFydCBjb3VudGluZyBkb3duIGZyb20gdGhpcyB2YWx1ZS4KKyAgICAgICgrKSB3YWl0IGZvciBzdGF0dXMgZmxhZ3MgdG8gYmUgcmVzZXQiCisgICAgICAoKykgRGVwZW5kaW5nIG9uIHdpbmRvdyBwYXJhbWV0ZXI6CisgICAgICAgICgrKykgSWYgV2luZG93IEluaXQgcGFyYW1ldGVyIGlzIHNhbWUgYXMgV2luZG93IHJlZ2lzdGVyIHZhbHVlLAorICAgICAgICAgICAgIG5vdGhpbmcgbW9yZSBpcyBkb25lIGJ1dCByZWxvYWQgY291bnRlciB2YWx1ZSBpbiBvcmRlciB0byBleGl0CisgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aHkgZXhhY3QgdGltZSBiYXNlLgorICAgICAgICAoKyspIEVsc2UgbW9kaWZ5IFdpbmRvdyByZWdpc3Rlci4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVsb2FkCisgICAgICAgICAgICAgd2F0Y2hkb2cgY291bnRlci4KKworICAgICgjKSBUaGVuIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIG11c3QgcmVmcmVzaCB0aGUgSVdERyBjb3VudGVyIGF0IHJlZ3VsYXIKKyAgICAgICAgaW50ZXJ2YWxzIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gTUNVIHJlc2V0LCB1c2luZworICAgICAgICBIQUxfSVdER19SZWZyZXNoKCkgZnVuY3Rpb24uCisKKyAgICAgKioqIElXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIElXREcgSEFMIGRyaXZlcjoKKyAgICAgICgrKSBfX0hBTF9JV0RHX1NUQVJUOiBFbmFibGUgdGhlIElXREcgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVI6IFJlbG9hZHMgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbgorICAgICAgICAgIHRoZSByZWxvYWQgcmVnaXN0ZXIKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQKKy8qKiBAYWRkdG9ncm91cCBJV0RHCisgICogQGJyaWVmIElXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfUHJpdmF0ZV9EZWZpbmVzIElXREcgUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKy8qIFN0YXR1cyByZWdpc3RlciBuZWVkIDUgUkMgTFNJIGRpdmlkZWQgYnkgcHJlc2NhbGVyIGNsb2NrIHRvIGJlIHVwZGF0ZWQuIFdpdGgKKyAgIGhpZ2hlciBwcmVzY2FsZXIgKDI1NiksIGFuZCBhY2NvcmRpbmcgdG8gTFNJIHZhcmlhdGlvbiwgd2UgbmVlZCB0byB3YWl0IGF0CisgICBsZWFzdCA2IGN5Y2xlcyBzbyA0OCBtcy4gKi8KKyNkZWZpbmUgSEFMX0lXREdfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAgNDh1CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICAgICAgSVdER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgICAgICgrKSBNYW5hZ2UgV2luZG93IG9wdGlvbi4KKyAgICAgICgrKSBPbmNlIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBpbiBIQUxfSVdER19Jbml0IGZ1bmN0aW9uLCBXYXRjaGRvZworICAgICAgICAgIGlzIHJlbG9hZGVkIGluIG9yZGVyIHRvIGV4aXQgZnVuY3Rpb24gd2l0aCBjb3JyZWN0IHRpbWUgYmFzZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICogICAgICAgICBJV0RHX0luaXRUeXBlRGVmIGFuZCBzdGFydCB3YXRjaGRvZy4gQmVmb3JlIGV4aXRpbmcgZnVuY3Rpb24sCisgICogICAgICAgICB3YXRjaGRvZyBpcyByZWZyZXNoZWQgaW4gb3JkZXIgdG8gaGF2ZSBjb3JyZWN0IHRpbWUgYmFzZS4KKyAgKiBAcGFyYW0gIGhpd2RnICBwb2ludGVyIHRvIGEgSVdER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVdERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19Jbml0KElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgSVdERyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGl3ZGcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSVdER19BTExfSU5TVEFOQ0UoaGl3ZGctPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JV0RHX1BSRVNDQUxFUihoaXdkZy0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lXREdfUkVMT0FEKGhpd2RnLT5Jbml0LlJlbG9hZCkpOworICBhc3NlcnRfcGFyYW0oSVNfSVdER19XSU5ET1coaGl3ZGctPkluaXQuV2luZG93KSk7CisKKyAgLyogRW5hYmxlIElXREcuIExTSSBpcyB0dXJuZWQgb24gYXV0b21hdGljYWx5ICovCisgIF9fSEFMX0lXREdfU1RBUlQoaGl3ZGcpOworCisgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMgYnkgd3JpdGluZworICAweDU1NTUgaW4gS1IgKi8KKyAgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKGhpd2RnKTsKKworICAvKiBXcml0ZSB0byBJV0RHIHJlZ2lzdGVycyB0aGUgUHJlc2NhbGVyICYgUmVsb2FkIHZhbHVlcyB0byB3b3JrIHdpdGggKi8KKyAgaGl3ZGctPkluc3RhbmNlLT5QUiA9IGhpd2RnLT5Jbml0LlByZXNjYWxlcjsKKyAgaGl3ZGctPkluc3RhbmNlLT5STFIgPSBoaXdkZy0+SW5pdC5SZWxvYWQ7CisKKyAgLyogQ2hlY2sgcGVuZGluZyBmbGFnLCBpZiBwcmV2aW91cyB1cGRhdGUgbm90IGRvbmUsIHJldHVybiB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBmb3IgcmVnaXN0ZXIgdG8gYmUgdXBkYXRlZCAqLworICB3aGlsZSAoaGl3ZGctPkluc3RhbmNlLT5TUiAhPSAweDAwdSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIQUxfSVdER19ERUZBVUxUX1RJTUVPVVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIElmIHdpbmRvdyBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50IHRoYW4gY3VycmVudCB2YWx1ZSwgbW9kaWZ5IHdpbmRvdworICByZWdpc3RlciAqLworICBpZiAoaGl3ZGctPkluc3RhbmNlLT5XSU5SICE9IGhpd2RnLT5Jbml0LldpbmRvdykKKyAgeworICAgIC8qIFdyaXRlIHRvIElXREcgV0lOUiB0aGUgSVdER19XaW5kb3cgdmFsdWUgdG8gY29tcGFyZSB3aXRoLiBJbiBhbnkgY2FzZSwKKyAgICBldmVuIGlmIHdpbmRvdyBmZWF0dXJlIGlzIGRpc2FibGVkLCBXYXRjaGRvZyB3aWxsIGJlIHJlbG9hZGVkIGJ5IHdyaXRpbmcKKyAgICB3aW5kb3dzIHJlZ2lzdGVyICovCisgICAgaGl3ZGctPkluc3RhbmNlLT5XSU5SID0gaGl3ZGctPkluaXQuV2luZG93OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSKGhpd2RnKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUmVmcmVzaCB0aGUgSVdERy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIFJlZnJlc2ggdGhlIElXREcuCisgICogQHBhcmFtICBoaXdkZyAgcG9pbnRlciB0byBhIElXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElXREcgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfUmVmcmVzaChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKQoreworICAvKiBSZWxvYWQgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoaGl3ZGcpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfbHB0aW0uYyBiL1NyYy9zdG0zMmcweHhfaGFsX2xwdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ZjRiYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX2xwdGltLmMKQEAgLTAsMCArMSwxOTkzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9scHRpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBMUFRJTSBIQUwgbW9kdWxlIGRyaXZlci4gCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIExvdyBQb3dlciBUaW1lciAoTFBUSU0pIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgICAgKyBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgaW4gcG9sbGluZyBtb2RlLgorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiAgICAgICAgICAgKyBSZWFkaW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuCisgICogICAgICAgICAKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgTFBUSU0gSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgICAoIylJbml0aWFsaXplIHRoZSBMUFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUKKyAgICAgICAgSEFMX0xQVElNX01zcEluaXQoKToKKyAgICAgICAgICgrKykgRW5hYmxlIHRoZSBMUFRJTSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0xQVElNeF9DTEtfRU5BQkxFKCkuCisgICAgICAgICAoKyspIEluIGNhc2Ugb2YgdXNpbmcgaW50ZXJydXB0cyAoZS5nLiBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKCkpOgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgTFBUSU0gaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkuCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBMUFRJTSBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKyAgICAgICAgICAgICAoKysrKSBJbiBMUFRJTSBJUlEgaGFuZGxlciwgY2FsbCBIQUxfTFBUSU1fSVJRSGFuZGxlcigpLgorICAgIAorICAgICAgKCMpSW5pdGlhbGl6ZSB0aGUgTFBUSU0gSEFMIHVzaW5nIEhBTF9MUFRJTV9Jbml0KCkuIFRoaXMgZnVuY3Rpb24KKyAgICAgICAgIGNvbmZpZ3VyZXMgbWFpbmx5OgorICAgICAgICAgKCsrKSBUaGUgaW5zdGFuY2U6IExQVElNMSBvciBMUFRJTTIuCisgICAgICAgICAoKyspIENsb2NrOiB0aGUgY291bnRlciBjbG9jay4KKyAgICAgICAgICAgICAoKysrKSBTb3VyY2UgICA6IGl0IGNhbiBiZSBlaXRoZXIgdGhlIFVMUFRJTSBpbnB1dCAoSU4xKSBvciBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBjbG9jazsgKEFQQiwgTFNFLCBMU0kgb3IgSFNJKS4KKyAgICAgICAgICAgICAoKysrKSBQcmVzY2FsZXI6IHNlbGVjdCB0aGUgY2xvY2sgZGl2aWRlci4KKyAgICAgICAgICgrKykgIFVsdHJhTG93UG93ZXJDbG9jayA6IFRvIGJlIHVzZWQgb25seSBpZiB0aGUgVUxQVElNIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICBhcyBjb3VudGVyIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAoKysrKSBQb2xhcml0eTogICBwb2xhcml0eSBvZiB0aGUgYWN0aXZlIGVkZ2UgZm9yIHRoZSBjb3VudGVyIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgVUxQVElNIGlucHV0IGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICgrKyspIFNhbXBsZVRpbWU6IGNsb2NrIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSBjbG9jayBnbGl0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuICAgICAgICAgICAgICAKKyAgICAgICAgICgrKykgVHJpZ2dlcjogSG93IHRoZSBjb3VudGVyIHN0YXJ0LgorICAgICAgICAgICAgICgrKyspIFNvdXJjZTogdHJpZ2dlciBjYW4gYmUgc29mdHdhcmUgb3Igb25lIG9mIHRoZSBoYXJkd2FyZSB0cmlnZ2Vycy4KKyAgICAgICAgICAgICAoKysrKSBBY3RpdmVFZGdlIDogb25seSBmb3IgaGFyZHdhcmUgdHJpZ2dlci4KKyAgICAgICAgICAgICAoKysrKSBTYW1wbGVUaW1lIDogdHJpZ2dlciBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGl0Y2ggZmlsdGVyLgorICAgICAgICAgKCsrKSBPdXRwdXRQb2xhcml0eSA6IDIgb3Bwb3NpdGUgcG9sYXJpdGllcyBhcmUgcG9zc2libGUuCisgICAgICAgICAoKyspIFVwZGF0ZU1vZGU6IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cGRhdGUgb2YgdGhlIGF1dG9yZWxvYWQgYW5kCisgICAgICAgICAgICAgIHRoZSBjb21wYXJlIHZhbHVlcyBpcyBkb25lIGltbWVkaWF0ZWx5IG9yIGFmdGVyIHRoZSBlbmQgb2YgY3VycmVudAorICAgICAgICAgICAgICBwZXJpb2QuICAgCisgICAgICAgICAoKyspIElucHV0MVNvdXJjZTogU291cmNlIHNlbGVjdGVkIGZvciBpbnB1dDEgKEdQSU8gb3IgY29tcGFyYXRvciBvdXRwdXQpLgorICAgICAgICAgKCsrKSBJbnB1dDJTb3VyY2U6IFNvdXJjZSBzZWxlY3RlZCBmb3IgaW5wdXQyIChHUElPIG9yIGNvbXBhcmF0b3Igb3V0cHV0KS4gCisgICAgICAgICAgICAgIElucHV0MiBpcyB1c2VkIG9ubHkgZm9yIGVuY29kZXIgZmVhdHVyZSBzbyBpcyB1c2VkIG9ubHkgZm9yIExQVElNMSBpbnN0YW5jZS4KKyAgICAKKyAgICAgICgjKVNpeCBtb2RlcyBhcmUgYXZhaWxhYmxlOgorICAgICAgCisgICAgICAgICAoKyspIFBXTSBNb2RlOiBUbyBnZW5lcmF0ZSBhIFBXTSBzaWduYWwgd2l0aCBzcGVjaWZpZWQgcGVyaW9kIGFuZCBwdWxzZSwKKyAgICAgICAgIGNhbGwgSEFMX0xQVElNX1BXTV9TdGFydCgpIG9yIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uCisgICAgICAgICBtb2RlLgorICAgICAgICAgCisgICAgICAgICAoKyspIE9uZSBQdWxzZSBNb2RlOiBUbyBnZW5lcmF0ZSBwdWxzZSB3aXRoIHNwZWNpZmllZCB3aWR0aCBpbiByZXNwb25zZQorICAgICAgICAgdG8gYSBzdGltdWx1cywgY2FsbCBIQUxfTFBUSU1fT25lUHVsc2VfU3RhcnQoKSBvcgorICAgICAgICAgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLgorICAgICAgICAgCisgICAgICAgICAoKyspIFNldCBvbmNlIE1vZGU6IEluIHRoaXMgbW9kZSwgdGhlIG91dHB1dCBjaGFuZ2VzIHRoZSBsZXZlbCAoZnJvbQorICAgICAgICAgbG93IGxldmVsIHRvIGhpZ2ggbGV2ZWwgaWYgdGhlIG91dHB1dCBwb2xhcml0eSBpcyBjb25maWd1cmVkIGhpZ2gsIGVsc2UKKyAgICAgICAgIHRoZSBvcHBvc2l0ZSkgd2hlbiBhIGNvbXBhcmUgbWF0Y2ggb2NjdXJzLiBUbyBzdGFydCB0aGlzIG1vZGUsIGNhbGwgCisgICAgICAgICBIQUxfTFBUSU1fU2V0T25jZV9TdGFydCgpIG9yIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0X0lUKCkgZm9yCisgICAgICAgICBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgICAgICAgIAorICAgICAgICAgKCsrKSBFbmNvZGVyIE1vZGU6IFRvIHVzZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2FsbAorICAgICAgICAgSEFMX0xQVElNX0VuY29kZXJfU3RhcnQoKSBvciBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVCgpIGZvciAKKyAgICAgICAgIGludGVycnVwdGlvbiBtb2RlLiBPbmx5IGF2YWlsYWJsZSBmb3IgTFBUSU0xIGluc3RhbmNlLgorICAgICAgICAgCisgICAgICAgICAoKyspIFRpbWUgb3V0IE1vZGU6IGFuIGFjdGl2ZSBlZGdlIG9uIG9uZSBzZWxlY3RlZCB0cmlnZ2VyIGlucHV0IHJlc3RzCisgICAgICAgICB0aGUgY291bnRlci4gVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueQorICAgICAgICAgc3VjY2Vzc2l2ZSB0cmlnZ2VyIGV2ZW50IHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIgYW5kIHRoZSB0aW1lciB3aWxsCisgICAgICAgICByZXN0YXJ0LiBUbyBzdGFydCB0aGlzIG1vZGUgY2FsbCBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVCgpIG9yIAorICAgICAgICAgSEFMX0xQVElNX1RpbWVPdXRfU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uIG1vZGUuCisgICAgICAgICAKKyAgICAgICAgICgrKykgQ291bnRlciBNb2RlOiBjb3VudGVyIGNhbiBiZSB1c2VkIHRvIGNvdW50IGV4dGVybmFsIGV2ZW50cyBvbgorICAgICAgICAgdGhlIExQVElNIElucHV0MSBvciBpdCBjYW4gYmUgdXNlZCB0byBjb3VudCBpbnRlcm5hbCBjbG9jayBjeWNsZXMuCisgICAgICAgICBUbyBzdGFydCB0aGlzIG1vZGUsIGNhbGwgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnQoKSBvciAKKyAgICAgICAgIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLiAgICAgICAgICAgICAKKworICAgIAorICAgICAgKCMpIFVzZXIgY2FuIHN0b3AgYW55IHByb2Nlc3MgYnkgY2FsbGluZyB0aGUgY29ycmVzcG9uZGluZyBBUEk6CisgICAgICAgICAgSEFMX0xQVElNX1h4eF9TdG9wKCkgb3IgSEFMX0xQVElNX1h4eF9TdG9wX0lUKCkgaWYgdGhlIHByb2Nlc3MgaXMKKyAgICAgICAgICBhbHJlYWR5IHN0YXJ0ZWQgaW4gaW50ZXJydXB0aW9uIG1vZGUuCisgICAgICAgICAKKyAgICAgICgjKSBEZS1pbml0aWFsaXplIHRoZSBMUFRJTSBwZXJpcGhlcmFsIHVzaW5nIEhBTF9MUFRJTV9EZUluaXQoKS4KKworICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgWy4uXQorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfTFBUSU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2suCisgIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIHRoZSBDYWxsYmFjayBJRCBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICBbLi5dCisgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZQorICBkZWZhdWx0IHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX0xQVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgIFsuLl0KKyAgVGhlc2UgZnVuY3Rpb25zIGFsbG93IHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKworICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgIDogTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBDb21wYXJlTWF0Y2hDYWxsYmFjayAgICA6IENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIEF1dG9SZWxvYWRNYXRjaENhbGxiYWNrIDogQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICAgIDogRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2suCisgICAgKCspIENvbXBhcmVXcml0ZUNhbGxiYWNrICAgIDogQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgOiBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRGlyZWN0aW9uVXBDYWxsYmFjayAgICAgOiBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrLgorICAgICgrKSBEaXJlY3Rpb25Eb3duQ2FsbGJhY2sgICA6IERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjay4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfTFBUSU1fU1RBVEVfUkVTRVQKKyAgYWxsIGludGVycnVwdCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgZXhhbXBsZXMgQHJlZiBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKCksIEByZWYgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKCkuCisKKyAgWy4uXQorICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsKKyAgZnVuY3Rpb25hbGl0aWVzIGluIHRoZSBJbml0L0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCisgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBJbml0L0RlSW5pdAorICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgWy4uXQorICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9MUFRJTV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICBpbiBIQUxfTFBUSU1fU1RBVEVfUkVBRFkgb3IgSEFMX0xQVElNX1NUQVRFX1JFU0VUIHN0YXRlLAorICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgIHVzaW5nIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBEZUluaXQgb3IgSW5pdCBmdW5jdGlvbi4KKworICBbLi5dCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVElNIExQVElNCisgICogQGJyaWVmIExQVElNIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKKworI2lmIGRlZmluZWQgKExQVElNMSkgfHwgZGVmaW5lZCAoTFBUSU0yKQorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3N0YXRpYyB2b2lkIExQVElNX1Jlc2V0Q2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLiAKKyAqCitAdmVyYmF0aW0gICAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUKKyAgICAgICAgICBMUFRJTV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIExQVElNIE1TUC4KKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIExQVElNIE1TUC4gCisgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIExQVElNIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICogICAgICAgICBMUFRJTV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fSW5pdChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIHVpbnQzMl90IHRtcGNmZ3I7CisKKyAgLyogQ2hlY2sgdGhlIExQVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGhscHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIAorICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfU09VUkNFKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BSRVNDQUxFUihobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7ICAKKyAgaWYgKChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlKSA9PSAgTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfU0FNUExFX1RJTUUoaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5TYW1wbGVUaW1lKSk7CisgIH0gIAorICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fVFJHX1NPVVJDRShobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpKTsKKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1RSSUdfU0FNUExFX1RJTUUoaGxwdGltLT5Jbml0LlRyaWdnZXIuU2FtcGxlVGltZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9FWFRfVFJHX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5UcmlnZ2VyLkFjdGl2ZUVkZ2UpKTsKKyAgfSAgCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9PVVRQVVRfUE9MQVJJVFkoaGxwdGltLT5Jbml0Lk91dHB1dFBvbGFyaXR5KSk7ICAKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1VQREFURV9NT0RFKGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSkpOworICAKKyAgaWYoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGxwdGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBMUFRJTV9SZXNldENhbGxiYWNrKGhscHRpbSk7CisKKyAgICBpZihobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcEluaXQ7CisgICAgfQorICAgIAorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfTFBUSU1fTXNwSW5pdChobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgCisgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLworICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKKyAgCisgIGlmICgoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkgfHwgKChobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSkgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisgIHsKKyAgICB0bXBjZmdyICY9ICh1aW50MzJfdCkofihMUFRJTV9DRkdSX0NLUE9MIHwgTFBUSU1fQ0ZHUl9DS0ZMVCkpOworICB9CisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+IChMUFRJTV9DRkdSX1RSR0ZMVCB8IExQVElNX0NGR1JfVFJJR1NFTCkpOworICB9CisgICAgCisgIC8qIENsZWFyIENLU0VMLCBDS1BPTCwgUFJFU0MsIFRSSUdFTiwgVFJHRkxULCBXQVZQT0wsIFBSRUxPQUQgJiBDT1VOVE1PREUgYml0cyAqLworICB0bXBjZmdyICY9ICh1aW50MzJfdCkofihMUFRJTV9DRkdSX0NLU0VMIHwgTFBUSU1fQ0ZHUl9DS1BPTCB8IExQVElNX0NGR1JfVFJJR0VOIHwgTFBUSU1fQ0ZHUl9QUkVMT0FEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wgfCBMUFRJTV9DRkdSX1BSRVNDIHwgTFBUSU1fQ0ZHUl9DT1VOVE1PREUgKSk7CisgIAorICAvKiBTZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworICB0bXBjZmdyIHw9IChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlICAgIHwKKyAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlciB8CisgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5PdXRwdXRQb2xhcml0eSAgfAorICAgICAgICAgICAgICBobHB0aW0tPkluaXQuVXBkYXRlTW9kZSAgICAgIHwKKyAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UpOworICAKKyAgaWYgKCgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSkgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCAoKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIHRtcGNmZ3IgfD0gIChobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5IHwKKyAgICAgICAgICAgICAgICBobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlNhbXBsZVRpbWUpOworICB9IAorICAKKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRW5hYmxlIEV4dGVybmFsIHRyaWdnZXIgYW5kIHNldCB0aGUgdHJpZ2dlciBzb3VyY2UgKi8KKyAgICB0bXBjZmdyIHw9IChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UgICAgIHwKKyAgICAgICAgICAgICAgICBobHB0aW0tPkluaXQuVHJpZ2dlci5BY3RpdmVFZGdlIHwKKyAgICAgICAgICAgICAgICBobHB0aW0tPkluaXQuVHJpZ2dlci5TYW1wbGVUaW1lKTsKKyAgfQorICAKKyAgLyogV3JpdGUgdG8gTFBUSU14IENGR1IgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiA9IHRtcGNmZ3I7CisKKyAgLyogQ29uZmlndXJlIExQVElNIGlucHV0IHNvdXJjZXMgKi8KKyAgaWYoaGxwdGltLT5JbnN0YW5jZSA9PSBMUFRJTTEpCisgIHsKKyAgICAvKiBDaGVjayBMUFRJTSBJbnB1dDEgYW5kIElucHV0MiBzb3VyY2VzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOUFVUMV9TT1VSQ0UoaGxwdGltLT5JbnN0YW5jZSxobHB0aW0tPkluaXQuSW5wdXQxU291cmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOUFVUMl9TT1VSQ0UoaGxwdGltLT5JbnN0YW5jZSxobHB0aW0tPkluaXQuSW5wdXQyU291cmNlKSk7CisgICAgCisgICAgLyogQ29uZmlndXJlIExQVElNIElucHV0MSBhbmQgSW5wdXQyIHNvdXJjZXMgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSMiA9IChobHB0aW0tPkluaXQuSW5wdXQxU291cmNlIHwgaGxwdGltLT5Jbml0LklucHV0MlNvdXJjZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgTFBUSU0yIElucHV0MSBzb3VyY2UgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5QVVQxX1NPVVJDRShobHB0aW0tPkluc3RhbmNlLGhscHRpbS0+SW5pdC5JbnB1dDFTb3VyY2UpKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgTFBUSU0yIElucHV0MSBzb3VyY2UgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSMiA9IGhscHRpbS0+SW5pdC5JbnB1dDFTb3VyY2U7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBMUFRJTSBwZXJpcGhlcmFsLiAKKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaGxwdGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIERpc2FibGUgdGhlIExQVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworICAKKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYoaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BEZUluaXQ7CisgIH0KKyAgCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLworICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgSEFMX0xQVElNX01zcERlSW5pdChobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIAorICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQ7CisgIAorICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhscHRpbSk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gTVNQLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX01zcEluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworICAgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgTFBUSU0gTVNQLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX01zcERlSW5pdChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisgICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBMUFRJTSBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBMUFRJTSBTdGFydCBTdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IHRoZSBQV00gbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBQV00gbW9kZS4KKyAgICAgICgrKSBTdGFydCB0aGUgT25lIHB1bHNlIG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgT25lIHB1bHNlIG1vZGUuCisgICAgICAoKykgU3RhcnQgdGhlIFNldCBvbmNlIG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgU2V0IG9uY2UgbW9kZS4KKyAgICAgICgrKSBTdGFydCB0aGUgRW5jb2RlciBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIEVuY29kZXIgbW9kZS4KKyAgICAgICgrKSBTdGFydCB0aGUgVGltZW91dCBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIFRpbWVvdXQgbW9kZS4gICAgICAKKyAgICAgICgrKSBTdGFydCB0aGUgQ291bnRlciBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIENvdW50ZXIgbW9kZS4KKyAgICAgIAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworICAgIAorLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworIAorICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgUFdNIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworICAKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYKKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7CisgICAgICAgICAgICAgICAKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAKKyAgLyogUmVzZXQgV0FWRSBiaXQgdG8gc2V0IFBXTSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfV0FWRTsKKyAgCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisgIAorICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworICAKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworICAKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworICAKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0gIAorICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworICAKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKyAgCisgICAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworICAKKyAgLyogRGlzYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworICAKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisgIAorICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKyAgCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9ICAKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgb25lIHB1bHNlIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworICAKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgICAgICAgICAgICAgICAKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7CisgICAgICAgICAgICAgICAKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBvbmUgcHVsc2UgbW9kZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7CisgIAorICAvKiBFbmFibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworICAKKyAgLyogRW5hYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKyAgCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKyAgCisgIC8qIEVuYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKyAgCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9CisgIAorICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisgIAorICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworICAKKyAgLyogTG9hZCB0aGUgcHVsc2UgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBQdWxzZSk7CisgIAorICAvKiBTdGFydCB0aW1lciBpbiBzaW5nbGUgKG9uZSBzaG90KSBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShobHB0aW0pOworICAgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisgIAorICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisgIAorICAvKiBEaXNhYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7CisgIAorICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKyAgCisgIC8qIERpc2FibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworICAKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0KKyAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBpbiBTZXQgb25jZSBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgUHVsc2UgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBTZXQgV0FWRSBiaXQgdG8gZW5hYmxlIHRoZSBzZXQgb25jZSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9XQVZFOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworICAKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogU2V0IFdBVkUgYml0IHRvIGVuYWJsZSB0aGUgc2V0IG9uY2UgbW9kZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfV0FWRTsKKyAgCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisgIAorICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworICAKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworICAKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworICAKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0gIAorICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworICAKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKKyAgICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisgIAorICAvKiBEaXNhYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7CisgIAorICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKyAgCisgIC8qIERpc2FibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworICAKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0gCisgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgdWludDMyX3QgICAgICAgICAgdG1wY2ZncjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQyk7CisgIGFzc2VydF9wYXJhbShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyID09IExQVElNX1BSRVNDQUxFUl9ESVYxKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKKworICAgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAgIC8qIEdldCB0aGUgTFBUSU14IENGR1IgdmFsdWUgKi8KKyAgICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKKworICAgIC8qIENsZWFyIENLUE9MIGJpdHMgKi8KKyAgICB0bXBjZmdyICY9ICh1aW50MzJfdCkofkxQVElNX0NGR1JfQ0tQT0wpOworCisgICAgLyogU2V0IElucHV0IHBvbGFyaXR5ICovCisgICAgdG1wY2ZnciB8PSAgaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5Qb2xhcml0eTsKKworICAgIC8qIFdyaXRlIHRvIExQVElNeCBDRkdSICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiA9IHRtcGNmZ3I7CisKKyAgICAvKiBTZXQgRU5DIGJpdCB0byBlbmFibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX0VOQzsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgICAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgICAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICAgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisgIAorICAvKiBSZXNldCBFTkMgYml0IHRvIGRpc2FibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfRU5DOworICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIEVuY29kZXIgaW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpCit7CisgIHVpbnQzMl90ICAgICAgICAgIHRtcGNmZ3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MpOworICBhc3NlcnRfcGFyYW0oaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlciA9PSBMUFRJTV9QUkVTQ0FMRVJfRElWMSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QT0xBUklUWShobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5KSk7CisKKyAgICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgICAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDb25maWd1cmUgZWRnZSBzZW5zaXRpdml0eSBmb3IgZW5jb2RlciBtb2RlICovCisgICAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLworICAgIHRtcGNmZ3IgPSBobHB0aW0tPkluc3RhbmNlLT5DRkdSOworCisgICAgLyogQ2xlYXIgQ0tQT0wgYml0cyAqLworICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+TFBUSU1fQ0ZHUl9DS1BPTCk7CisKKyAgICAvKiBTZXQgSW5wdXQgcG9sYXJpdHkgKi8KKyAgICB0bXBjZmdyIHw9ICBobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5OworCisgICAgLyogV3JpdGUgdG8gTFBUSU14IENGR1IgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wY2ZncjsKKworICAgIC8qIFNldCBFTkMgYml0IHRvIGVuYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfRU5DOworCisgICAgLyogRW5hYmxlICJzd2l0Y2ggdG8gZG93biBkaXJlY3Rpb24iIGludGVycnVwdCAqLworICAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0RPV04pOworCisgICAgLyogRW5hYmxlICJzd2l0Y2ggdG8gdXAgZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9VUCk7ICAKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgICAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgICAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICAgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRW5jb2RlciBpbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisgIAorICAvKiBSZXNldCBFTkMgYml0IHRvIGRpc2FibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfRU5DOworICAKKyAgLyogRGlzYWJsZSAic3dpdGNoIHRvIGRvd24gZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0RPV04pOworICAKKyAgLyogRGlzYWJsZSAic3dpdGNoIHRvIHVwIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9VUCk7IAorICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIFRpbWVvdXQgZnVuY3Rpb24uCisgICogQG5vdGUgICBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55IHN1Y2Nlc3NpdmUKKyAgKiAgICAgICAgIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHJlc3RhcnRzLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzZXQgdGhlIGNvdW50ZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoVGltZW91dCkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgCisgIC8qIFNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfVElNT1VUOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIFRpbWVvdXQgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBUaW1lb3V0KTsKKyAgCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisgICAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIFRpbWVvdXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKyAgCisgIC8qIFJlc2V0IFRJTU9VVCBiaXQgdG8gZW5hYmxlIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfVElNT1VUOworICAKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIFRpbWVvdXQgZnVuY3Rpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55IHN1Y2Nlc3NpdmUKKyAgKiAgICAgICAgIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHJlc3RhcnRzLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzZXQgdGhlIGNvdW50ZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoVGltZW91dCkpOworICAgICAgICAgICAgICAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgCisgIC8qIFNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfVElNT1VUOworICAKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIExvYWQgdGhlIFRpbWVvdXQgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBUaW1lb3V0KTsKKyAgCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisgICAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIFRpbWVvdXQgZnVuY3Rpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKyAgCisgIC8qIFJlc2V0IFRJTU9VVCBiaXQgdG8gZW5hYmxlIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfVElNT1VUOworICAKKyAgLyogRGlzYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgQ291bnRlciBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgICAgICAgICAgICAgICAKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIElmIGNsb2NrIHNvdXJjZSBpcyBub3QgVUxQVElNIGNsb2NrIGFuZCBjb3VudGVyIHNvdXJjZSBpcyBleHRlcm5hbCwgdGhlbiBpdCBtdXN0IG5vdCBiZSBwcmVzY2FsZWQgKi8KKyAgaWYoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgIT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSAmJiAoaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjbG9jayBpcyBwcmVzY2FsZWQgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7CisgICAgLyogU2V0IGNsb2NrIHByZXNjYWxlciB0byAwICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9QUkVTQzsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKyAgCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisgIAorICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworICAgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBDb3VudGVyIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisgIAorICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKyAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBDb3VudGVyIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgICAgICAgICAgICAgIAorICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAKKyAgLyogSWYgY2xvY2sgc291cmNlIGlzIG5vdCBVTFBUSU0gY2xvY2sgYW5kIGNvdW50ZXIgc291cmNlIGlzIGV4dGVybmFsLCB0aGVuIGl0IG11c3Qgbm90IGJlIHByZXNjYWxlZCAqLworICBpZigoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSAhPSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pICYmIChobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIC8qIENoZWNrIGlmIGNsb2NrIGlzIHByZXNjYWxlZCAqLworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVJESVYxKGhscHRpbS0+SW5pdC5DbG9jay5QcmVzY2FsZXIpKTsKKyAgICAvKiBTZXQgY2xvY2sgcHJlc2NhbGVyIHRvIDAgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1BSRVNDOworICB9CisgIAorICAvKiBFbmFibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworICAKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOworICAKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworICAKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKyAgCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisgICAgCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIENvdW50ZXIgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICAKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworICAKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworICAKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisgIAorICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIExQVElNIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgUmVhZCBvcGVyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICMjIyMjIExQVElNIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIExQVElNIFJlYWRpbmcgZnVuY3Rpb25zLgorICAgICAgKCspIFJlYWQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICAgICAoKykgUmVhZCB0aGUgcGVyaW9kIChBdXRvLXJlbG9hZCkgdmFsdWUuCisgICAgICAoKykgUmVhZCB0aGUgcHVsc2UgKENvbXBhcmUpdmFsdWUuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgQ291bnRlciB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQ291bnRlcihMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgCisgIHJldHVybiAoaGxwdGltLT5JbnN0YW5jZS0+Q05UKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGN1cnJlbnQgQXV0b3JlbG9hZCAoUGVyaW9kKSB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEF1dG9yZWxvYWQgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZEF1dG9SZWxvYWQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIAorICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkFSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IENvbXBhcmUgKFB1bHNlKSB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIENvbXBhcmUgdmFsdWUuCisgICovCit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZENvbXBhcmUoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIAorICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkNNUCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgTFBUSU0gSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcworICogIEBicmllZiAgTFBUSU0gIElSUSBoYW5kbGVyLgorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBMUFRJTSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIExQVElNIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMgY2FsbGVkIHdpdGhpbiAKKyAgICAgIHRoZSBJUlEgaGFuZGxlcjoKKyAgICgrKSBMUFRJTSBpbnRlcnJ1cHQgcmVxdWVzdCBoYW5kbGVyCisgICAoKykgQ29tcGFyZSBtYXRjaCBDYWxsYmFjaworICAgKCspIEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrCisgICAoKykgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sKKyAgICgrKSBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrCisgICAoKykgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sKKyAgICgrKSBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrCisgICAoKykgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIExQVElNIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTFBUSU1fSVJRSGFuZGxlcihMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBNKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9DTVBNKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBDb21wYXJlIG1hdGNoIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE0pOworICAgICAgCisgICAgICAvKiBDb21wYXJlIG1hdGNoIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIAorICAvKiBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBpZihfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJSTSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJSTSkgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQXV0b3JlbG9hZCBtYXRjaCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKTsKKyAgICAgIAorICAgICAgLyogQXV0b3JlbG9hZCBtYXRjaCBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOyAgICAgIAorI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIAorICAvKiBUcmlnZ2VyIGRldGVjdGVkIGludGVycnVwdCAqLworICBpZihfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfRVhUVFJJRykgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRykgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgVHJpZ2dlciBkZXRlY3RlZCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19FWFRUUklHKTsKKyAgICAgIAorICAgICAgLyogVHJpZ2dlciBkZXRlY3RlZCBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKGhscHRpbSk7ICAgICAgCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgCisgIC8qIENvbXBhcmUgd3JpdGUgaW50ZXJydXB0ICovCisgIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSykgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIENvbXBhcmUgd3JpdGUgZmxhZyAqLworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworICAgICAgCisgICAgICAvKiBDb21wYXJlIHdyaXRlIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrKGhscHRpbSk7ICAgICAgCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgCisgIC8qIEF1dG9yZWxvYWQgd3JpdGUgaW50ZXJydXB0ICovCisgIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJST0spICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEF1dG9yZWxvYWQgd3JpdGUgZmxhZyAqLworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworICAgICAgCisgICAgICAvKiBBdXRvcmVsb2FkIHdyaXRlIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7ICAgICAgCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgCisgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIGludGVycnVwdCAqLworICBpZihfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfVVApICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX1VQKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19VUCk7CisgICAgICAKKyAgICAgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjayhobHB0aW0pOyAgICAgIAorI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIAorICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBpbnRlcnJ1cHQgKi8KKyAgaWYoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0RPV04pICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX0RPV04pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBVcCB0byBEb3duIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0RPV04pOworICAgICAgCisgICAgICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrKGhscHRpbSk7ICAgICAgCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb21wYXJlIG1hdGNoIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKyAgICAKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAgCit9CisKKy8qKgorICAqIEBicmllZiAgQXV0b3JlbG9hZCBtYXRjaCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisgICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gIAorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyaWdnZXIgZGV0ZWN0ZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKyAgICAKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gIAorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmUgd3JpdGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworICAgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovICAKK30KKworLyoqCisgICogQGJyaWVmICBBdXRvcmVsb2FkIHdyaXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLiAKKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisgICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworICAgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBVcCB0byBEb3duIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisgICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovICAKK30KKworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgTFBUSU0gY2FsbGJhY2sgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEICAgICAgICAgIExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEICAgIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9XUklURV9DQl9JRCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEICAgICBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCAgIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRAorICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqICAgICAgIGhscHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExQVElNX0NhbGxiYWNrVHlwZURlZiAgICAgIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobHB0aW0pOworCisgIGlmKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCA6CisgICAgICBobHB0aW0tPkNvbXBhcmVNYXRjaENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgaGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgOgorICAgICAgaGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9XUklURV9DQl9JRCA6CisgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgOgorICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCA6CisgICAgICBobHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgorICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhscHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgTFBUSU0gY2FsbGJhY2sKKyAgKiAgICAgICAgIExMUFRJTSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEICAgICAgICBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCAgICAgICAgICBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCAgICBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgICAgIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqICAgICAgIGhscHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhscHRpbSk7CisKKyAgaWYoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgorICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCA6CisgICAgICBobHB0aW0tPkF1dG9SZWxvYWRNYXRjaENhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCA6CisgICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgOgorICAgICAgaGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgOgorICAgICAgaGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+RGlyZWN0aW9uVXBDYWxsYmFjayA9IEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX0RPV05fQ0JfSUQgOgorICAgICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2sgPSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6CisgICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobHB0aW0pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9Hcm91cDUgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuIAorICoKK0B2ZXJiYXRpbSAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIExQVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0xQVElNX1N0YXRlVHlwZURlZiBIQUxfTFBUSU1fR2V0U3RhdGUoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBSZXR1cm4gTFBUSU0gaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBobHB0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgTFBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MuCisgICogQHBhcmFtICBscHRpbSBwb2ludGVyIHRvIGEgTFBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBMUFRJTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBMUFRJTV9SZXNldENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwdGltKQoreworICAvKiBSZXNldCB0aGUgTFBUSU0gY2FsbGJhY2sgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICBscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2s7ICAgIC8qIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICovCisgIGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjazsgLyogQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgbHB0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgID0gSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAvKiBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayAgICAqLworICBscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2s7ICAgIC8qIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgICAgICovCisgIGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjazsgLyogQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgbHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgICAgID0gSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2s7ICAgICAvKiBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgICAqLworICBscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrICAgPSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrOyAgIC8qIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICAqLworfQorI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBMUFRJTTEgfHwgTFBUSU0yICovCisKKyNlbmRpZiAvKiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9tc3BfdGVtcGxhdGUuYyBiL1NyYy9zdG0zMmcweHhfaGFsX21zcF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNWY1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9tc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfbXNwX3RlbXBsYXRlLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBNU1AgbW9kdWxlLgorICAqICAgICAgICAgIFRoaXMgZmlsZSB0ZW1wbGF0ZSBpcyBsb2NhdGVkIGluIHRoZSBIQUwgZm9sZGVyIGFuZCBzaG91bGQgYmUgY29waWVkCisgICogICAgICAgICAgdG8gdGhlIHVzZXIgZm9sZGVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX01TUCBIQUwgTVNQIG1vZHVsZSBkcml2ZXIKKyAgKiBAYnJpZWYgSEFMIE1TUCBtb2R1bGUuCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9NU1BfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEdsb2JhbCBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9Nc3BJbml0KHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IFNUTTMyQ3ViZU1YIGFuZCBldmVudHVhbGx5CisgICAgICAgICAgICBtb2RpZmllZCBieSB0aGUgdXNlcgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEdsb2JhbCBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgU1RNMzJDdWJlTVggYW5kIGV2ZW50dWFsbHkKKyAgICAgICAgICAgIG1vZGlmaWVkIGJ5IHRoZSB1c2VyCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFBQUCBNU1AuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QUFBfTXNwSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBTVE0zMkN1YmVNWCBhbmQgZXZlbnR1YWxseQorICAgICAgICAgICAgbW9kaWZpZWQgYnkgdGhlIHVzZXIKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBQUFAgTVNQLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFBQX01zcERlSW5pdCh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBTVE0zMkN1YmVNWCBhbmQgZXZlbnR1YWxseQorICAgICAgICAgICAgbW9kaWZpZWQgYnkgdGhlIHVzZXIKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9wd3IuYyBiL1NyYy9zdG0zMmcweHhfaGFsX3B3ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGUwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9wd3IuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfcHdyLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfUHJpdmF0ZV9EZWZpbmVzIFBXUiBQcml2YXRlIERlZmluZXMKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1JfUFZEX1NVUFBPUlQpCisvKiogQGRlZmdyb3VwIFBXUl9QVkRfTW9kZV9NYXNrIFBXUiBQVkQgTW9kZSBNYXNrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFZEX01PREVfSVQgICAgICAgICAgIDB4MDAwMTAwMDBVICAvKiE8IE1hc2sgZm9yIGludGVycnVwdGlvbiB5aWVsZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBQVkQgdGhyZXNob2xkIGNyb3NzaW5nICAgICAqLworI2RlZmluZSBQVkRfTU9ERV9FVlQgICAgICAgICAgMHgwMDAyMDAwMFUgIC8qITwgTWFzayBmb3IgZXZlbnQgeWllbGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgUFZEIHRocmVzaG9sZCBjcm9zc2luZyAgICAgKi8KKyNkZWZpbmUgUFZEX1JJU0lOR19FREdFICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IE1hc2sgZm9yIHJpc2luZyBlZGdlIHNldCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZEIHRyaWdnZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFZEX0ZBTExJTkdfRURHRSAgICAgIDB4MDAwMDAwMDJVICAvKiE8IE1hc2sgZm9yIGZhbGxpbmcgZWRnZSBzZXQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWRCB0cmlnZ2VyICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUFdSX0V4cG9ydGVkX0Z1bmN0aW9ucyAgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgSEFMIFBXUiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0CisgICAgICAgICAgICB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGVJbml0KHZvaWQpCit7CisgIF9fSEFMX1JDQ19QV1JfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX1BXUl9SRUxFQVNFX1JFU0VUKCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgICAqKiogUFZEIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUaGUgUFZEIGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgVkREIHBvd2VyIHN1cHBseSBieSBjb21wYXJpbmcgaXQgdG8gYQorICAgICAgICAgIHRocmVzaG9sZCBzZWxlY3RlZCBieSB0aGUgUFZEIExldmVsIChQVkRSVFsyOjBdICYgUFZERlRbMjowXSBiaXRzIGluCisgICAgICAgICAgUFdSIENSMiByZWdpc3RlcikuCisgICAgICAoKykgUFZETyBmbGFnIGlzIGF2YWlsYWJsZSB0byBpbmRpY2F0ZSBpZiBWREQvVkREQSBpcyBoaWdoZXIgb3IgbG93ZXIKKyAgICAgICAgICB0aGFuIHRoZSBQVkQgdGhyZXNob2xkLiBUaGlzIGV2ZW50IGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIHRoZSBFWFRJCisgICAgICAgICAgbGluZSAxNiBhbmQgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCBpZiBlbmFibGVkLgorICAgICAgKCspIFRoZSBQVkQgaXMgc3RvcHBlZCBpbiBTdGFuZGJ5ICYgU2h1dGRvd24gbW9kZS4KKworICAgICoqKiBXYWtlVXAgcGluIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgV2FrZVVwIHBpbnMgYXJlIHVzZWQgdG8gd2FrZXVwIHRoZSBzeXN0ZW0gZnJvbSBTdGFuZGJ5IG1vZGUgb3IKKyAgICAgICAgICBTaHV0ZG93biBtb2RlLiBXYWtlVXAgcGlucyBwb2xhcml0eSBjYW4gYmUgc2V0IHRvIGNvbmZpZ3VyZSBldmVudAorICAgICAgICAgIGRldGVjdGlvbiBvbiBoaWdoIGxldmVsIChyaXNpbmcgZWRnZSkgb3IgbG93IGxldmVsIChmYWxsaW5nIGVkZ2UpLgorCisgICAgKioqIExvdyBQb3dlciBtb2RlIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBkZXZpY2VzIGZlYXR1cmUgNyBsb3ctcG93ZXIgbW9kZXM6CisgICAgICAoKykgTG93LXBvd2VyIHJ1biBtb2RlOiBjb3JlIGFuZCBwZXJpcGhlcmFscyBhcmUgcnVubmluZyBhdCBsb3cgZnJlcXVlbmN5LgorICAgICAgICAgIFJlZ3VsYXRvciBpcyBpbiBsb3cgcG93ZXIgbW9kZS4KKyAgICAgICgrKSBTbGVlcCBtb2RlOiBDb3J0ZXgtTTArIGNvcmUgc3RvcHBlZCwgcGVyaXBoZXJhbHMga2VwdCBydW5uaW5nLAorICAgICAgICAgIHJlZ3VsYXRvciBpcyBtYWluIG1vZGUuCisgICAgICAoKykgTG93LXBvd2VyIFNsZWVwIG1vZGU6IENvcnRleC1NMCsgY29yZSBzdG9wcGVkLCBwZXJpcGhlcmFscyBrZXB0IHJ1bm5pbmcKKyAgICAgICAgICBhbmQgcmVndWxhdG9yIGluIGxvdyBwb3dlciBtb2RlLgorICAgICAgKCspIFN0b3AgMCBtb2RlOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwgcmVndWxhdG9yIGlzCisgICAgICAgICAgIG1haW4gbW9kZS4KKyAgICAgICgrKSBTdG9wIDEgbW9kZTogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCBleGNlcHQgTFNJIGFuZCBMU0UsIG1haW4gcmVndWxhdG9yCisgICAgICAgICAgb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLgorICAgICAgKCspIFN0YW5kYnkgbW9kZTogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCBleGNlcHQgTFNJIGFuZCBMU0UsIHJlZ3VsYXRvciBpcworICAgICAgICAgIGRpc2FibGUuCisgICAgICAoKykgU2h1dGRvd24gbW9kZTogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCBleGNlcHQgTFNFLCByZWd1bGF0b3IgaXMKKyAgICAgICAgICBkaXNhYmxlLgorCisgICAqKiogTG93LXBvd2VyIHJ1biBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgRW50cnk6IChmcm9tIG1haW4gcnVuIG1vZGUpCisgICAgICAgICAgKCsrKSBzZXQgTFBSIGJpdCB3aXRoIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUoKSBBUEkgYWZ0ZXIKKyAgICAgICAgICAgICAgIGhhdmluZyBkZWNyZWFzZWQgdGhlIHN5c3RlbSBjbG9jayBiZWxvdyAyIE1Iei4KKyAgICAgICgrKSBFeGl0OgorICAgICAgICAgICgrKykgY2xlYXIgTFBSIGJpdCB0aGVuIHdhaXQgZm9yIFJFR0xQRiBiaXQgdG8gYmUgcmVzZXQgd2l0aAorICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKSBBUEkuIE9ubHkgdGhlbiBjYW4gdGhlCisgICAgICAgICAgICAgICBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGJlIGluY3JlYXNlZCBhYm92ZSAyIE1Iei4KKworICAgKioqIFNsZWVwIG1vZGUgLyBMb3ctcG93ZXIgc2xlZXAgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTbGVlcCAmIExvdy1wb3dlciBTbGVlcCBtb2RlcyBhcmUgZW50ZXJlZCB0aHJvdWdoCisgICAgICAgICAgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSgpIEFQSSBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRoZSByZWd1bGF0b3IKKyAgICAgICAgICBpcyBmb3JjZWQgdG8gbG93LXBvd2VyIG1vZGUgYW5kIGlmIGV4aXQgaXMgaW50ZXJydXB0IG9yIGV2ZW50CisgICAgICAgICAgdHJpZ2dlcmVkLgorICAgICAgICAgICgrKykgUFdSX01BSU5SRUdVTEFUT1JfT046IFNsZWVwIG1vZGUgKHJlZ3VsYXRvciBpbiBtYWluIG1vZGUpLgorICAgICAgICAgICgrKykgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OOiBMb3ctcG93ZXIgU2xlZXAgbW9kZSAocmVndWxhdG9yIGluIGxvdworICAgICAgICAgICAgICAgcG93ZXIgbW9kZSkuIEluIHRoaXMgY2FzZSwgdGhlIHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgbXVzdCBoYXZlCisgICAgICAgICAgICAgICBiZWVuIGRlY3JlYXNlZCBiZWxvdyAyIE1IeiBiZWZvcmVoYW5kLgorICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZJOiBDb3JlIGVudGVycyBzbGVlcCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgICAgICAgICAgKCsrKSBQV1JfU0xFRVBFTlRSWV9XRkU6IENvcmUgZW50ZXJzIHNsZWVwIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgICAgICgrKSBXRkkgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgaW50ZXJydXB0IGVuYWJsZWQgaW4gbmVzdGVkIHZlY3RvcmVkIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKQorICAgICAgKCspIFdGRSBFeGl0OgorICAgICAgICAoKyspIEFueSB3YWtldXAgZXZlbnQgaWYgY29ydGV4IGlzIGNvbmZpZ3VyZWQgd2l0aCBTRVZPTlBFTkQgPSAwCisgICAgICAgICgrKykgSW50ZXJydXB0IGV2ZW4gd2hlbiBkaXNhYmxlZCBpbiBOVklDIGlmIGNvcnRleCBpcyBjb25maWd1cmVkIHdpdGgKKyAgICAgICAgICAgICBTRVZPTlBFTkQgPSAxCisgICAgWy4uXSAgV2hlbiBleGl0aW5nIHRoZSBMb3ctcG93ZXIgU2xlZXAgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgICAgICAgICB0aGUgTUNVIGlzIGluIExvdy1wb3dlciBSdW4gbW9kZS4KKworICAgKioqIFN0b3AgMCAmIFN0b3AgMSBtb2RlcyAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTdG9wIG1vZGVzIGFyZSBlbnRlcmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBBUElzOgorICAgICAgICAgICgrKykgSEFMX1BXUl9FbnRlclNUT1BNb2RlKCkgd2l0aCBmb2xsb3dpbmcgc2V0dGluZ3M6CisgICAgICAgICAgICAgICgrKyspIFBXUl9NQUlOUkVHVUxBVE9SX09OIHRvIGVudGVyIFNUT1AwIG1vZGUuCisgICAgICAgICAgICAgICgrKyspIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiB0byBlbnRlciBTVE9QMSBtb2RlLgorICAgICAgKCspIEV4aXQgKGludGVycnVwdCBvciBldmVudC10cmlnZ2VyZWQsIHNwZWNpZmllZCB3aGVuIGVudGVyaW5nIFNUT1AgbW9kZSk6CisgICAgICAgICAgKCsrKSBQV1JfU1RPUEVOVFJZX1dGSTogZW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgICAgICAgICAgKCsrKSBQV1JfU1RPUEVOVFJZX1dGRTogZW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uCisgICAgICAoKykgV0ZJIEV4aXQ6CisgICAgICAgICAgKCsrKSBBbnkgRVhUSSBsaW5lIChpbnRlcm5hbCBvciBleHRlcm5hbCkgY29uZmlndXJlZCBpbiBpbnRlcnJ1cHQgbW9kZQorICAgICAgICAgICAgICAgd2l0aCBjb3JyZXNwb25kaW5nIGludGVycnVwdCBlbmFibGUgaW4gTlZJQworICAgICAgKCspIFdGRSBFeGl0OgorICAgICAgICAgICgrKykgQW55IEVYVEkgbGluZSAoaW50ZXJuYWwgb3IgZXh0ZXJuYWwpIGNvbmZpZ3VyZWQgaW4gZXZlbnQgbW9kZSBpZgorICAgICAgICAgICAgICAgY29ydGV4IGlzIGNvbmZpZ3VyZWQgd2l0aCBTRVZPTlBFTkQgPSAwCisgICAgICAgICAgKCsrKSBBbnkgRVhUSSBsaW5lIGNvbmZpZ3VyZWQgaW4gaW50ZXJydXB0IG1vZGUgKGV2ZW4gaWYgdGhlCisgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIEVYVEkgSW50ZXJydXB0IHZlY3RvciBpcyBkaXNhYmxlZCBpbiB0aGUgTlZJQykgaWYKKyAgICAgICAgICAgICAgIGNvcnRleCBpcyBjb25maWd1cmVkIHdpdGggU0VWT05QRU5EID0gMC4gVGhlIGludGVycnVwdCBzb3VyY2UgY2FuCisgICAgICAgICAgICAgICBiZSBleHRlcm5hbCBpbnRlcnJ1cHRzIG9yIHBlcmlwaGVyYWxzIHdpdGggd2FrZXVwIGNhcGFiaWxpdHkuCisgICAgWy4uXSAgV2hlbiBleGl0aW5nIFN0b3AsIHRoZSBNQ1UgaXMgZWl0aGVyIGluIFJ1biBtb2RlIG9yIGluIExvdy1wb3dlciBSdW4gbW9kZQorICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgTFBSIGJpdCBzZXR0aW5nLgorCisgICAqKiogU3RhbmRieSBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIEluIFN0YW5kYnkgbW9kZSwgaXQgaXMgcG9zc2libGUgdG8ga2VlcCBiYWNrdXAgU1JBTSBjb250ZW50IChkZWZpbmVkIGFzCisgICAgICAgICBmdWxsIFNSQU0pIGtlZXBpbmcgbG93IHBvd2VyIHJlZ3VsYXRvciBvbi4gVGhpcyBpcyBhY2hpZXZhYmxlIGJ5IHNldHRpbmcKKyAgICAgICAgIFJhbSByZXRlbnRpb24gYml0IGNhbGxpbmcgSEFMX1BXUkV4X0VuYWJsZVNSQU1SZXRlbnRpb24gQVBJLiBUaGlzIGluY3JlYXNlcworICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICAgICAgICBJdHMgYWxzbyBwb3NzaWJsZSB0byBkZWZpbmUgSS9PIHN0YXRlcyB1c2luZyBBUElzOgorICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsVXAsIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24gJgorICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnCisgICAgICAoKykgRW50cnk6CisgICAgICAgICAgKCsrKSBUaGUgU3RhbmRieSBtb2RlIGlzIGVudGVyZWQgdGhyb3VnaCBIQUxfUFdSX0VudGVyU1RBTkRCWU1vZGUoKSBBUEksIGJ5CisgICAgICAgICAgICAgICBzZXR0aW5nIFNMRUVQREVFUCBpbiBDb3J0ZXggY29udHJvbCByZWdpc3Rlci4KKyAgICAgICgrKSBFeGl0OgorICAgICAgICAgICgrKykgV0tVUCBwaW4gZWRnZSBkZXRlY3Rpb24sIFJUQyBldmVudCAod2FrZXVwLCBhbGFybSwgdGltZXN0YW1wKSwKKyAgICAgICAgICAgICAgIHRhbXBlciBldmVudCAoaW50ZXJuYWwgJiBleHRlcm5hbCksIExTRSBDU1MgZGV0ZWN0aW9uLCByZXNldCBvbgorICAgICAgICAgICAgICAgTlJTVCBwaW4sIElXREcgcmVzZXQgJiBCT1IgcmVzZXQuCisgICAgWy4uXSBFeGl0aW5nIFN0YW5kYnkgZ2VuZXJhdGVzIGEgcG93ZXIgcmVzZXQ6IENvcnRleCBpcyByZXNldCBhbmQgZXhlY3V0ZQorICAgICAgICAgUmVzZXQgaGFuZGxlciB2ZWN0b3IsIGFsbCByZWdpc3RlcnMgaW4gdGhlIFZjb3JlIGRvbWFpbiBhcmUgc2V0IHRvCisgICAgICAgICB0aGVpciByZXNldCB2YWx1ZS4gUmVnaXN0ZXJzIG91dHNpZGUgdGhlIFZDT1JFIGRvbWFpbiAoUlRDLCBXS1VQLCBJV0RHLAorICAgICAgICAgYW5kIFN0YW5kYnkvU2h1dGRvd24gbW9kZXMgY29udHJvbCkgYXJlIG5vdCBpbXBhY3RlZC4KKworICAgICoqKiBTaHV0ZG93biBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIEluIFNodXRkb3duIG1vZGUsCisgICAgICAgIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGRpc2FibGVkLCBhbGwgY2xvY2tzIGFyZSBvZmYgZXhjZXB0IExTRSwgUlJTIGJpdCBpcworICAgICAgICBjbGVhcmVkLiBTUkFNIGFuZCByZWdpc3RlcnMgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciBiYWNrdXAgZG9tYWluCisgICAgICAgIHJlZ2lzdGVycy4KKyAgICAgICgrKSBFbnRyeToKKyAgICAgICAgICAoKyspIFRoZSBTaHV0ZG93biBtb2RlIGlzIGVudGVyZWQgdGhydSBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUoKSBBUEksCisgICAgICAgICAgICAgICBieSBzZXR0aW5nIFNMRUVQREVFUCBpbiBDb3J0ZXggY29udHJvbCByZWdpc3Rlci4KKyAgICAgICgrKSBFeGl0OgorICAgICAgICAgICgrKykgV0tVUCBwaW4gZWRnZSBkZXRlY3Rpb24sIFJUQyBldmVudCAod2FrZXVwLCBhbGFybSwgdGltZXN0YW1wKSwKKyAgICAgICAgICAgICAgIHRhbXBlciBldmVudCAoaW50ZXJuYWwgJiBleHRlcm5hbCksIExTRSBDU1MgZGV0ZWN0aW9uLCByZXNldCBvbgorICAgICAgICAgICAgICAgTlJTVCBwaW4uCisgICAgWy4uXSBFeGl0aW5nIFNodXRkb3duIGdlbmVyYXRlcyBhIGJyb3duIG91dCByZXNldDogQ29ydGV4IGlzIHJlc2V0IGFuZCBleGVjdXRlCisgICAgICAgICBSZXNldCBoYW5kbGVyIHZlY3RvciwgYWxsIHJlZ2lzdGVycyBhcmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlIGJ1dCBvbmVzCisgICAgICAgICBpbiBiYWNrdXAgZG9tYWluLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAgKiAgICAgICAgIChSVEMgJiBUQU1QIHJlZ2lzdGVycywgYmFja3VwIHJlZ2lzdGVycywgUkNDIEJEQ1IgcmVnaXN0ZXIpLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBiYWNrdXAgZG9tYWluIGlzIHByb3RlY3RlZCBhZ2FpbnN0CisgICogICAgICAgICBwb3NzaWJsZSB1bndhbnRlZCB3cml0ZSBhY2Nlc3Nlcy4gQWxsIFJUQyAmIFRBTVAgcmVnaXN0ZXJzIChiYWNrdXAKKyAgKiAgICAgICAgIHJlZ2lzdGVycyBpbmNsdWRlZCkgYW5kIFJDQyBCRENSIHJlZ2lzdGVyIGFyZSBjb25jZXJuZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworfQorCisKKyNpZiBkZWZpbmVkKFBXUl9QVkRfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yIChQVkQpLgorICAqIEBwYXJhbSAgc0NvbmZpZ1BWRCBwb2ludGVyIHRvIGEgUFdSX1BWRFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlCisgICAgICAgICAgICBQVkQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbjogdGhyZXNob2xkIGxldmVscywgb3BlcmF0aW5nIG1vZGUuCisgICogQG5vdGUgICBSZWZlciB0byB0aGUgZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBkZXZpY2UgZGF0YXNoZWV0IGZvcgorICAqICAgICAgICAgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZHMgY29ycmVzcG9uZGluZyB0byBlYWNoCisgICogICAgICAgICBkZXRlY3Rpb24gbGV2ZWwuCisgICogQG5vdGUgICBVc2VyIHNob3VsZCB0YWtlIGNhcmUgdGhhdCByaXNpbmcgdGhyZXNob2xkIGlzIGhpZ2hlciB0aGFuIGZhbGxpbmcKKyAgKiAgICAgICAgIG9uZSBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgYWx3YXlzIFBWRE8gb3V0cHV0IHNldC4KKyAgKiBAcmV0dmFsIEhBTF9PSworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUl9Db25maWdQVkQoUFdSX1BWRFR5cGVEZWYgKnNDb25maWdQVkQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfUFZEX0xFVkVMKHNDb25maWdQVkQtPlBWRExldmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfUFZEX01PREUoc0NvbmZpZ1BWRC0+TW9kZSkpOworCisgIC8qIFNldCBQVkQgbGV2ZWwgYml0cyBvbmx5IGFjY29yZGluZyB0byBQVkRMZXZlbCB2YWx1ZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IyLCAoUFdSX0NSMl9QVkRGVCB8IFBXUl9DUjJfUFZEUlQpLCBzQ29uZmlnUFZELT5QVkRMZXZlbCk7CisKKyAgLyogQ2xlYXIgYW55IHByZXZpb3VzIGNvbmZpZywgaW4gY2FzZSBubyBldmVudCBvciBJVCBtb2RlIGlzIHNlbGVjdGVkICovCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UKCk7CisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCk7CisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOworICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOworCisgIC8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbW9kZSAqLworICBpZigoc0NvbmZpZ1BWRC0+TW9kZSAmIFBWRF9NT0RFX0lUKSA9PSBQVkRfTU9ERV9JVCkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX01PREVfRVZUKSA9PSBQVkRfTU9ERV9FVlQpCisgIHsKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UKCk7CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgaWYoKHNDb25maWdQVkQtPk1vZGUgJiBQVkRfUklTSU5HX0VER0UpID09IFBWRF9SSVNJTkdfRURHRSkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgfQorCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX0ZBTExJTkdfRURHRSkgPT0gUFZEX0ZBTExJTkdfRURHRSkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yIChQVkQpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciAoUFZEKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlUFZEKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4KKyAgKiBAcGFyYW0gIFdha2VVcFBpblBvbGFyaXR5IFNwZWNpZmllcyB3aGljaCBXYWtlLVVwIHBpbiB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZhbHVlcyB3aGljaCBzZXQKKyAgKiAgICAgICAgIHRoZSBkZWZhdWx0IHBvbGFyaXR5IGkuZS4gZGV0ZWN0aW9uIG9uIGhpZ2ggbGV2ZWwgKHJpc2luZyBlZGdlKToKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9XQUtFVVBfUElOMSwgUFdSX1dBS0VVUF9QSU4yLCBQV1JfV0FLRVVQX1BJTjQsCisgICogICAgICAgICAgICAgICAgUFdSX1dBS0VVUF9QSU41LFBXUl9XQUtFVVBfUElONgorICAqICAgICAgICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWUgd2hlcmUgdGhlIHVzZXIgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeQorICAqICAgICAgICAgdGhlIGVuYWJsZWQgcGluIGFuZCB0aGUgY2hvc2VuIHBvbGFyaXR5OgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4xX0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4yX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4yX0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU40X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU40X0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU41X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU41X0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU42X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU42X0xPVworICAqIEBub3RlICBQV1JfV0FLRVVQX1BJTnggYW5kIFBXUl9XQUtFVVBfUElOeF9ISUdIIGFyZSBlcXVpdmFsZW50LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9XQUtFVVBfUElOKFdha2VVcFBpblBvbGFyaXR5KSk7CisKKyAgLyogU3BlY2lmaWVzIHRoZSBXYWtlLVVwIHBpbiBwb2xhcml0eSBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbgorICAgIChyaXNpbmcgb3IgZmFsbGluZyBlZGdlKSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1I0LCAoUFdSX0NSNF9XUCAmIFdha2VVcFBpblBvbGFyaXR5KSwgKFdha2VVcFBpblBvbGFyaXR5ID4+IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpKTsKKworICAvKiBFbmFibGUgd2FrZS11cCBwaW4gKi8KKyAgU0VUX0JJVChQV1ItPkNSMywgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5LgorICAqIEBwYXJhbSAgV2FrZVVwUGlueCBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xLCBQV1JfV0FLRVVQX1BJTjIsIFBXUl9XQUtFVVBfUElONCwKKyAgKiAgICAgICAgICAgICAgICBQV1JfV0FLRVVQX1BJTjUsUFdSX1dBS0VVUF9QSU42CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KQoreworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1dBS0VVUF9QSU4oV2FrZVVwUGlueCkpOworCisgIENMRUFSX0JJVChQV1ItPkNSMywgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpbngpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVudGVyIFNsZWVwIG9yIExvdy1wb3dlciBTbGVlcCBtb2RlLgorICAqIEBub3RlICAgSW4gU2xlZXAvTG93LXBvd2VyIFNsZWVwIG1vZGUsIGFsbCBJL08gcGlucyBrZWVwIHRoZSBzYW1lIHN0YXRlIGFzCisgICogICAgICAgICBpbiBSdW4gbW9kZS4KKyAgKiBAcGFyYW0gIFJlZ3VsYXRvciBTcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBzdGF0ZSBpbiBTbGVlcC9Mb3ctcG93ZXIgU2xlZXAKKyAgKiAgICAgICAgIG1vZGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTUFJTlJFR1VMQVRPUl9PTiBTbGVlcCBtb2RlIChyZWd1bGF0b3IgaW4gbWFpbiBtb2RlKQorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OIExvdy1wb3dlciBTbGVlcCBtb2RlIChyZWd1bGF0b3IKKyAgKiAgICAgICAgICAgICAgICAgICAgIGluIGxvdy1wb3dlciBtb2RlKQorICAqIEBub3RlICAgTG93LXBvd2VyIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCBmcm9tIExvdy1wb3dlciBSdW4gbW9kZSBvbmx5LiBJbgorICAqICAgICAgICAgY2FzZSBSZWd1bGF0b3IgcGFyYW1ldGVyIGlzIHNldCB0byBMb3cgUG93ZXIgYnV0IE1DVSBpcyBpbiBSdW4gbW9kZSwKKyAgKiAgICAgICAgIHdlIHdpbGwgZmlyc3QgZW50ZXIgaW4gTG93LXBvd2VyIFJ1biBtb2RlLiBUaGVyZWZvcmUsIHVzZXIgc2hvdWxkCisgICogICAgICAgICB0YWtlIGNhcmUgdGhhdCBIQ0xLIGZyZXF1ZW5jeSBpcyBsZXNzIHRoYW4gMiBNSHouCisgICogQG5vdGUgICBXaGVuIGV4aXRpbmcgTG93LXBvd2VyIFNsZWVwIG1vZGUsIHRoZSBNQ1UgaXMgaW4gTG93LXBvd2VyIFJ1biBtb2RlLgorICAqICAgICAgICAgVG8gc3dpdGNoIGJhY2sgdG8gUnVuIG1vZGUsIHVzZXIgbXVzdCBjYWxsCisgICogICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIEFQSS4KKyAgKiBAcGFyYW0gIFNMRUVQRW50cnkgU3BlY2lmaWVzIGlmIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCB3aXRoIFdGSSBvciBXRkUKKyAgKiAgICAgICAgIGluc3RydWN0aW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NMRUVQRU5UUllfV0ZJIGVudGVyIFNsZWVwIG9yIExvdy1wb3dlciBTbGVlcAorICAqICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NMRUVQRU5UUllfV0ZFIGVudGVyIFNsZWVwIG9yIExvdy1wb3dlciBTbGVlcAorICAqICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAqIEBub3RlICAgV2hlbiBXRkkgZW50cnkgaXMgdXNlZCwgdGljayBpbnRlcnJ1cHQgaGF2ZSB0byBiZSBkaXNhYmxlZCBpZiBub3QKKyAgKiAgICAgICAgIGRlc2lyZWQgYXMgdGhlIGludGVycnVwdCB3YWtlIHVwIHNvdXJjZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNMRUVQTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU0xFRVBFbnRyeSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU0xFRVBfRU5UUlkoU0xFRVBFbnRyeSkpOworCisgIC8qIFNldCBSZWd1bGF0b3IgcGFyYW1ldGVyICovCisgIGlmKFJlZ3VsYXRvciAhPSBQV1JfTUFJTlJFR1VMQVRPUl9PTikKKyAgeworICAgIC8qIElmIGluIHJ1biBtb2RlLCBmaXJzdCBtb3ZlIHRvIGxvdy1wb3dlciBydW4gbW9kZS4KKyAgICAgICBUaGUgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGJlIGJlbG93IDIgTUh6IGF0IHRoaXMgcG9pbnQuICovCisgICAgaWYoKFBXUi0+U1IyICYgUFdSX1NSMl9SRUdMUEYpID09IDB4MDB1KQorICAgIHsKKyAgICAgIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUoKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSWYgaW4gbG93LXBvd2VyIHJ1biBtb2RlIGF0IHRoaXMgcG9pbnQsIGV4aXQgaXQgKi8KKyAgICBpZigoUFdSLT5TUjIgJiBQV1JfU1IyX1JFR0xQRikgIT0gMHgwMHUpCisgICAgeworICAgICAgaWYgKEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKKworICAvKiBTZWxlY3QgU0xFRVAgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYoU0xFRVBFbnRyeSA9PSBQV1JfU0xFRVBFTlRSWV9XRkkpCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICAgIF9fV0ZJKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLworICAgIF9fU0VWKCk7CisgICAgX19XRkUoKTsKKyAgICBfX1dGRSgpOworICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbnRlciBTdG9wIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIG5hbWVkIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoCisgICogICAgICAgICBsZWdhY3kgY29kZSBydW5uaW5nIG9uIGRldmljZXMgd2hlcmUgb25seSAiU3RvcCBtb2RlIiBpcyBtZW50aW9uZWQKKyAgKiAgICAgICAgIHdpdGggbWFpbiBvciBsb3cgcG93ZXIgcmVndWxhdG9yIE9OLgorICAqIEBub3RlICAgSW4gU3RvcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAbm90ZSAgIEFsbCBjbG9ja3MgaW4gdGhlIFZDT1JFIGRvbWFpbiBhcmUgc3RvcHBlZDsgdGhlIFBMTCwgdGhlIEhTSSBhbmQgdGhlCisgICogICAgICAgICBIU0Ugb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBTb21lIHBlcmlwaGVyYWxzIHdpdGggdGhlIHdha2V1cAorICAqICAgICAgICAgY2FwYWJpbGl0eSBjYW4gc3dpdGNoIG9uIHRoZSBIU0kgdG8gcmVjZWl2ZSBhIGZyYW1lLCBhbmQgc3dpdGNoIG9mZgorICAqICAgICAgICAgdGhlIEhTSSBhZnRlciByZWNlaXZpbmcgdGhlIGZyYW1lIGlmIGl0IGlzIG5vdCBhIHdha2V1cCBmcmFtZS4KKyAgKiAgICAgICAgIFNSQU0gYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuCisgICogICAgICAgICBUaGUgQk9SIGlzIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgIFRoZSB2b2x0YWdlIHJlZ3VsYXRvciBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgaW4gbm9ybWFsIChTdG9wIDApIG9yCisgICogICAgICAgICBsb3ctcG93ZXIgbW9kZSAoU3RvcCAxKS4KKyAgKiBAbm90ZSAgIFdoZW4gZXhpdGluZyBTdG9wIDAgb3IgU3RvcCAxIG1vZGUgYnkgaXNzdWluZyBhbiBpbnRlcnJ1cHQgb3IgYQorICAqICAgICAgICAgd2FrZXVwIGV2ZW50LCB0aGUgSFNJIFJDIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrCisgICogQG5vdGUgICBXaGVuIHRoZSB2b2x0YWdlIHJlZ3VsYXRvciBvcGVyYXRlcyBpbiBsb3cgcG93ZXIgbW9kZSAoU3RvcCAxKSwKKyAgKiAgICAgICAgIGFuIGFkZGl0aW9uYWwgc3RhcnR1cCBkZWxheSBpcyBpbmN1cnJlZCB3aGVuIHdha2luZyB1cC4gQnkga2VlcGluZworICAqICAgICAgICAgdGhlIGludGVybmFsIHJlZ3VsYXRvciBPTiBkdXJpbmcgU3RvcCBtb2RlIChTdG9wIDApLCB0aGUgY29uc3VtcHRpb24KKyAgKiAgICAgICAgIGlzIGhpZ2hlciBhbHRob3VnaCB0aGUgc3RhcnR1cCB0aW1lIGlzIHJlZHVjZWQuCisgICogQHBhcmFtICBSZWd1bGF0b3IgU3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igc3RhdGUgaW4gU3RvcCBtb2RlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9NQUlOUkVHVUxBVE9SX09OICBTdG9wIDAgbW9kZSAobWFpbiByZWd1bGF0b3IgT04pCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OICBTdG9wIDEgbW9kZSAobG93IHBvd2VyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGF0b3IgT04pCisgICogQHBhcmFtICBTVE9QRW50cnkgU3BlY2lmaWVzIFN0b3AgMCBvciBTdG9wIDEgbW9kZSBpcyBlbnRlcmVkIHdpdGggV0ZJIG9yCisgICogICAgICAgICBXRkUgaW5zdHJ1Y3Rpb24uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NUT1BFTlRSWV9XRkkgIEVudGVyIFN0b3AgMCBvciBTdG9wIDEgbW9kZSB3aXRoIFdGSQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGRSAgRW50ZXIgU3RvcCAwIG9yIFN0b3AgMSBtb2RlIHdpdGggV0ZFCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNUT1BFbnRyeSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9SRUdVTEFUT1IoUmVndWxhdG9yKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU1RPUF9FTlRSWShTVE9QRW50cnkpKTsKKworICBpZiAoUmVndWxhdG9yICE9IFBXUl9NQUlOUkVHVUxBVE9SX09OKQorICB7CisgICAgLyogU3RvcCBtb2RlIHdpdGggTG93LVBvd2VyIFJlZ3VsYXRvciAqLworICAgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0xPV1BPV0VSTU9ERV9TVE9QMSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU3RvcCBtb2RlIHdpdGggTWFpbiBSZWd1bGF0b3IgKi8KKyAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9MT1dQT1dFUk1PREVfU1RPUDApOworICB9CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKyAgLyogU2VsZWN0IFN0b3AgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgICAgX19XRkkoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEV2ZW50ICovCisgICAgX19TRVYoKTsKKyAgICBfX1dGRSgpOworICAgIF9fV0ZFKCk7CisgIH0KKworICAvKiBSZXNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbnRlciBTdGFuZGJ5IG1vZGUuCisgICogQG5vdGUgICBJbiBTdGFuZGJ5IG1vZGUsIHRoZSBQTEwsIHRoZSBIU0kgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMgYXJlCisgICogICAgICAgICBzd2l0Y2hlZCBvZmYuIFRoZSB2b2x0YWdlIHJlZ3VsYXRvciBpcyBkaXNhYmxlZC4gU1JBTSBhbmQgcmVnaXN0ZXIKKyAgKiAgICAgICAgIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgcmVnaXN0ZXJzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZAorICAqICAgICAgICAgU3RhbmRieSBjaXJjdWl0cnkuIEJPUiBpcyBhdmFpbGFibGUuCisgICogQG5vdGUgICBUaGUgSS9PcyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgd2l0aCBhIHB1bGwtdXAgb3IgcHVsbC1kb3duIG9yIGNhbgorICAqICAgICAgICAgYmUga2VwdCBpbiBhbmFsb2cgc3RhdGUuCisgICogICAgICAgICBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCgpIGFuZCBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKCkKKyAgKiAgICAgICAgIHJlc3BlY3RpdmVseSBlbmFibGUgUHVsbCBVcCBhbmQgUHVsbERvd24gc3RhdGUuCisgICogICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsVXAoKSAmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxEb3duKCkKKyAgKiAgICAgICAgIGRpc2FibGUgdGhlIHNhbWUuIFRoZXNlIHN0YXRlcyBhcmUgZWZmZWN0aXZlIGluIFN0YW5kYnkgbW9kZSBvbmx5IGlmCisgICogICAgICAgICBBUEMgYml0IGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4KKyAgKiBAbm90ZSAgIFNyYW0gY29udGVudCBjYW4gYmUga2VwdCBzZXR0aW5nIFJSUyB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVTUkFNUmV0ZW50aW9uKCkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKHZvaWQpCit7CisgIC8qIFNldCBTdGFuZC1ieSBtb2RlICovCisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0xPV1BPV0VSTU9ERV9TVEFOREJZKTsKKworICAvKiBTZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKKworLyogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBzdG9yZSBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQgKi8KKyNpZiBkZWZpbmVkICggX19DQ19BUk0pCisgIF9fZm9yY2Vfc3RvcmVzKCk7CisjZW5kaWYKKworICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICBfX1dGSSgpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNsZWVwLU9uLUV4aXQgQ29ydGV4IGZlYXR1cmUKKyAgKiBAbm90ZSAgIFNldCBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlCisgICogICAgICAgICBwcm9jZXNzb3IgZW50ZXJzIFNMRUVQIG9yIERFRVBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uCisgICogICAgICAgICBoYW5kbGluZyBpcyBvdmVyIHJldHVybmluZyB0byB0aHJlYWQgbW9kZS4gU2V0dGluZyB0aGlzIGJpdCBpcworICAqICAgICAgICAgdXNlZnVsIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBleHBlY3RlZCB0byBydW4gb25seSBvbiBpbnRlcnJ1cHRpb25zCisgICogICAgICAgICBoYW5kbGluZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKQoreworICAvKiBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBPTkVYSVRfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNsZWVwLU9uLUV4aXQgQ29ydGV4IGZlYXR1cmUKKyAgKiBAbm90ZSAgIENsZWFyIFNMRUVQT05FWElUIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUKKyAgKiAgICAgICAgIHByb2Nlc3NvciBlbnRlcnMgU0xFRVAgb3IgREVFUFNMRUVQIG1vZGUgd2hlbiBhbiBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgIGhhbmRsaW5nIGlzIG92ZXIuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpCit7CisgIC8qIENsZWFyIFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBPTkVYSVRfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ29ydGV4IFNldiBPbiBQZW5kaW5nIGZlYXR1cmUuCisgICogQG5vdGUgICBTZXQgU0VWT05QRU5EIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCBlbmFibGVkCisgICogICAgICAgICBldmVudHMgYW5kIGFsbCBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgZGlzYWJsZWQgb25lcyBjYW4gd2FrZXVwCisgICogICAgICAgICBwcm9jZXNzb3IgZnJvbSBXRkUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlU0VWT25QZW5kKHZvaWQpCit7CisgIC8qIFNldCBTRVZPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0VWT05QRU5EX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDb3J0ZXggU2V2IE9uIFBlbmRpbmcgZmVhdHVyZS4KKyAgKiBAbm90ZSAgIENsZWFyIFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyLCBvbmx5CisgICogICAgICAgICBlbmFibGUgaW50ZXJydXB0cyBvciBldmVudHMgY2FuIHdha2V1cCBwcm9jZXNzb3IgZnJvbSBXRkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU0VWT25QZW5kKHZvaWQpCit7CisgIC8qIENsZWFyIFNFVk9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NFVk9OUEVORF9Nc2spKTsKK30KKworI2lmIGRlZmluZWQoUFdSX1BWRF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFBXUiBQVkQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIHRoZSBQVkRfSVJRSGFuZGxlcigpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX1BWRF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFBXUiBleHRpIFJpc2luZyBmbGFnICovCisgIGlmKF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfUklTSU5HX0ZMQUcoKSAhPSAweDBVKQorICB7CisgICAgLyogQ2xlYXIgUFZEIGV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfUklTSU5HX0ZMQUcoKTsKKworICAgIC8qIFBXUiBQVkQgaW50ZXJydXB0IHJpc2luZyB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUl9QVkRfUmlzaW5nX0NhbGxiYWNrKCk7CisgIH0KKworICAvKiBDaGVjayBQV1IgZXh0aSBmYWxsbGluZyBmbGFnICovCisgIGlmKF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkFMTElOR19GTEFHKCkgIT0gMHgwVSkKKyAgeworICAgIC8qIENsZWFyIFBWRCBleHRpIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZBTExJTkdfRkxBRygpOworCisgICAgLyogUFdSIFBWRCBpbnRlcnJ1cHQgZmFsbGluZyB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUl9QVkRfRmFsbGluZ19DYWxsYmFjaygpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUFdSIFBWRCBpbnRlcnJ1cHQgcmlzaW5nIGNhbGxiYWNrCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUFdSX1BWRF9SaXNpbmdfQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QV1JfUFZEX1Jpc2luZ19DYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFBXUiBQVkQgaW50ZXJydXB0IEZhbGxpbmcgY2FsbGJhY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QV1JfUFZEX0ZhbGxpbmdfQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QV1JfUFZEX0ZhbGxpbmdfQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgKi8KK30KKworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUFdSX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfcHdyX2V4LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9wd3JfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTgyNTJiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfcHdyX2V4LmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3B3cl9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBQV1IgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUG93ZXIgQ29udHJvbGxlciAoUFdSKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXgKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1BXUl9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX0V4dGVuZGVkX1ByaXZhdGVfRGVmaW5lcyBQV1IgRXh0ZW5kZWQgUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9UaW1lT3V0X1ZhbHVlICBQV1JFeCBGbGFnIFNldHRpbmcgVGltZSBPdXQgVmFsdWUKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfUkVHTFBGX1NFVFRJTkdfREVMQVlfNl9VUyAgICAgICA2dSAgLyohPCBSRUdMUEYgc2hvdWxkIHJpc2UgaW4gYWJvdXQgNSB1cyBwbHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgQVBCIGNsb2NrLiBUYWtpbmcgaW4gYWNjb3VudCBtYXggU3lzY2xrIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgTUh6LCBhbmQgcm91bmRlZCB0byB1cHBlciB2YWx1ZSAqLworCisjZGVmaW5lIFBXUl9WT1NGX1NFVFRJTkdfREVMQVlfNl9VUyAgICAgICAgIDZ1ICAvKiE8IFZPU0Ygc2hvdWxkIHJpc2UgaW4gYWJvdXQgNSB1cyBwbHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgQVBCIGNsb2NrLiBUYWtpbmcgaW4gYWNjb3VudCBtYXggU3lzY2xrIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2IE1IeiwgYW5kIHJvdW5kZWQgdG8gdXBwZXIgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfR3Bpb19QaW5fTnVtYmVyICBQV1JFeCBHcGlvIFBpbiBOdW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfR1BJT19QSU5fTkIgICAgICAgICAgICAgICAgICAgICAxNnUgIC8qITwgTnVtYmVyIG9mIGdwaW8gcGluIGluIGJhbmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nLgorICAqIEBub3RlICAgV2hlbiBWREQgaXMgcHJlc2VudCwgY2hhcmdlIHRoZSBleHRlcm5hbCBiYXR0ZXJ5IG9uIFZCQVQgdGhydSBhbgorICAqICAgICAgICAgaW50ZXJuYWwgcmVzaXN0b3IuCisgICogQHBhcmFtICBSZXNpc3RvclNlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIHJlc2lzdG9yIGltcGVkYW5jZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl81ICAgICA1IGtPaG1zIHJlc2lzdG9yCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl8xXzUgMS41IGtPaG1zIHJlc2lzdG9yCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVCYXR0ZXJ5Q2hhcmdpbmcodWludDMyX3QgUmVzaXN0b3JTZWxlY3Rpb24pCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9CQVRURVJZX1JFU0lTVE9SX1NFTEVDVChSZXNpc3RvclNlbGVjdGlvbikpOworCisgIC8qIFNwZWNpZnkgcmVzaXN0b3Igc2VsZWN0aW9uIGFuZCBlbmFibGUgYmF0dGVyeSBjaGFyZ2luZyAqLworICB0bXByZWcgPSAoUFdSLT5DUjQgJiB+UFdSX0NSNF9WQlJTKTsKKyAgUFdSLT5DUjQgPSAodG1wcmVnIHwgUmVzaXN0b3JTZWxlY3Rpb24gfCBQV1JfQ1I0X1ZCRSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgYmF0dGVyeSBjaGFyZ2luZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7Cit9CisKKyNpZiBkZWZpbmVkKFBXUl9DUjNfRU5CX1VMUCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBPUiBNb25pdG9yIHNhbXBsaW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIGVudGVyaW5nIHVsdHJhIGxvdyBwb3dlciBtb2RlcyAoc3RhbmRieSwgc2h1dGRvd24pIHRoaXMgZmVhdHVyZQorICAqICAgICAgICAgY2FuIGJlIGVuYWJsZWQgdG8gcmVkdWNlIGZ1cnRoZXIgY29uc3VtcHRpb246IFBvd2VyIE9uIFJlc2V0IG1vbml0b3IKKyAgKiAgICAgICAgIGlzIHRoZW4gc2V0IGluIHNhbXBsaW5nIG1vZGUsIGFuZCBubyBtb3JlIGluIGFsd2F5cyBvbiBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlUE9STW9uaXRvclNhbXBsaW5nKHZvaWQpCit7CisgIFBXUi0+Q1IzIHw9IFBXUl9DUjNfRU5CX1VMUDsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUE9SIE1vbml0b3Igc2FtcGxpbmcgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQT1JNb25pdG9yU2FtcGxpbmcodm9pZCkKK3sKKyAgUFdSLT5DUjMgJj0gflBXUl9DUjNfRU5CX1VMUDsKK30KKyNlbmRpZgorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEludGVybmFsIFdha2UtdXAgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUludGVybmFsV2FrZVVwTGluZSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV1VMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSW50ZXJuYWwgV2FrZS11cCBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUludGVybmFsV2FrZVVwTGluZSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUlXVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEdQSU8gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAgKiBAbm90ZSAgIFNldCB0aGUgcmVsZXZhbnQgUFV5IGJpdCBvZiBQV1JfUFVDUnggcmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBJL08gaW4KKyAgKiAgICAgICAgIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBUaGlzIHN0YXRlIGlzIGVmZmVjdGl2ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcyBvbmx5IGlmIEFQQyBiaXQKKyAgKiAgICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4KKyAgKiBAbm90ZSAgIFRoZSBjb25maWd1cmF0aW9uIGlzIGxvc3Qgd2hlbiBleGl0aW5nIHRoZSBTaHV0ZG93biBtb2RlIGR1ZSB0byB0aGUKKyAgKiAgICAgICAgIHBvd2VyLW9uIHJlc2V0LCBtYWludGFpbmVkIHdoZW4gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlLgorICAqIEBub3RlICAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUgY29ycmVzcG9uZGluZworICAqICAgICAgICAgUER5IGJpdCBvZiBQV1JfUERDUnggcmVnaXN0ZXIgaXMgY2xlYXJlZCB1bmxlc3MgaXQgaXMgcmVzZXJ2ZWQuCisgICogQHBhcmFtICBHUElPIFNwZWNpZnkgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLCAuLi4sIFBXUl9HUElPX0YKKyAgKiAgICAgICAgIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgR1BJT051bWJlciBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciBwb3J0cyB3aGVyZSBsZXNzCisgICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gc2V0CisgICogICAgICAgICBzZXZlcmFsIGJpdHMgZm9yIGEgZ2l2ZW4gcG9ydCBpbiBhIHNpbmdsZSBBUEkgY2FsbC4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7CisKKyAgc3dpdGNoIChHUElPKQorICB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQSwgKEdQSU9OdW1iZXIgJiB+UFdSX0dQSU9fQklUXzE0KSk7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkEsIChHUElPTnVtYmVyICYgflBXUl9HUElPX0JJVF8xMykpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQiwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkIsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQywgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkMsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRCwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkQsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19GOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRiwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkYsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgR1BJTyBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgbW9kZSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBSZXNldCB0aGUgcmVsZXZhbnQgUFV5IGJpdCBvZiBQV1JfUFVDUnggcmVnaXN0ZXIgdXNlZCB0byBjb25maWd1cmUgdGhlIEkvTworICAqICAgICAgICAgaW4gcHVsbC11cCBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAgKiBAcGFyYW0gIEdQSU8gU3BlY2lmaWVzIHRoZSBJTyBwb3J0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgUFdSX0dQSU9fQSwgLi4uLCBQV1JfR1BJT19GCisgICogICAgICAgICB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgcG9ydHMgd2hlcmUgbGVzcworICAqICAgICAgICAgSS9PIHBpbnMgYXJlIGF2YWlsYWJsZSkgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygc2V2ZXJhbCBvZiB0aGVtIHRvIHJlc2V0CisgICogICAgICAgICBzZXZlcmFsIGJpdHMgZm9yIGEgZ2l2ZW4gcG9ydCBpbiBhIHNpbmdsZSBBUEkgY2FsbC4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPX0JJVF9OVU1CRVIoR1BJT051bWJlcikpOworCisgIHN3aXRjaCAoR1BJTykKKyAgeworICAgIGNhc2UgUFdSX0dQSU9fQToKKyAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JBLCAoR1BJT051bWJlciAmIH5QV1JfR1BJT19CSVRfMTQpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBXUl9HUElPX0M6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQywgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUFdSX0dQSU9fRDoKKyAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19GOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkYsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgR1BJTyBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBTZXQgdGhlIHJlbGV2YW50IFBEeSBiaXQgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgSS9PIGluCisgICogICAgICAgICBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBUaGlzIHN0YXRlIGlzIGVmZmVjdGl2ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcyBvbmx5IGlmIEFQQyBiaXQKKyAgKiAgICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4KKyAgKiBAbm90ZSAgIFRoZSBjb25maWd1cmF0aW9uIGlzIGxvc3Qgd2hlbiBleGl0aW5nIHRoZSBTaHV0ZG93biBtb2RlIGR1ZSB0byB0aGUKKyAgKiAgICAgICAgIHBvd2VyLW9uIHJlc2V0LCBtYWludGFpbmVkIHdoZW4gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlLgorICAqIEBub3RlICAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUgY29ycmVzcG9uZGluZworICAqICAgICAgICAgUFV5IGJpdCBvZiBQV1JfUFVDUnggcmVnaXN0ZXIgaXMgY2xlYXJlZCB1bmxlc3MgaXQgaXMgcmVzZXJ2ZWQuCisgICogQHBhcmFtICBHUElPIFNwZWNpZnkgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLi5QV1JfR1BJT19GCisgICogICAgICAgICB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgcG9ydHMgd2hlcmUgbGVzcworICAqICAgICAgICAgSS9PIHBpbnMgYXJlIGF2YWlsYWJsZSkgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygc2V2ZXJhbCBvZiB0aGVtIHRvIHNldAorICAqICAgICAgICAgc2V2ZXJhbCBiaXRzIGZvciBhIGdpdmVuIHBvcnQgaW4gYSBzaW5nbGUgQVBJIGNhbGwuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7CisKKyAgc3dpdGNoIChHUElPKQorICB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSQSwgKEdQSU9OdW1iZXIgJiB+UFdSX0dQSU9fQklUXzEzKSk7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkEsIChHUElPTnVtYmVyICYgflBXUl9HUElPX0JJVF8xNCkpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSQiwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSQywgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSRCwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkQsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19GOgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSRiwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkYsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgR1BJTyBwdWxsLWRvd24gc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBSZXNldCB0aGUgcmVsZXZhbnQgUER5IGJpdCBvZiBQV1JfUERDUnggcmVnaXN0ZXIgdXNlZCB0byBjb25maWd1cmUgdGhlIEkvTworICAqICAgICAgICAgaW4gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLgorICAqIEBwYXJhbSAgR1BJTyBTcGVjaWZpZXMgdGhlIElPIHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBQV1JfR1BJT19BLi5QV1JfR1BJT19GCisgICogICAgICAgICB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgcG9ydHMgd2hlcmUgbGVzcworICAqICAgICAgICAgSS9PIHBpbnMgYXJlIGF2YWlsYWJsZSkgb3IgdGhlIGxvZ2ljYWwgT1Igb2Ygc2V2ZXJhbCBvZiB0aGVtIHRvIHJlc2V0CisgICogICAgICAgICBzZXZlcmFsIGJpdHMgZm9yIGEgZ2l2ZW4gcG9ydCBpbiBhIHNpbmdsZSBBUEkgY2FsbC4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7CisKKyAgc3dpdGNoIChHUElPKQorICB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkEsIChHUElPTnVtYmVyICYgflBXUl9HUElPX0JJVF8xMykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBXUl9HUElPX0I6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQiwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUFdSX0dQSU9fQzoKKyAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JDLCBHUElPTnVtYmVyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkQsIEdQSU9OdW1iZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBXUl9HUElPX0Y6CisgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRiwgR1BJT051bWJlcik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBXaGVuIEFQQyBiaXQgaXMgc2V0LCB0aGUgSS9PIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9ucyBkZWZpbmVkIGluCisgICogICAgICAgICBQV1JfUFVDUnggYW5kIFBXUl9QRENSeCByZWdpc3RlcnMgYXJlIGFwcGxpZWQgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgICBQdWxsLXVwIHNldCBieSBQVXkgYml0IG9mIFBXUl9QVUNSeCByZWdpc3RlciBpcyBub3QgYWN0aXZhdGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgICogICAgICAgICBQRHkgYml0IG9mIFBXUl9QRENSeCByZWdpc3RlciBpcyBhbHNvIHNldCAocHVsbC1kb3duIGNvbmZpZ3VyYXRpb24gcHJpb3JpdHkgaXMgaGlnaGVyKS4KKyAgKiAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbFVwKCkgYW5kIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24oKSBBUElzIGVuc3VyZSB0aGVyZQorICAqICAgICAgICAgaXMgbm8gY29uZmxpY3Qgd2hlbiBzZXR0aW5nIFBVeSBvciBQRHkgYml0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBXaGVuIEFQQyBiaXQgaXMgY2xlYXJlZCwgdGhlIEkvTyBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbnMgZGVmaW5lZCBpbgorICAqICAgICAgICAgUFdSX1BVQ1J4IGFuZCBQV1JfUERDUnggcmVnaXN0ZXJzIGFyZSBub3QgYXBwbGllZCBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQdWxsVXBQdWxsRG93bkNvbmZpZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworI2lmIGRlZmluZWQoUFdSX0NSM19SUlMpCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIFNSQU0gY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlLgorICAqIEBub3RlICBXaGVuIFJSUyBiaXQgaXMgc2V0LCBTUkFNIGlzIHBvd2VyZWQgYnkgdGhlIGxvdy1wb3dlciByZWd1bGF0b3IgaW4KKyAgKiAgICAgICAgIFN0YW5kYnkgbW9kZSBhbmQgaXRzIGNvbnRlbnQgaXMga2VwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVNSQU1SZXRlbnRpb24odm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19SUlMpOworfQorCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIFNSQU0gY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlLgorICAqIEBub3RlICBXaGVuIFJSUyBiaXQgaXMgcmVzZXQsIFNSQU0gaXMgcG93ZXJlZCBvZmYgaW4gU3RhbmRieSBtb2RlCisgICogICAgICAgIGFuZCBpdHMgY29udGVudCBpcyBsb3N0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVNSQU1SZXRlbnRpb24odm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7Cit9CisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxhc2ggUG93ZXIgRG93bi4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIGFsbG93cyB0byBlbmFibGUgZmxhc2ggcG93ZXIgZG93biBjYXBhYmlsaXRpZXMgaW4gbG93IHBvd2VyCisgICogICAgICAgICBydW4sIGxvdyBwb3dlciBzbGVlcCBhbmQgc3RvcCBtb2Rlcy4KKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSB0aGlzIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBU0hQRF9MUFJVTgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQVNIUERfTFBTTEVFUAorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQVNIUERfU1RPUAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlRmxhc2hQb3dlckRvd24odWludDMyX3QgUG93ZXJNb2RlKQoreworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0ZMQVNIX1BPV0VSRE9XTihQb3dlck1vZGUpKTsKKworICBQV1ItPkNSMSB8PSBQb3dlck1vZGU7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsYXNoIFBvd2VyIERvd24uCisgICogQG5vdGUgICBUaGlzIEFQSSBhbGxvd3MgdG8gZGlzYWJsZSBmbGFzaCBwb3dlciBkb3duIGNhcGFiaWxpdGllcyBpbiBsb3cgcG93ZXIKKyAgKiAgICAgICAgIHJ1biwgbG93IHBvd2VyIHNsZWVwIGFuZCBzdG9wIG1vZGVzLgorICAqIEBwYXJhbSAgUG93ZXJNb2RlIHRoaXMgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFTSFBEX0xQUlVOCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBU0hQRF9MUFNMRUVQCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBU0hQRF9TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlRmxhc2hQb3dlckRvd24odWludDMyX3QgUG93ZXJNb2RlKQoreworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0ZMQVNIX1BPV0VSRE9XTihQb3dlck1vZGUpKTsKKworICBQV1ItPkNSMSAmPSB+UG93ZXJNb2RlOworfQorCisKKy8qKgorICAqIEBicmllZiAgIFJldHVybiBWb2x0YWdlIFNjYWxpbmcgUmFuZ2UuCisgICogQHJldHZhbCAgVk9TIGJpdCBmaWVsZCA6IFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9SQU5HRTEgb3IgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1JBTkdFMgorICAqLwordWludDMyX3QgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSh2b2lkKQoreworICByZXR1cm4gKFBXUi0+Q1IxICYgUFdSX0NSMV9WT1MpOworfQorCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIG1haW4gcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlLgorICAqIEBwYXJhbSAgVm9sdGFnZVNjYWxpbmcgc3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UgdG8gYWNoaWV2ZQorICAqICAgICAgICAgYSB0cmFkZW9mZiBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEgUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHJhbmdlIDEgbW9kZSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDY0IE1Iei4KKyAgKiAgICAgICAgICBAYXJnIEByZWYgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMiBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMiBtb2RlLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjAgViwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTYgTUh6LgorICAqIEBub3RlICBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDEgdG8gUmFuZ2UgMiwgdGhlIHN5c3RlbSBmcmVxdWVuY3kgbXVzdCBiZSBkZWNyZWFzZWQgdG8KKyAgKiAgICAgICAgYSB2YWx1ZSBiZWxvdyAxNiBNSHogYmVmb3JlIGNhbGxpbmcgSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpIEFQSS4KKyAgKiAgICAgICAgV2hlbiBtb3ZpbmcgZnJvbSBSYW5nZSAyIHRvIFJhbmdlIDEsIHRoZSBzeXN0ZW0gZnJlcXVlbmN5IGNhbiBiZSBpbmNyZWFzZWQgdG8KKyAgKiAgICAgICAgYSB2YWx1ZSB1cCB0byA2NCBNSHogYWZ0ZXIgY2FsbGluZyBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKCkgQVBJLgorICAqIEBub3RlICBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDIgdG8gUmFuZ2UgMSwgdGhlIEFQSSB3YWl0cyBmb3IgVk9TRiBmbGFnIHRvIGJlCisgICogICAgICAgIGNsZWFyZWQgYmVmb3JlIHJldHVybmluZyB0aGUgc3RhdHVzLiBJZiB0aGUgZmxhZyBpcyBub3QgY2xlYXJlZCB3aXRoaW4KKyAgKiAgICAgICAgNiBtaWNyb3NlY29uZHMsIEhBTF9USU1FT1VUIHN0YXR1cyBpcyByZXBvcnRlZC4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpCit7CisgIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleDsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1ZPTFRBR0VfU0NBTElOR19SQU5HRShWb2x0YWdlU2NhbGluZykpOworCisgIC8qIE1vZGlmeSB2b2x0YWdlIHNjYWxpbmcgcmFuZ2UgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIFZvbHRhZ2VTY2FsaW5nKTsKKworICAvKiBJbiBjYXNlIG9mIFJhbmdlIDEgc2VsZWN0ZWQsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgbWFpbiByZWd1bGF0b3IgcmVhY2hlcyBuZXcgdmFsdWUgKi8KKyAgaWYoVm9sdGFnZVNjYWxpbmcgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSkKKyAgeworICAgIC8qIFNldCB0aW1lb3V0IHZhbHVlICovCisgICAgd2FpdF9sb29wX2luZGV4ID0gKChQV1JfVk9TRl9TRVRUSU5HX0RFTEFZXzZfVVMgKiBTeXN0ZW1Db3JlQ2xvY2sgKSAvIDEwMDAwMDBVKSArIDFVOworCisgICAgLyogV2FpdCB1bnRpbCBWT1NGIGlzIHJlc2V0ICovCisgICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpCisgICAgeworICAgICAgaWYod2FpdF9sb29wX2luZGV4ICE9IDBVKQorICAgICAgeworICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgRW50ZXIgTG93LXBvd2VyIFJ1biBtb2RlCisgICogQG5vdGUgIFN5c3RlbSBjbG9jayBmcmVxdWVuY3kgaGFzIHRvIGJlIGRlY3JlYXNlZCBiZWxvdyAyIE1IeiBiZWZvcmUgZW50ZXJpbmcKKyAgKiAgICAgICAgbG93IHBvd2VyIHJ1biBtb2RlCisgICogQG5vdGUgIEluIExvdy1wb3dlciBSdW4gbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgLyogU2V0IFJlZ3VsYXRvciBwYXJhbWV0ZXIgKi8KKyAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOworfQorCisKKy8qKgorICAqIEBicmllZiBFeGl0IExvdy1wb3dlciBSdW4gbW9kZS4KKyAgKiBAbm90ZSAgQmVmb3JlIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCkgY29tcGxldGlvbiwgdGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGF0CisgICogICAgICAgIFJFR0xQRiBoYXMgYmVlbiBwcm9wZXJseSByZXNldCAob3RoZXJ3aXNlLCBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZQorICAqICAgICAgICByZXR1cm5zIEhBTF9USU1FT1VUIHN0YXR1cykuIFRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGNhbiB0aGVuIGJlCisgICogICAgICAgIGluY3JlYXNlZCBhYm92ZSAyIE1Iei4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9ICgoUFdSX1JFR0xQRl9TRVRUSU5HX0RFTEFZXzZfVVMgKiBTeXN0ZW1Db3JlQ2xvY2sgKSAvIDEwMDAwMDBVKSArIDFVOworCisgIC8qIENsZWFyIExQUiBiaXQgKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7CisKKyAgLyogV2FpdCB1bnRpbCBSRUdMUEYgaXMgcmVzZXQgKi8KKyAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkKKyAgeworICAgIGlmKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkKKyAgICB7CisgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisKKyNpZiBkZWZpbmVkKFBXUl9TSERXX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVudGVyIFNodXRkb3duIG1vZGUuCisgICogQG5vdGUgICBJbiBTaHV0ZG93biBtb2RlLCB0aGUgUExMLCB0aGUgSFNJLCB0aGUgTFNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBzd2l0Y2hlZAorICAqICAgICAgICAgb2ZmLiBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQgYW5kIFZjb3JlIGRvbWFpbiBpcyBwb3dlcmVkIG9mZi4KKyAgKiAgICAgICAgIFNSQU0gYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yIHJlZ2lzdGVycyBpbiB0aGUgQmFja3VwIGRvbWFpbi4KKyAgKiAgICAgICAgIFRoZSBCT1IgaXMgbm90IGF2YWlsYWJsZS4KKyAgKiBAbm90ZSAgIFRoZSBJL09zIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciB3aXRoIGEgcHVsbC11cCBvciBwdWxsLWRvd24gb3IgY2FuCisgICogICAgICAgICBiZSBrZXB0IGluIGFuYWxvZyBzdGF0ZS4KKyAgKiAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbFVwKCkgYW5kIEhBTF9QV1JFeF9FbmFibGVHUElPUHVsbERvd24oKQorICAqICAgICAgICAgcmVzcGVjdGl2ZWx5IGVuYWJsZSBQdWxsIFVwIGFuZCBQdWxsRG93biBzdGF0ZS4KKyAgKiAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCgpICYgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbERvd24oKQorICAqICAgICAgICAgZGlzYWJsZSB0aGUgc2FtZS4gVGhlc2Ugc3RhdGVzIGFyZSBlZmZlY3RpdmUgaW4gU3RhbmRieSBtb2RlIG9ubHkgaWYKKyAgKiAgICAgICAgIEFQQyBiaXQgaXMgc2V0IHRocm91Z2ggSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKCkgQVBJLgorICAqIEByZXR2YWwgTm9uZQorCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbnRlclNIVVRET1dOTW9kZSh2b2lkKQoreworICAvKiBTZXQgU2h1dGRvd24gbW9kZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9MT1dQT1dFUk1PREVfU0hVVERPV04pOworCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisgIC8qIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgc3RvcmUgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkICovCisjaWYgZGVmaW5lZCAoIF9fQ0NfQVJNKQorICBfX2ZvcmNlX3N0b3JlcygpOworI2VuZGlmCisKKyAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgX19XRkkoKTsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3JjYy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1NmE4NAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX3JjYy5jCkBAIC0wLDAgKzEsMTMxOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfcmNjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBSZXNldCBhbmQgQ2xvY2sgQ29udHJvbCAoUkNDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBzcGVjaWZpYyBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBBZnRlciByZXNldCB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgZnJvbSBIaWdoIFNwZWVkIEludGVybmFsIG9zY2lsbGF0b3IKKyAgICAgIChmcm9tIDggTUh6IHRvIHJlYWNoIDE2TUh6KSB3aXRoIEZsYXNoIDAgd2FpdCBzdGF0ZS4gRmxhc2ggcHJlZmV0Y2ggYnVmZmVyLAorICAgICAgRC1DYWNoZSBhbmQgSS1DYWNoZSBhcmUgZGlzYWJsZWQsIGFuZCBhbGwgcGVyaXBoZXJhbHMgYXJlIG9mZiBleGNlcHQgaW50ZXJuYWwKKyAgICAgIFNSQU0sIEZsYXNoIGFuZCBKVEFHLgorCisgICAgICAoKykgVGhlcmUgaXMgbm8gcHJlc2NhbGVyIG9uIEhpZ2ggc3BlZWQgKEFIQikgYW5kIExvdyBzcGVlZCAoQVBCKSBidXNzZXM6CisgICAgICAgICAgYWxsIHBlcmlwaGVyYWxzIG1hcHBlZCBvbiB0aGVzZSBidXNzZXMgYXJlIHJ1bm5pbmcgYXQgSFNJIHNwZWVkLgorICAgICAgKCspIFRoZSBjbG9jayBmb3IgYWxsIHBlcmlwaGVyYWxzIGlzIHN3aXRjaGVkIG9mZiwgZXhjZXB0IHRoZSBTUkFNIGFuZCBGTEFTSC4KKyAgICAgICgrKSBBbGwgR1BJT3MgYXJlIGluIGFuYWxvZyBtb2RlLCBleGNlcHQgdGhlIEpUQUcgcGlucyB3aGljaAorICAgICAgICAgIGFyZSBhc3NpZ25lZCB0byBiZSB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlLgorCisgICAgWy4uXQorICAgICAgT25jZSB0aGUgZGV2aWNlIHN0YXJ0ZWQgZnJvbSByZXNldCwgdGhlIHVzZXIgYXBwbGljYXRpb24gaGFzIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIFN5c3RlbSBjbG9jaworICAgICAgICAgIChpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgaGlnaGVyIGZyZXF1ZW5jeS9wZXJmb3JtYW5jZSkKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIFN5c3RlbSBjbG9jayBmcmVxdWVuY3kgYW5kIEZsYXNoIHNldHRpbmdzCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBBSEIgYW5kIEFQQiBidXNzZXMgcHJlc2NhbGVycworICAgICAgKCspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBwZXJpcGhlcmFsKHMpIHRvIGJlIHVzZWQKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZShzKSBmb3IgcGVyaXBoZXJhbHMgd2hpY2ggY2xvY2tzIGFyZSBub3QKKyAgICAgICAgICBkZXJpdmVkIGZyb20gdGhlIFN5c3RlbSBjbG9jayAoUlRDLCBBREMsIFJORywgSFNUSU0pCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDIFJDQworICAqIEBicmllZiBSQ0MgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfQ29uc3RhbnRzIFJDQyBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBIU0VfVElNRU9VVF9WQUxVRSAgICAgICAgICBIU0VfU1RBUlRVUF9USU1FT1VUCisjZGVmaW5lIEhTSV9USU1FT1VUX1ZBTFVFICAgICAgICAgICgyVSkgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgKi8KKyNkZWZpbmUgTFNJX1RJTUVPVVRfVkFMVUUgICAgICAgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLworI2RlZmluZSBQTExfVElNRU9VVF9WQUxVRSAgICAgICAgICAoMlUpICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICovCisjZGVmaW5lIENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUgICg1MDAwVSkgLyogNSBzICAgICovCisKKyNkZWZpbmUgUExMU09VUkNFX05PTkUgICAgICAgICAgICAgKDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfTWFjcm9zIFJDQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIE1DTzFfQ0xLX0VOQUJMRSgpICAgICBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIE1DTzFfR1BJT19QT1JUICAgICAgICBHUElPQQorI2RlZmluZSBNQ08xX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fOAorCisjZGVmaW5lIFJDQ19QTExfT1NDU09VUkNFX0NPTkZJRyhfX0hBTF9SQ0NfUExMU09VUkNFX18pIFwKKyAgICAgICAgICAgIChNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDLCAodWludDMyX3QpKF9fSEFMX1JDQ19QTExTT1VSQ0VfXykpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX1ByaXZhdGVfVmFyaWFibGVzIFJDQyBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29uZmlndXJlIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgb3NjaWxsYXRvcnMKKyAgICAgIChIU0UsIEhTSSwgTFNFLCBMU0ksIFBMTCwgQ1NTIGFuZCBNQ08pIGFuZCB0aGUgU3lzdGVtIGJ1c3NlcyBjbG9ja3MgKFNZU0NMSywgQUhCLCBBUEIpCisKKyAgICBbLi5dIEludGVybmFsL2V4dGVybmFsIGNsb2NrIGFuZCBQTEwgY29uZmlndXJhdGlvbgorICAgICAgICAgKCspIEhTSSAoaGlnaC1zcGVlZCBpbnRlcm5hbCk6IDE2IE1IeiBmYWN0b3J5LXRyaW1tZWQgUkMgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoCisgICAgICAgICAgICAgdGhlIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlLgorCisgICAgICAgICAoKykgTFNJIChsb3ctc3BlZWQgaW50ZXJuYWwpOiAzMiBLSHogbG93IGNvbnN1bXB0aW9uIFJDIHVzZWQgYXMgSVdERyBhbmQvb3IgUlRDCisgICAgICAgICAgICAgY2xvY2sgc291cmNlLgorCisgICAgICAgICAoKykgSFNFIChoaWdoLXNwZWVkIGV4dGVybmFsKTogNCB0byA0OCBNSHogY3J5c3RhbCBvc2NpbGxhdG9yIHVzZWQgZGlyZWN0bHkgb3IKKyAgICAgICAgICAgICB0aHJvdWdoIHRoZSBQTEwgYXMgU3lzdGVtIGNsb2NrIHNvdXJjZS4gQ2FuIGJlIHVzZWQgYWxzbyBvcHRpb25hbGx5IGFzIFJUQyBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBMU0UgKGxvdy1zcGVlZCBleHRlcm5hbCk6IDMyLjc2OCBLSHogb3NjaWxsYXRvciB1c2VkIG9wdGlvbmFsbHkgYXMgUlRDIGNsb2NrIHNvdXJjZS4KKworICAgICAgICAgKCspIFBMTCAoY2xvY2tlZCBieSBIU0ksIEhTRSkgcHJvdmlkaW5nIHVwIHRvIHRocmVlIGluZGVwZW5kZW50IG91dHB1dCBjbG9ja3M6CisgICAgICAgICAgICgrKykgVGhlIGZpcnN0IG91dHB1dCAoUikgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGlnaCBzcGVlZCBzeXN0ZW0gY2xvY2sgKHVwIHRvIDY0TUh6KS4KKyAgICAgICAgICAgKCsrKSBUaGUgc2Vjb25kIG91dHB1dChRKSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIHJhbmRvbSBhbmFsb2cgZ2VuZXJhdG9yIGFuZCBIU3RpbS4KKyAgICAgICAgICAgKCsrKSBUaGUgVGhpcmQgb3V0cHV0IChQKSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciBhbmQgSTJTLgorCisgICAgICAgICAoKykgQ1NTIChDbG9jayBzZWN1cml0eSBzeXN0ZW0pOiBvbmNlIGVuYWJsZWQsIGlmIGEgSFNFIG9yIExTRSBjbG9jayBmYWlsdXJlIG9jY3VycworICAgICAgICAgICAgKEhTRSB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2ggUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UpLCB0aGUgU3lzdGVtIGNsb2NrCisgICAgICAgICAgICAgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCByZXNwZWN0aXZlbHkgdG8gSFNJIG9yIExTSSBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZAorICAgICAgICAgICAgIGlmIGVuYWJsZWQuIFRoZSBpbnRlcnJ1cHQgaXMgbGlua2VkIHRvIHRoZSBDb3J0ZXgtTTArIE5NSSAoTm9uLU1hc2thYmxlIEludGVycnVwdCkKKyAgICAgICAgICAgICBleGNlcHRpb24gdmVjdG9yLgorCisgICAgICAgICAoKykgTUNPIChtaWNyb2NvbnRyb2xsZXIgY2xvY2sgb3V0cHV0KTogdXNlZCB0byBvdXRwdXQgTFNJLCBIU0ksIExTRSwgSFNFIG9yCisgICAgICAgICAgICAgbWFpbiBQTEwgY2xvY2sgKHRocm91Z2ggYSBjb25maWd1cmFibGUgcHJlc2NhbGVyKSBvbiBQQTggcGluLgorCisgICAgWy4uXSBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorICAgICAgICAgKCspIFNldmVyYWwgY2xvY2sgc291cmNlcyBjYW4gYmUgdXNlZCB0byBkcml2ZSB0aGUgU3lzdGVtIGNsb2NrIChTWVNDTEspOiBIU0ksCisgICAgICAgICAgICAgSFNFLCBMU0ksIExTRSBhbmQgbWFpbiBQTEwuCisgICAgICAgICAgICAgVGhlIEFIQiBjbG9jayAoSENMSykgaXMgZGVyaXZlZCBmcm9tIFN5c3RlbSBjbG9jayB0aHJvdWdoIGNvbmZpZ3VyYWJsZQorICAgICAgICAgICAgIHByZXNjYWxlciBhbmQgdXNlZCB0byBjbG9jayB0aGUgQ1BVLCBtZW1vcnkgYW5kIHBlcmlwaGVyYWxzIG1hcHBlZAorICAgICAgICAgICAgIG9uIEFIQiBidXMgKERNQSwgR1BJTy4uLikuYW5kIEFQQiAoUENMSzEpIGNsb2NrIGlzIGRlcml2ZWQKKyAgICAgICAgICAgICBmcm9tIEFIQiBjbG9jayB0aHJvdWdoIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXJzIGFuZCB1c2VkIHRvIGNsb2NrCisgICAgICAgICAgICAgdGhlIHBlcmlwaGVyYWxzIG1hcHBlZCBvbiB0aGVzZSBidXNzZXMuIFlvdSBjYW4gdXNlCisgICAgICAgICAgICAgIkByZWYgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSIgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZXNlIGNsb2Nrcy4KKworICAgICAgICAgLUAtIEFsbCB0aGUgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGRlcml2ZWQgZnJvbSB0aGUgU3lzdGVtIGNsb2NrIChTWVNDTEspIGV4Y2VwdDoKKworICAgICAgICAgICAgKCtAKSBSVEM6IHRoZSBSVEMgY2xvY2sgY2FuIGJlIGRlcml2ZWQgZWl0aGVyIGZyb20gdGhlIExTSSwgTFNFIG9yIEhTRSBjbG9jaworICAgICAgICAgICAgICAgIGRpdmlkZWQgYnkgMiB0byAzMS4KKyAgICAgICAgICAgICAgICBZb3UgaGF2ZSB0byB1c2UgQHJlZiBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpIGFuZCBAcmVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICB0byBjb25maWd1cmUgdGhpcyBjbG9jay4KKworICAgICAgICAgICAgKCtAKSBSTkcoKikgcmVxdWlyZXMgYSBmcmVxdWVuY3kgZXF1YWwgb3IgbG93ZXIgdGhhbiA0OCBNSHouCisgICAgICAgICAgICAgICAgIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYWluIFBMTCBvciBIU0kgb3IgU3lzdGVtIGNsb2NrLgorICAgICAgICAgICAgICAgICAoKikgYXZhaWxhYmxlIG9uIGNlcnRhaW4gZGV2aWNlcyBvbmx5CisKKyAgICAgICAgICAgICgrQCkgSVdERyBjbG9jayB3aGljaCBpcyBhbHdheXMgdGhlIExTSSBjbG9jay4KKworCisgICAgICAgICAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBTWVNDTEssIEhDTEssIFBDTEsgaXMgNjQgTUh6LgorICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBzaG91bGQgYmUKKyAgICAgICAgICAgICBhZGFwdGVkIGFjY29yZGluZ2x5LgorCisgIEBlbmR2ZXJiYXRpbQorCisgICAgICgrKykgIFRhYmxlIDEuIEhDTEsgY2xvY2sgZnJlcXVlbmN5LgorICAgICAoKyspICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKCsrKSAgfCBMYXRlbmN5ICAgICAgICAgfCAgICBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoTUh6KSAgICAgICB8CisgICAgICgrKykgIHwgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAoKyspICB8ICAgICAgICAgICAgICAgICB8IHZvbHRhZ2UgcmFuZ2UgMSAgfCB2b2x0YWdlIHJhbmdlIDIgIHwKKyAgICAgKCsrKSAgfCAgICAgICAgICAgICAgICAgfCAgICAgIDEuMiBWICAgICAgIHwgICAgIDEuMCBWICAgICAgICB8CisgICAgICgrKykgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAoKyspICB8MFdTKDEgQ1BVIGN5Y2xlcyl8ICBIQ0xLIDw9IDI0ICAgICAgfCAgSENMSyA8PSA4ICAgICAgIHwKKyAgICAgKCsrKSAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICgrKykgIHwxV1MoMiBDUFUgY3ljbGVzKXwgIEhDTEsgPD0gNDggICAgICB8ICBIQ0xLIDw9IDE2ICAgICAgfAorICAgICAoKyspICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKCsrKSAgfDJXUygzIENQVSBjeWNsZXMpfCAgSENMSyA8PSA2NCAgICAgIHwgICAgICAgICAgIC0gICAgICB8CisgICAgICgrKykgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAorICAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBSQ0MgY2xvY2sgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCByZXNldCBzdGF0ZS4KKyAgKiBAbm90ZSAgIFRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlIG9mIHRoZSBjbG9jayBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGJlbG93OgorICAqICAgICAgICAgICAgLSBIU0kgT04gYW5kIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqICAgICAgICAgICAgLSBIU0UsIFBMTCBPRkYKKyAgKiAgICAgICAgICAgIC0gQUhCIGFuZCBBUEIgcHJlc2NhbGVyIHNldCB0byAxLgorICAqICAgICAgICAgICAgLSBDU1MsIE1DTzEgT0ZGCisgICogICAgICAgICAgICAtIEFsbCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgKiAgICAgICAgICAgIC0gUGVyaXBoZXJhbCBjbG9ja3MKKyAgKiAgICAgICAgICAgIC0gTFNJLCBMU0UgYW5kIFJUQyBjbG9ja3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfRGVJbml0KHZvaWQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogU2V0IEhTSU9OIGJpdCB0byB0aGUgcmVzZXQgdmFsdWUgKi8KKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04pOworCisgIC8qIFdhaXQgdGlsbCBIU0kgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBTZXQgSFNJVFJJTVs2OjBdIGJpdHMgdG8gdGhlIHJlc2V0IHZhbHVlICovCisgIFJDQy0+SUNTQ1IgPSBSQ0NfSUNTQ1JfSFNJVFJJTV82OworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBSZXNldCBDRkdSIHJlZ2lzdGVyIChIU0kgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSkgKi8KKyAgUkNDLT5DRkdSID0gMHgwMDAwMDAwMHU7CisKKyAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLworICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TV1MpICE9IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIENsZWFyIENSIHJlZ2lzdGVyIGluIDIgc3RlcHM6IGZpcnN0IHRvIGNsZWFyIEhTRU9OIGluIGNhc2UgYnlwYXNzIHdhcyBlbmFibGVkICovCisgIFJDQy0+Q1IgPSBSQ0NfQ1JfSFNJT047CisKKyAgLyogVGhlbiBhZ2FpbiB0byBIU0VCWVAgaW4gY2FzZSBieXBhc3Mgd2FzIGVuYWJsZWQgKi8KKyAgUkNDLT5DUiA9IFJDQ19DUl9IU0lPTjsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLworICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIG9uY2UgUExMIGlzIE9GRiwgcmVzZXQgUExMQ0ZHUiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisgIFJDQy0+UExMQ0ZHUiA9IFJDQ19QTExDRkdSX1BMTE5fNDsKKworICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgIFJDQy0+Q0lFUiA9IDB4MDAwMDAwMDB1OworCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBSQ0MtPkNJQ1IgPSAweEZGRkZGRkZGdTsKKworICAvKiBVcGRhdGUgdGhlIFN5c3RlbUNvcmVDbG9jayBnbG9iYWwgdmFyaWFibGUgKi8KKyAgU3lzdGVtQ29yZUNsb2NrID0gSFNJX1ZBTFVFOworCisgIC8qIEFkYXB0IFN5c3RpY2sgaW50ZXJydXB0IHBlcmlvZCAqLworICBpZiAoSEFMX0luaXRUaWNrKHV3VGlja1ByaW8pICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJDQyBPc2NpbGxhdG9ycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQorICAqICAgICAgICAgQHJlZiBSQ0NfT3NjSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUkNDIE9zY2lsbGF0b3JzLgorICAqIEBub3RlICAgVGhlIFBMTCBpcyBub3QgZGlzYWJsZWQgd2hlbiB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb24gSFNFIEJ5cGFzcyB0byBIU0UgT24gYW5kIEhTRSBPbiB0byBIU0UgQnlwYXNzIGFyZSBub3QKKyAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiBVc2VyIHNob3VsZCByZXF1ZXN0IGEgdHJhbnNpdGlvbiB0byBIU0UgT2ZmCisgICogICAgICAgICBmaXJzdCBhbmQgdGhlbiB0byBIU0UgT24gb3IgSFNFIEJ5cGFzcy4KKyAgKiBAbm90ZSAgIFRyYW5zaXRpb24gTFNFIEJ5cGFzcyB0byBMU0UgT24gYW5kIExTRSBPbiB0byBMU0UgQnlwYXNzIGFyZSBub3QKKyAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiBVc2VyIHNob3VsZCByZXF1ZXN0IGEgdHJhbnNpdGlvbiB0byBMU0UgT2ZmCisgICogICAgICAgICBmaXJzdCBhbmQgdGhlbiB0byBMU0UgT24gb3IgTFNFIEJ5cGFzcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfT3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAgKlJDQ19Pc2NJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHRlbXBfc3lzY2xrc3JjOworICB1aW50MzJfdCB0ZW1wX3BsbGNrY2ZnOworCisgIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLworICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX09TQ0lMTEFUT1JUWVBFKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0UoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlKSk7CisKKyAgICB0ZW1wX3N5c2Nsa3NyYyA9IF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpOworICAgIHRlbXBfcGxsY2tjZmcgPSBfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKTsKKworICAgIC8qIFdoZW4gdGhlIEhTRSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBjbG9jayBzb3VyY2UgZm9yIFBMTCBpbiB0aGVzZSBjYXNlcyBpdCBpcyBub3QgYWxsb3dlZCB0byBiZSBkaXNhYmxlZCAqLworICAgIGlmICgoKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19QTEwpICYmICh0ZW1wX3BsbGNrY2ZnID09IFJDQ19QTExTT1VSQ0VfSFNFKSkgfHwgKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19IU0UpKQorICAgIHsKKyAgICAgIGlmICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVJEWSkgIT0gMFUpICYmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPT0gUkNDX0hTRV9PRkYpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBuZXcgSFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIF9fSEFMX1JDQ19IU0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSk7CisKKyAgICAgIC8qIENoZWNrIHRoZSBIU0UgU3RhdGUgKi8KKyAgICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgIT0gUkNDX0hTRV9PRkYpCisgICAgICB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgSFNFIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgSFNFIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0koUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0lfQ0FMSUJSQVRJT05fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hTSURJVihSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJRGl2KSk7CisKKyAgICAvKiBDaGVjayBpZiBIU0kxNiBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBhcyBQTEwgc291cmNlIHdoZW4gUExMIGlzIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayAqLworICAgIHRlbXBfc3lzY2xrc3JjID0gX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCk7CisgICAgdGVtcF9wbGxja2NmZyA9IF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpOworICAgIGlmICgoKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19QTEwpICYmICh0ZW1wX3BsbGNrY2ZnID09IFJDQ19QTExTT1VSQ0VfSFNJKSkgfHwgKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19IU0kpKQorICAgIHsKKyAgICAgIC8qIFdoZW4gSFNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIGFzIFBMTCBpbnB1dCBjbG9jayBpdCBjYW4gbm90IGJlIGRpc2FibGVkICovCisgICAgICBpZiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpICE9IDBVKSAmJiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID09IFJDQ19IU0lfT0ZGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIE90aGVyd2lzZSwganVzdCB0aGUgY2FsaWJyYXRpb24gaXMgYWxsb3dlZCAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBBZGp1c3RzIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgY2FsaWJyYXRpb24gdmFsdWUuKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSk7CisKKyAgICAgICAgaWYgKHRlbXBfc3lzY2xrc3JjID09IFJDQ19DRkdSX1NXU19IU0kpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBBZGp1c3QgdGhlIEhTSTE2IGRpdmlzaW9uIGZhY3RvciAqLworICAgICAgICAgIF9fSEFMX1JDQ19IU0lfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lEaXYpOworCisgICAgICAgICAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlIHdpdGggSFNJU1lTIHZhbHVlICAqLworICAgICAgICAgIFN5c3RlbUNvcmVDbG9jayA9IChIU0lfVkFMVUUgLyAoMVVMIDw8ICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSURJVikpID4+IFJDQ19DUl9IU0lESVZfUG9zKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRhcHQgU3lzdGljayBpbnRlcnJ1cHQgcGVyaW9kICovCisgICAgICAgIGlmIChIQUxfSW5pdFRpY2sodXdUaWNrUHJpbykgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIEhTSSBTdGF0ZSAqLworICAgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSAhPSBSQ0NfSFNJX09GRikKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBIU0kxNiBkaXZpc2lvbiBmYWN0b3IgKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSURpdik7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSTE2KS4gKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9FTkFCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTSSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkanVzdHMgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKSBjYWxpYnJhdGlvbiB2YWx1ZS4qLworICAgICAgICBfX0hBTF9SQ0NfSFNJX0NBTElCUkFUSU9OVkFMVUVfQURKVVNUKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kxNikuICovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgSFNJIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0koUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlKSk7CisKKyAgICAvKiBDaGVjayBpZiBMU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyAgICBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX0NGR1JfU1dTX0xTSSkKKyAgICB7CisgICAgICAvKiBXaGVuIExTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBiZSBkaXNhYmxlZCAqLworICAgICAgaWYgKCgoKFJDQy0+Q1NSKSAmIFJDQ19DU1JfTFNJUkRZKSAhPSAwVSkgJiYgKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9PSBSQ0NfTFNJX09GRikpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgTFNJIFN0YXRlICovCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlICE9IFJDQ19MU0lfT0ZGKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kpLiAqLworICAgICAgICBfX0hBTF9SQ0NfTFNJX0VOQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuICovCisgICAgICAgIF9fSEFMX1JDQ19MU0lfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9MU0lSRFkpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNFIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKQorICB7CisgICAgRmxhZ1N0YXR1cyAgICAgICBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOworCisgICAgLyogV2hlbiB0aGUgTFNFIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrLCBpdCBpcyBub3QgYWxsb3dlZCBkaXNhYmxlIGl0ICovCisgICAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19MU0UpCisgICAgeworICAgICAgaWYgKCgoKFJDQy0+QkRDUikgJiBSQ0NfQkRDUl9MU0VSRFkpICE9IDBVKSAmJiAoUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID09IFJDQ19MU0VfT0ZGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBMU0UgY29uZmlndXJhdGlvbiBpbiBCYWNrdXAgRG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgICAgKi8KKyAgICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KKyAgICAgIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpICE9IDBVKQorICAgICAgeworICAgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsKKyAgICAgICAgcHdyY2xrY2hhbmdlZCA9IFNFVDsKKyAgICAgIH0KKworICAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiAqLworICAgICAgICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgQmFja3VwIGRvbWFpbiBXcml0ZSBwcm90ZWN0aW9uIGRpc2FibGUgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfREJQX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIG5ldyBMU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBfX0hBTF9SQ0NfTFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUpOworCisgICAgICAvKiBDaGVjayB0aGUgTFNFIFN0YXRlICovCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlICE9IFJDQ19MU0VfT0ZGKQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIGRpc2FibGVkICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRVJEWSkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0xTRV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogUmVzdG9yZSBjbG9jayBjb25maWd1cmF0aW9uIGlmIGNoYW5nZWQgKi8KKyAgICAgIGlmIChwd3JjbGtjaGFuZ2VkID09IFNFVCkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRSgpOworICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTEwoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkpOworCisgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlICE9IFJDQ19QTExfTk9ORSkKKyAgeworICAgIC8qIENoZWNrIGlmIHRoZSBQTEwgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3Igbm90ICovCisgICAgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IFJDQ19DRkdSX1NXU19QTEwpCisgICAgeworICAgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPT0gUkNDX1BMTF9PTikKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTT1VSQ0UoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExNX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTSkpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTE5fVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOKSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUF9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFApKTsKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUV9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEpKTsKKyNlbmRpZgorICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFJfVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExSKSk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMUkRZKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBmYWN0b3JzLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUCwKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRU5BQkxFKCk7CisKKyAgICAgICAgLyogRW5hYmxlIFBMTFIgQ2xvY2sgb3V0cHV0LiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMUkNMSyk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBQTEwgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgbWFpbiBQTEwuICovCisgICAgICAgIF9fSEFMX1JDQ19QTExfRElTQUJMRSgpOworCisgICAgICAgIC8qIERpc2FibGUgYWxsIFBMTCBvdXRwdXRzIHRvIHNhdmUgcG93ZXIgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQywgUExMU09VUkNFX05PTkUpOworCisjaWYgZGVmaW5lZChSQ0NfUExMUV9TVVBQT1JUKQorICAgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0RJU0FCTEUoUkNDX1BMTENGR1JfUExMUEVOIHwgUkNDX1BMTENGR1JfUExMUUVOIHwgUkNDX1BMTENGR1JfUExMUkVOKTsKKyNlbHNlCisgICAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRElTQUJMRShSQ0NfUExMQ0ZHUl9QTExQRU4gfCBSQ0NfUExMQ0ZHUl9QTExSRU4pOworI2VuZGlmCisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBQTEwgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgd2hpbGUgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExSRFkpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVxdWVzdCB0byBkaXNhYmxlIHRoZSBQTEwgdXNlZCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgICBpZigoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTdGF0ZSkgPT0gUkNDX1BMTF9PRkYpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAgCisgICAgICAgIC8qIERvIG5vdCByZXR1cm4gSEFMX0VSUk9SIGlmIHJlcXVlc3QgcmVwZWF0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uICovCisgICAgICAgIHRlbXBfcGxsY2tjZmcgPSBSQ0MtPlBMTENGR1I7CisgICAgICAgIGlmKChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExTUkMpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlKSB8fAorICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMTSkgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNKSB8fAorICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMTikgIT0gKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykpIHx8CisgICAgICAgICAgIChSRUFEX0JJVCh0ZW1wX3BsbGNrY2ZnLCBSQ0NfUExMQ0ZHUl9QTExQKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFApIHx8CisjaWYgZGVmaW5lZCAoUkNDX1BMTFFfU1VQUE9SVCkKKyAgICAgICAgICAgKFJFQURfQklUKHRlbXBfcGxsY2tjZmcsIFJDQ19QTExDRkdSX1BMTFEpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSkgfHwKKyNlbmRpZgorICAgICAgICAgICAoUkVBRF9CSVQodGVtcF9wbGxja2NmZywgUkNDX1BMTENGR1JfUExMUikgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExSKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUFUsIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFJDQ19DbGtJbml0U3RydWN0LgorICAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgIHBvaW50ZXIgdG8gYSBAcmVmIFJDQ19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSQ0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEZMYXRlbmN5ICBGTEFTSCBMYXRlbmN5CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8wICAgRkxBU0ggMCBMYXRlbmN5IGN5Y2xlCisgICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMSAgIEZMQVNIIDEgTGF0ZW5jeSBjeWNsZQorICAqCisgICogQG5vdGUgICBUaGUgU3lzdGVtQ29yZUNsb2NrIENNU0lTIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3RvcmUgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeQorICAqICAgICAgICAgYW5kIHVwZGF0ZWQgYnkgQHJlZiBIQUxfUkNDX0dldEhDTEtGcmVxKCkgZnVuY3Rpb24gY2FsbGVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uCisgICoKKyAgKiBAbm90ZSAgIFRoZSBIU0kgaXMgdXNlZCBieSBkZWZhdWx0IGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIKKyAgKiAgICAgICAgIHN0YXJ0dXAgZnJvbSBSZXNldCwgd2FrZS11cCBmcm9tIFNUQU5EQlkgbW9kZS4gQWZ0ZXIgcmVzdGFydCBmcm9tIFJlc2V0LAorICAqICAgICAgICAgdGhlIEhTSSBmcmVxdWVuY3kgaXMgc2V0IHRvIDggTWh6LCB0aGVuIGl0IHJlYWNoZXMgaXRzIGRlZmF1bHQgdmFsdWUgMTYgTUh6LgorICAqCisgICogQG5vdGUgICBUaGUgSFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyCisgICogICAgICAgICBmcm9tIFNUT1AgbW9kZXMgb3IgaW4gY2FzZSBvZiBmYWlsdXJlIG9mIHRoZSBIU0UgdXNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICogICAgICAgICBhcyBzeXN0ZW0gY2xvY2sgKGlmIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gQ1NTIGlzIGVuYWJsZWQpLgorICAqCisgICogQG5vdGUgICBUaGUgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyCisgICogICAgICAgICBpbiBjYXNlIG9mIGZhaWx1cmUgb2YgdGhlIExTRSB1c2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKKyAgKiAgICAgICAgIGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBMU0VDU1MgaXMgZW5hYmxlZCkuCisgICoKKyAgKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAoY2xvY2sgc3RhYmxlIGFmdGVyIHN0YXJ0dXAgZGVsYXkgb3IgUExMIGxvY2tlZCkuCisgICogICAgICAgICBJZiBhIGNsb2NrIHNvdXJjZSB3aGljaCBpcyBub3QgeWV0IHJlYWR5IGlzIHNlbGVjdGVkLCB0aGUgc3dpdGNoIHdpbGwKKyAgKiAgICAgICAgIG9jY3VyIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBpcyByZWFkeS4KKyAgKgorICAqIEBub3RlICAgWW91IGNhbiB1c2UgQHJlZiBIQUxfUkNDX0dldENsb2NrQ29uZmlnKCkgZnVuY3Rpb24gdG8ga25vdyB3aGljaCBjbG9jayBpcworICAqICAgICAgICAgY3VycmVudGx5IHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIHRoZSBkZXZpY2Ugdm9sdGFnZSByYW5nZSwgdGhlIHNvZnR3YXJlIGhhcyB0byBzZXQgY29ycmVjdGx5CisgICogICAgICAgICBIUFJFWzM6MF0gYml0cyB0byBlbnN1cmUgdGhhdCBIQ0xLIG5vdCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBmcmVxdWVuY3kKKyAgKiAgICAgICAgIChmb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvIHNlY3Rpb24gYWJvdmUgIkluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyIpCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0Nsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCBGTGF0ZW5jeSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLworICBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMT0NLVFlQRShSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9MQVRFTkNZKEZMYXRlbmN5KSk7CisKKyAgLyogVG8gY29ycmVjdGx5IHJlYWQgZGF0YSBmcm9tIEZMQVNIIG1lbW9yeSwgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyAoTEFURU5DWSkKKyAgICBtdXN0IGJlIGNvcnJlY3RseSBwcm9ncmFtbWVkIGFjY29yZGluZyB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBGTEFTSCBjbG9jaworICAgIChIQ0xLKSBhbmQgdGhlIHN1cHBseSB2b2x0YWdlIG9mIHRoZSBkZXZpY2UuICovCisKKyAgLyogSW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgaGlnaGVyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKEZMYXRlbmN5ID4gX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSkKKyAgeworICAgIC8qIFByb2dyYW0gdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgdG8gdGhlIExBVEVOQ1kgYml0cyBpbiB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfRkxBU0hfU0VUX0xBVEVOQ1koRkxhdGVuY3kpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgIG1lbW9yeSBieSBwb2xsaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgd2hpbGUgKChGTEFTSC0+QUNSICYgRkxBU0hfQUNSX0xBVEVOQ1kpICE9IEZMYXRlbmN5KQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIQ0xLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfSENMSykgPT0gUkNDX0NMT0NLVFlQRV9IQ0xLKQorICB7CisgICAgLyogU2V0IHRoZSBoaWdoZXN0IEFQQiBkaXZpZGVyIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBnbyB0aHJvdWdoCisgICAgICAgYSBub24tc3BlYyBwaGFzZSB3aGF0ZXZlciB3ZSBkZWNyZWFzZSBvciBpbmNyZWFzZSBIQ0xLLiAqLworICAgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMSkgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRSwgUkNDX0hDTEtfRElWMTYpOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbmV3IEhDTEsgY2xvY2sgZGl2aWRlciAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSENMSyhSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFLCBSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1lTQ0xLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykgPT0gUkNDX0NMT0NLVFlQRV9TWVNDTEspCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NZU0NMS1NPVVJDRShSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlKSk7CisKKyAgICAvKiBIU0UgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLworICAgIGlmIChSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNFKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0UgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpID09IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAvKiBQTEwgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLworICAgIGVsc2UgaWYgKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9QTExDTEspCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFBMTCByZWFkeSBmbGFnICovCisgICAgICBpZiAoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIEhTSSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZSBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTSSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgSFNJIHJlYWR5IGZsYWcgKi8KKyAgICAgIGlmIChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTFNJIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyAgICBlbHNlIGlmIChSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfTFNJKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBMU0kgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIExTRSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBMU0UgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXLCBSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlKTsKKworICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IChSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlIDw8IFJDQ19DRkdSX1NXU19Qb3MpKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgbG93ZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZiAoRkxhdGVuY3kgPCBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpKQorICB7CisgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCisgICAgbWVtb3J5IGJ5IHBvbGxpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICB3aGlsZSAoKEZMQVNILT5BQ1IgJiBGTEFTSF9BQ1JfTEFURU5DWSkgIT0gRkxhdGVuY3kpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IENMT0NLU1dJVENIX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBDTEsxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlcikpOworICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFLCBSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICB9CisKKyAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgIFN5c3RlbUNvcmVDbG9jayA9IChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpID4+ICgoQUhCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfSFBSRSkgPj4gUkNDX0NGR1JfSFBSRV9Qb3NdKSAmIDB4MUZVKSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlIGNvbnNpZGVyaW5nIG5ldyBzeXN0ZW0gY2xvY2tzIHNldHRpbmdzKi8KKyAgcmV0dXJuIEhBTF9Jbml0VGljayh1d1RpY2tQcmlvKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUkNDIGNsb2NrcyBjb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorCisgICAgKCspIE91cHV0IGNsb2NrIHRvIE1DTyBwaW4uCisgICAgKCspIFJldHJpZXZlIGN1cnJlbnQgY2xvY2sgZnJlcXVlbmNpZXMuCisgICAgKCspIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgY2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08gcGluKFBBOCkuCisgICogQG5vdGUgICBQQTggc2hvdWxkIGJlIGNvbmZpZ3VyZWQgaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUuCisgICogQHBhcmFtICBSQ0NfTUNPeCAgc3BlY2lmaWVzIHRoZSBvdXRwdXQgZGlyZWN0aW9uIGZvciB0aGUgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIEZvciBTVE0zMkcweHggZmFtaWx5IHRoaXMgcGFyYW1ldGVyIGNhbiBoYXZlIG9ubHkgb25lIHZhbHVlOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xICBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTzEgcGluKFBBOCkuCisgICogQHBhcmFtICBSQ0NfTUNPU291cmNlICBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICBNQ08gb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsgIHN5c3RlbSAgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSSAgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0UgIEhTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX1BMTENMSyAgbWFpbiBQTEwgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTSSAgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgICogQHBhcmFtICBSQ0NfTUNPRGl2ICBzcGVjaWZpZXMgdGhlIE1DTyBwcmVzY2FsZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzEgIG5vIGRpdmlzaW9uIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8yICBkaXZpc2lvbiBieSAyIGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICBkaXZpc2lvbiBieSA0IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl84ICBkaXZpc2lvbiBieSA4IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xNiAgZGl2aXNpb24gYnkgMTYgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzMyICBkaXZpc2lvbiBieSAzMiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfNjQgIGRpdmlzaW9uIGJ5IDY0IGFwcGxpZWQgdG8gTUNPIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl8xMjggIGRpdmlzaW9uIGJ5IDEyOCBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX01DT0NvbmZpZyh1aW50MzJfdCBSQ0NfTUNPeCwgdWludDMyX3QgUkNDX01DT1NvdXJjZSwgdWludDMyX3QgUkNDX01DT0RpdikKK3sKKyAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3Q7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08oUkNDX01DT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ09ESVYoUkNDX01DT0RpdikpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTzFTT1VSQ0UoUkNDX01DT1NvdXJjZSkpOworCisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgaWYgbm8gYXNzZXJ0X3BhcmFtIGNoZWNrICovCisgIFVOVVNFRChSQ0NfTUNPeCk7CisKKyAgLyogTUNPIENsb2NrIEVuYWJsZSAqLworICBNQ08xX0NMS19FTkFCTEUoKTsKKworICAvKiBDb25maWd1ZSB0aGUgTUNPMSBwaW4gaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyAgR1BJT19Jbml0U3RydWN0LlBpbiA9IE1DTzFfUElOOworICBHUElPX0luaXRTdHJ1Y3QuTW9kZSA9IEdQSU9fTU9ERV9BRl9QUDsKKyAgR1BJT19Jbml0U3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgR1BJT19Jbml0U3RydWN0LlB1bGwgPSBHUElPX05PUFVMTDsKKyAgR1BJT19Jbml0U3RydWN0LkFsdGVybmF0ZSA9IEdQSU9fQUYwX01DTzsKKyAgSEFMX0dQSU9fSW5pdChNQ08xX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdCk7CisKKyAgLyogTWFzayBNQ09TRUxbXSBhbmQgTUNPUFJFW10gYml0cyB0aGVuIHNldCBNQ08xIGNsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyICovCisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCAoUkNDX0NGR1JfTUNPU0VMIHwgUkNDX0NGR1JfTUNPUFJFKSwgKFJDQ19NQ09Tb3VyY2UgfCBSQ0NfTUNPRGl2KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTWVNDTEsgZnJlcXVlbmN5LgorICAqCisgICogQG5vdGUgICBUaGUgc3lzdGVtIGZyZXF1ZW5jeSBjb21wdXRlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aGUgcmVhbAorICAqICAgICAgICAgZnJlcXVlbmN5IGluIHRoZSBjaGlwLiBJdCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBwcmVkZWZpbmVkCisgICogICAgICAgICBjb25zdGFudCBhbmQgdGhlIHNlbGVjdGVkIGNsb2NrIHNvdXJjZToKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTSV9WQUxVRS9IU0lESVYoKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKiksCisgICogICAgICAgICAgIG9yIEhTSV9WQUxVRSgqKSBtdWx0aXBsaWVkL2RpdmlkZWQgYnkgdGhlIFBMTCBmYWN0b3JzLgorICAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIExTSSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gTFNJX1ZBTFVFKCoqKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBMU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIExTRV9WQUxVRSgqKioqKQorICAqIEBub3RlICAgICAoKikgSFNJX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiBzdG0zMmcweHhfaGFsX2NvbmYuaCBmaWxlIChkZWZhdWx0IHZhbHVlCisgICogICAgICAgICAgICAgICAxNiBNSHopIGJ1dCB0aGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMKKyAgKiAgICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLgorICAqIEBub3RlICAgICAoKiopIEhTRV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJnMHh4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgIDggTUh6KSwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQgSFNFX1ZBTFVFIGlzIHNhbWUgYXMgdGhlIHJlYWwKKyAgKiAgICAgICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIG1heQorICAqICAgICAgICAgICAgICAgIGhhdmUgd3JvbmcgcmVzdWx0LgorICAqIEBub3RlICAgICAoKioqKSBMU0VfVkFMVUUgaXMgYSBjb25zdGFudCBkZWZpbmVkIGluIHN0bTMyZzB4eF9oYWxfY29uZi5oIGZpbGUgKGRlZmF1bHQgdmFsdWUKKyAgKiAgICAgICAgICAgICAgIDMyNzY4IEh6KS4KKyAgKiBAbm90ZSAgICAgKCoqKiopIExTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJnMHh4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgMzIwMDAgSHopLgorICAqCisgICogQG5vdGUgICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgbm90IGNvcnJlY3Qgd2hlbiB1c2luZyBmcmFjdGlvbmFsCisgICogICAgICAgICB2YWx1ZSBmb3IgSFNFIGNyeXN0YWwuCisgICoKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY29tcHV0ZSB0aGUKKyAgKiAgICAgICAgIGJhdWRyYXRlIGZvciB0aGUgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyBvciBjb25maWd1cmUgb3RoZXIgcGFyYW1ldGVycy4KKyAgKgorICAqIEBub3RlICAgRWFjaCB0aW1lIFNZU0NMSyBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IFNZU0NMSyB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqCisgICoKKyAgKiBAcmV0dmFsIFNZU0NMSyBmcmVxdWVuY3kKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbHZjbywgcGxsc291cmNlLCBwbGxyLCBwbGxtLCBoc2lkaXY7CisgIHVpbnQzMl90IHN5c2Nsb2NrZnJlcTsKKworICBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX0NGR1JfU1dTX0hTSSkKKyAgeworICAgIC8qIEhTSVNZUyBjYW4gYmUgZGVyaXZlZCBmb3IgSFNJMTYgKi8KKyAgICBoc2lkaXYgPSAoMVVMIDw8ICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSURJVikpID4+IFJDQ19DUl9IU0lESVZfUG9zKSk7CisKKyAgICAvKiBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gKEhTSV9WQUxVRSAvIGhzaWRpdik7CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX0NGR1JfU1dTX0hTRSkKKyAgeworICAgIC8qIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgICBzeXNjbG9ja2ZyZXEgPSBIU0VfVkFMVUU7CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX0NGR1JfU1dTX1BMTCkKKyAgeworICAgIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisKKyAgICAvKiBQTExfVkNPID0gKChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFKS8gUExMTSkgKiBQTExOCisgICAgU1lTQ0xLID0gUExMX1ZDTyAvIFBMTFIKKyAgICAqLworICAgIHBsbHNvdXJjZSA9IChSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExTUkMpOworICAgIHBsbG0gPSAoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE0pID4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVIDsKKworICAgIHN3aXRjaCAocGxsc291cmNlKQorICAgIHsKKyAgICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICAgIHBsbHZjbyA9ICAoSFNFX1ZBTFVFIC8gcGxsbSkgKiAoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0k6ICAvKiBIU0kxNiB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAvKiBIU0kxNiB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgcGxsdmNvID0gKEhTSV9WQUxVRSAvIHBsbG0pICogKChSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExOKSA+PiBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcGxsciA9ICgoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFIpID4+IFJDQ19QTExDRkdSX1BMTFJfUG9zKSArIDFVKTsKKyAgICBzeXNjbG9ja2ZyZXEgPSBwbGx2Y28gLyBwbGxyOworICB9CisgIGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19MU0UpCisgIHsKKyAgICAvKiBMU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gTFNFX1ZBTFVFOworICB9CisgIGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19DRkdSX1NXU19MU0kpCisgIHsKKyAgICAvKiBMU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gTFNJX1ZBTFVFOworICB9CisgIGVsc2UKKyAgeworICAgIHN5c2Nsb2NrZnJlcSA9IDBVOworICB9CisKKyAgcmV0dXJuIHN5c2Nsb2NrZnJlcTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEhDTEsgZnJlcXVlbmN5LgorICAqIEBub3RlICAgRWFjaCB0aW1lIEhDTEsgY2hhbmdlcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlCisgICogICAgICAgICByaWdodCBIQ0xLIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICoKKyAgKiBAbm90ZSAgIFRoZSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5LgorICAqIEByZXR2YWwgSENMSyBmcmVxdWVuY3kgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0SENMS0ZyZXEodm9pZCkKK3sKKyAgcmV0dXJuIFN5c3RlbUNvcmVDbG9jazsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFBDTEsxIGZyZXF1ZW5jeS4KKyAgKiBAbm90ZSAgIEVhY2ggdGltZSBQQ0xLMSBjaGFuZ2VzLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKyAgKiAgICAgICAgIHJpZ2h0IFBDTEsxIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICogQHJldHZhbCBQQ0xLMSBmcmVxdWVuY3kgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0UENMSzFGcmVxKHZvaWQpCit7CisgIC8qIEdldCBIQ0xLIHNvdXJjZSBhbmQgQ29tcHV0ZSBQQ0xLMSBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICgodWludDMyX3QpKF9fTExfUkNDX0NBTENfUENMSzFfRlJFUShIQUxfUkNDX0dldEhDTEtGcmVxKCksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBSQ0NfT3NjSW5pdFN0cnVjdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsCisgICogICAgICAgICBSQ0MgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCAgcG9pbnRlciB0byBhbiBSQ0NfT3NjSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIHdpbGwgYmUgY29uZmlndXJlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19HZXRPc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICAqUkNDX09zY0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShSQ0NfT3NjSW5pdFN0cnVjdCAhPSAodm9pZCAqKU5VTEwpOworCisgIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgT3NjaWxsYXRvciB0eXBlIHBhcmFtZXRlciAtLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSB8IFJDQ19PU0NJTExBVE9SVFlQRV9MU0k7CisKKyAgLyogR2V0IHRoZSBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoUkNDLT5DUiAmIFJDQ19DUl9IU0VCWVApID09IFJDQ19DUl9IU0VCWVApCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX0JZUEFTUzsKKyAgfQorICBlbHNlIGlmICgoUkNDLT5DUiAmIFJDQ19DUl9IU0VPTikgPT0gUkNDX0NSX0hTRU9OKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09GRjsKKyAgfQorCisgIC8qIEdldCB0aGUgSFNJIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfSFNJT04pID09IFJDQ19DUl9IU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7CisgIH0KKworICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSA9ICgoUkNDLT5JQ1NDUiAmIFJDQ19JQ1NDUl9IU0lUUklNKSA+PiBSQ0NfSUNTQ1JfSFNJVFJJTV9Qb3MpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJRGl2ID0gKChSQ0MtPkNSICYgUkNDX0NSX0hTSURJVikgPj4gUkNDX0NSX0hTSURJVl9Qb3MpOworCisgIC8qIEdldCB0aGUgTFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+QkRDUiAmIFJDQ19CRENSX0xTRUJZUCkgPT0gUkNDX0JEQ1JfTFNFQllQKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9CWVBBU1M7CisgIH0KKyAgZWxzZSBpZiAoKFJDQy0+QkRDUiAmIFJDQ19CRENSX0xTRU9OKSA9PSBSQ0NfQkRDUl9MU0VPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9PRkY7CisgIH0KKworICAvKiBHZXQgdGhlIExTSSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChSQ0MtPkNTUiAmIFJDQ19DU1JfTFNJT04pID09IFJDQ19DU1JfTFNJT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUgPSBSQ0NfTFNJX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9IFJDQ19MU0lfT0ZGOworICB9CisKKworICAvKiBHZXQgdGhlIFBMTCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChSQ0MtPkNSICYgUkNDX0NSX1BMTE9OKSA9PSBSQ0NfQ1JfUExMT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlID0gUkNDX1BMTF9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlID0gUkNDX1BMTF9PRkY7CisgIH0KKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UgPSAoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMU1JDKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNID0gKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE0pOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4gPSAoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExQID0gKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFApOworI2lmIGRlZmluZWQoUkNDX1BMTFFfU1VQUE9SVCkKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExRID0gKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFEpOworI2VuZGlmCisgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUiA9IChSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFJDQ19DbGtJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwKKyAgKiAgICAgICAgIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJDQ19DbGtJbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIFJDQ19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb25maWd1cmVkLgorICAqIEBwYXJhbSAgcEZMYXRlbmN5ICAgICAgICAgUG9pbnRlciBvbiB0aGUgRmxhc2ggTGF0ZW5jeS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19HZXRDbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgICpSQ0NfQ2xrSW5pdFN0cnVjdCwgdWludDMyX3QgKnBGTGF0ZW5jeSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKFJDQ19DbGtJbml0U3RydWN0ICE9ICh2b2lkICopTlVMTCk7CisgIGFzc2VydF9wYXJhbShwRkxhdGVuY3kgIT0gKHZvaWQgKilOVUxMKTsKKworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIENsb2NrIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSA9IFJDQ19DTE9DS1RZUEVfU1lTQ0xLIHwgUkNDX0NMT0NLVFlQRV9IQ0xLIHwgUkNDX0NMT0NLVFlQRV9QQ0xLMTsKKworICAvKiBHZXQgdGhlIFNZU0NMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfU1cpOworCisgIC8qIEdldCB0aGUgSENMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlciA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfSFBSRSk7CisKKyAgLyogR2V0IHRoZSBBUEIxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlciA9ICh1aW50MzJfdCkoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRSk7CisKKworICAvKiBHZXQgdGhlIEZsYXNoIFdhaXQgU3RhdGUgKExhdGVuY3kpIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgKnBGTGF0ZW5jeSA9ICh1aW50MzJfdCkoRkxBU0gtPkFDUiAmIEZMQVNIX0FDUl9MQVRFTkNZKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAbm90ZSAgIElmIGEgZmFpbHVyZSBpcyBkZXRlY3RlZCBvbiB0aGUgSFNFIG9zY2lsbGF0b3IgY2xvY2ssIHRoaXMgb3NjaWxsYXRvcgorICAqICAgICAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB0byBpbmZvcm0gdGhlCisgICogICAgICAgICBzb2Z0d2FyZSBhYm91dCB0aGUgZmFpbHVyZSAoQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCwgQ1NTSSksCisgICogICAgICAgICBhbGxvd2luZyB0aGUgTUNVIHRvIHBlcmZvcm0gcmVzY3VlIG9wZXJhdGlvbnMuIFRoZSBDU1NJIGlzIGxpbmtlZCB0bworICAqICAgICAgICAgdGhlIENvcnRleC1NMCsgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLgorICAqIEBub3RlICAgVGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHJlc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX0VuYWJsZUNTUyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q1IsIFJDQ19DUl9DU1NPTikgOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAbm90ZSAgIElmIGEgZmFpbHVyZSBpcyBkZXRlY3RlZCBvbiB0aGUgTFNFIG9zY2lsbGF0b3IgY2xvY2ssIHRoaXMgb3NjaWxsYXRvcgorICAqICAgICAgICAgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB0byBpbmZvcm0gdGhlCisgICogICAgICAgICBzb2Z0d2FyZSBhYm91dCB0aGUgZmFpbHVyZSAoQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCwgQ1NTSSksCisgICogICAgICAgICBhbGxvd2luZyB0aGUgTUNVIHRvIHBlcmZvcm0gcmVzY3VlIG9wZXJhdGlvbnMuIFRoZSBDU1NJIGlzIGxpbmtlZCB0bworICAqICAgICAgICAgdGhlIENvcnRleC1NMCsgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLgorICAqIEBub3RlICAgVGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gRGV0ZWN0aW9uIGJpdCAoTFNFQ1NTRCBpbiBCRENSKSBjYW4gb25seSBiZQorICAqICAgICAgICAgY2xlYXJlZCBieSBhIGJhY2t1cCBkb21haW4gcmVzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfRW5hYmxlTFNFQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTikgOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgICogQG5vdGUgICBBZnRlciBMU0UgZmFpbHVyZSBkZXRlY3Rpb24sIHRoZSBzb2Z0d2FyZSBtdXN0IGRpc2FibGUgTFNFQ1NTT04KKyAgKiBAbm90ZSAgIFRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gY2FuIG9ubHkgYmUgY2xlYXJlZCBieSByZXNldCBvdGhlcndpc2UuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NfRGlzYWJsZUxTRUNTUyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VDU1NPTikgOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBub3RlICBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIHRoZSBOTUlfSGFuZGxlcigpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpCit7CisgIHVpbnQzMl90IGl0ZmxhZyA9IFJDQy0+Q0lGUjsKKworICAvKiBDbGVhciBpbnRlcnJ1cHQgZmxhZ3MgcmVsYXRlZCB0byBDU1MgKi8KKyAgUkNDLT5DSUNSID0gKGl0ZmxhZyAmIChSQ0NfQ0lGUl9DU1NGIHwgUkNDX0NJRlJfTFNFQ1NTRikpOworCisgIC8qIENoZWNrIFJDQyBDU1NGIGludGVycnVwdCBmbGFnICAqLworICBpZiAoKGl0ZmxhZyAmIFJDQ19DSUZSX0NTU0YpICE9IDB4MDB1KQorICB7CisgICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NfQ1NTQ2FsbGJhY2soKTsKKyAgfQorCisgIC8qIENoZWNrIFJDQyBMU0VDU1NGIGludGVycnVwdCBmbGFnICAqLworICBpZiAoKGl0ZmxhZyAmIFJDQ19DSUZSX0xTRUNTU0YpICE9IDB4MDB1KQorICB7CisgICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NfTFNFQ1NTQ2FsbGJhY2soKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgSFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUkNDX0NTU0NhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUkNDIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gaW50ZXJydXB0IGNhbGxiYWNrLgorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JDQ19MU0VDU1NDYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JDQ19MU0VDU1NDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9yY2NfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX3JjY19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDFlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9yY2NfZXguYwpAQCAtMCwwICsxLDk5MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfcmNjX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIFJDQyBleHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeCBSQ0NFeAorICAqIEBicmllZiBSQ0MgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9Db25zdGFudHMgUkNDRXggUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgUExMX1RJTUVPVVRfVkFMVUUgICAgICAgIDEwMFUgLyogMTAwIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAgKi8KKworI2RlZmluZSBMU0NPX0NMS19FTkFCTEUoKSAgICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBMU0NPX0dQSU9fUE9SVCAgICAgICAgR1BJT0EKKyNkZWZpbmUgTFNDT19QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzIKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQ0V4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFJDQyBDbG9ja3MKKyAgICBmcmVxdWVuY2llcy4KKyAgICBbLi5dCisgICAgKEApIEltcG9ydGFudCBub3RlOiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBAcmVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBpcyB1c2VkIHRvCisgICAgICAgIHNlbGVjdCB0aGUgUlRDIGNsb2NrIHNvdXJjZTsgaW4gdGhpcyBjYXNlIHRoZSBCYWNrdXAgZG9tYWluIHdpbGwgYmUgcmVzZXQgaW4KKyAgICAgICAgb3JkZXIgdG8gbW9kaWZ5IHRoZSBSVEMgQ2xvY2sgc291cmNlLCBhcyBjb25zZXF1ZW5jZSBSVEMgcmVnaXN0ZXJzIChpbmNsdWRpbmcKKyAgICAgICAgdGhlIGJhY2t1cCByZWdpc3RlcnMpIGFuZCBSQ0NfQkRDUiByZWdpc3RlciBhcmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWxzIGNsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQHJlZiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBQZXJpcGhDbGtJbml0ICBwb2ludGVyIHRvIGEgQHJlZiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIGEgZmllbGQgUGVyaXBoQ2xvY2tTZWxlY3Rpb24gd2hpY2ggY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgIFJUQyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMgICAgQURDIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgICBJMkMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyUzEgICBJMlMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSBVU0FSVDEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQ0VDICAgICBDRUMgcGVyaXBoZXJhbCBjbG9jayAgICAgKDEpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFRJTTEgIExQVElNMSBwZXJpcGhlcmFsIGNsb2NrICAoMSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0xQVElNMiAgTFBUSU0yIHBlcmlwaGVyYWwgY2xvY2sgICgxKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSBMUFVBUlQxIHBlcmlwaGVyYWwgY2xvY2sgKDEpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19STkcgICAgIFJORyBwZXJpcGhlcmFsIGNsb2NrICAgICAoMSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTEgICAgVElNMSBwZXJpcGhlcmFsIGNsb2NrICAgICgxKSgyKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVElNMTUgICBUSU0xNSBwZXJpcGhlcmFsIGNsb2NrICAgKDEpKDIpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0FSVDIgIFVTQVJUMiBwZXJpcGhlcmFsIGNsb2NrICAgICAoMikKKyAgKgorICAqIEBub3RlICAgKDEpIFBlcmlwaGVyYWxzIGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQG5vdGUgICAoMikgUGVyaXBoZXJhbHMgY2xvY2sgc2VsZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAbm90ZSAgIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIEByZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8gc2VsZWN0CisgICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZTogaW4gdGhpcyBjYXNlIHRoZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiBpcyBlbmFibGVkLgorICAqCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpCit7CisgIHVpbnQzMl90IHRtcHJlZ2lzdGVyOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICA9IEhBTF9PSzsgICAvKiBJbnRlcm1lZGlhdGUgc3RhdHVzICovCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsgICAvKiBGaW5hbCBzdGF0dXMgKi8KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BFUklQSENMT0NLKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSVEMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfUEVSSVBIQ0xLX1JUQykgPT0gUkNDX1BFUklQSENMS19SVEMpCisgIHsKKyAgICBGbGFnU3RhdHVzICAgICAgIHB3cmNsa2NoYW5nZWQgPSBSRVNFVDsKKworICAgIC8qIENoZWNrIGZvciBSVEMgUGFyYW1ldGVycyB1c2VkIHRvIG91dHB1dCBSVENDTEsgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1JUQ0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5SVENDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogRW5hYmxlIFBvd2VyIENsb2NrICovCisgICAgaWYgKF9fSEFMX1JDQ19QV1JfSVNfQ0xLX0RJU0FCTEVEKCkpCisgICAgeworICAgICAgX19IQUxfUkNDX1BXUl9DTEtfRU5BQkxFKCk7CisgICAgICBwd3JjbGtjaGFuZ2VkID0gU0VUOworICAgIH0KKworICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiAqLworICAgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsKKworICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIHdoaWxlICgoUFdSLT5DUjEgJiBQV1JfQ1IxX0RCUCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IHRoZSBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIG1vZGlmaWVkIGZyb20gZGVmYXVsdCAqLworICAgICAgdG1wcmVnaXN0ZXIgPSBSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCk7CisKKyAgICAgIC8qIFJlc2V0IHRoZSBCYWNrdXAgZG9tYWluIG9ubHkgaWYgdGhlIFJUQyBDbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIG1vZGlmaWVkICovCisgICAgICBpZiAoKHRtcHJlZ2lzdGVyICE9IFJDQ19SVENDTEtTT1VSQ0VfTk9ORSkgJiYgKHRtcHJlZ2lzdGVyICE9IFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKSkKKyAgICAgIHsKKyAgICAgICAgLyogU3RvcmUgdGhlIGNvbnRlbnQgb2YgQkRDUiByZWdpc3RlciBiZWZvcmUgdGhlIHJlc2V0IG9mIEJhY2t1cCBEb21haW4gKi8KKyAgICAgICAgdG1wcmVnaXN0ZXIgPSBSRUFEX0JJVChSQ0MtPkJEQ1IsIH4oUkNDX0JEQ1JfUlRDU0VMKSk7CisgICAgICAgIC8qIFJUQyBDbG9jayBzZWxlY3Rpb24gY2FuIGJlIGNoYW5nZWQgb25seSBpZiB0aGUgQmFja3VwIERvbWFpbiBpcyByZXNldCAqLworICAgICAgICBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKTsKKyAgICAgICAgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKTsKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgQ29udGVudCBvZiBCRENSIHJlZ2lzdGVyICovCisgICAgICAgIFJDQy0+QkRDUiA9IHRtcHJlZ2lzdGVyOworICAgICAgfQorCisgICAgICAvKiBXYWl0IGZvciBMU0UgcmVhY3RpdmF0aW9uIGlmIExTRSB3YXMgZW5hYmxlIHByaW9yIHRvIEJhY2t1cCBEb21haW4gcmVzZXQgKi8KKyAgICAgIGlmIChIQUxfSVNfQklUX1NFVCh0bXByZWdpc3RlciwgUkNDX0JEQ1JfTFNFT04pKQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocmV0ID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQXBwbHkgbmV3IFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisgICAgICAgIF9fSEFMX1JDQ19SVENfQ09ORklHKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogc2V0IG92ZXJhbGwgcmV0dXJuIHZhbHVlICovCisgICAgICAgIHN0YXR1cyA9IHJldDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIHNldCBvdmVyYWxsIHJldHVybiB2YWx1ZSAqLworICAgICAgc3RhdHVzID0gcmV0OworICAgIH0KKworICAgIC8qIFJlc3RvcmUgY2xvY2sgY29uZmlndXJhdGlvbiBpZiBjaGFuZ2VkICovCisgICAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDEpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQVJUMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBVU0FSVDEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX1VTQVJUMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VXNhcnQxQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDJTRUwpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQyIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQyQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMiBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQyX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDJDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQyU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVDEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBVQVJUMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgTFBVQVIxIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19MUFVBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHVhcnQxQ2xvY2tTZWxlY3Rpb24pOworICB9CisjZW5kaWYgLyogUkNDX0NDSVBSX0xQVUFSVDFTRUwgKi8KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0xQVElNMVNFTCkKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFRJTTEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSAoUkNDX1BFUklQSENMS19MUFRJTTEpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MUFRJTTFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+THB0aW0xQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICBfX0hBTF9SQ0NfTFBUSU0xX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHRpbTFDbG9ja1NlbGVjdGlvbik7CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBUSU0xU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFRJTTJTRUwpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBUSU0yIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMikgPT0gKFJDQ19QRVJJUEhDTEtfTFBUSU0yKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBUSU0yQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkxwdGltMkNsb2NrU2VsZWN0aW9uKSk7CisgICAgX19IQUxfUkNDX0xQVElNMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+THB0aW0yQ2xvY2tTZWxlY3Rpb24pOworICB9CisjZW5kaWYgLyogUkNDX0NDSVBSX0xQVElNMlNFTCAqLworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpID09IFJDQ19QRVJJUEhDTEtfSTJDMSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkMxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBJMkMxIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19JMkMxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9STkdTRUwpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUk5HIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1JORykgPT0gKFJDQ19QRVJJUEhDTEtfUk5HKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUk5HQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uKSk7CisgICAgX19IQUxfUkNDX1JOR19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+Um5nQ2xvY2tTZWxlY3Rpb24pOworCisgICAgaWYgKFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uID09IFJDQ19STkdDTEtTT1VSQ0VfUExMKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBQTExRQ0xLIG91dHB1dCAqLworICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTFFDTEspOworICAgIH0KKyAgfQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9STkdTRUwgKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfQURDKSA9PSBSQ0NfUEVSSVBIQ0xLX0FEQykKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19BRENDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+QWRjQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgQURDIGludGVyZmFjZSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfQURDX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5BZGNDbG9ja1NlbGVjdGlvbik7CisKKyAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+QWRjQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX0FEQ0NMS1NPVVJDRV9QTExBREMpCisgICAgeworICAgICAgLyogRW5hYmxlIFBMTFBDTEsgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMUENMSyk7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9DRUNTRUwpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0VDIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfQ0VDKSA9PSBSQ0NfUEVSSVBIQ0xLX0NFQykKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DRUNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+Q2VjQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgQ0VDIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19DRUNfQ09ORklHKFBlcmlwaENsa0luaXQtPkNlY0Nsb2NrU2VsZWN0aW9uKTsKKyAgfQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9DRUNTRUwgKi8KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTFTRUwpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1RJTTEpID09IFJDQ19QRVJJUEhDTEtfVElNMSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19USU0xQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlRpbTFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBUSU0xIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19USU0xX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5UaW0xQ2xvY2tTZWxlY3Rpb24pOworCisgICAgaWYgKFBlcmlwaENsa0luaXQtPlRpbTFDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfVElNMUNMS1NPVVJDRV9QTEwpCisgICAgeworICAgICAgLyogRW5hYmxlIFBMTFFDTEsgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMUUNMSyk7CisgICAgfQorICB9CisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTFTRUwgKi8KKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTE1U0VMKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTTE1IGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVElNMTUpID09IFJDQ19QRVJJUEhDTEtfVElNMTUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVElNMTVDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VGltMTVDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBUSU0xNSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVElNMTVfQ09ORklHKFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24pOworCisgICAgaWYgKFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24gPT0gUkNDX1RJTTE1Q0xLU09VUkNFX1BMTCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgUExMUUNMSyBvdXRwdXQgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExRQ0xLKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyUzEgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMlMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyUzEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJTMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMnMxQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJTMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJTMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJzMUNsb2NrU2VsZWN0aW9uKTsKKworICAgIGlmIChQZXJpcGhDbGtJbml0LT5JMnMxQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX0kyUzFDTEtTT1VSQ0VfUExMKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBQTExQQ0xLIG91dHB1dCAqLworICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTFBDTEspOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSQ0NfQ2xrSW5pdFN0cnVjdCBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQgcG9pbnRlciB0byBhbiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBFeHRlbmRlZCBQZXJpcGhlcmFscworICAqICAgICAgICAgY2xvY2tzOiBJMkMxLCBJMlMxLCBVU0FSVDEsIFJUQywgQURDLAorICAqICAgICAgICAgTFBUSU0xICgxKSwgTFBUSU0yICgxKSwgVElNMSAoMiksIFRJTTE1ICgxKSgyKSwgVVNBUlQyICgyKSwgTFBVQVJUMSAoMSksIENFQyAoMSkgYW5kIFJORyAoMSkKKyAgKiBAbm90ZSAoMSkgUGVyaXBoZXJhbCBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQG5vdGUgKDIpIFBlcmlwaGVyYWwgY2xvY2sgc2VsZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KQoreworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGV4dGVuZGVkIGNsb2NrIHR5cGUgcGFyYW1ldGVyLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfSTJDMSB8IFJDQ19QRVJJUEhDTEtfSTJTMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0FEQyAgICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyA7CisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFRJTTFTRUwpICYmIGRlZmluZWQoUkNDX0NDSVBSX0xQVElNMlNFTCkKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gIFJDQ19QRVJJUEhDTEtfTFBUSU0yICB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTFTRUwgJiYgUkNDX0NDSVBSX0xQVElNMlNFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1JOR1NFTCkKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gIFJDQ19QRVJJUEhDTEtfUk5HOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9STkdTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSAgUkNDX1BFUklQSENMS19MUFVBUlQxOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFVBUlQxU0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfQ0VDU0VMKQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSAgUkNDX1BFUklQSENMS19DRUM7CisjZW5kaWYgLyogUkNDX0NDSVBSX0NFQ1NFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1RJTTFTRUwpCisgIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uIHw9ICBSQ0NfUEVSSVBIQ0xLX1RJTTE7CisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTFTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xNVNFTCkKKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gfD0gIFJDQ19QRVJJUEhDTEtfVElNMTU7CisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTE1U0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorICBQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiB8PSAgUkNDX1BFUklQSENMS19VU0FSVDI7CisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMlNFTCAqLworCisgIC8qIEdldCB0aGUgVVNBUlQxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbiAgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKTsKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDJTRUwpCisgIC8qIEdldCB0aGUgVVNBUlQyIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5Vc2FydDJDbG9ja1NlbGVjdGlvbiAgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVVNBUlQyU0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfTFBVQVJUMVNFTCkKKyAgLyogR2V0IHRoZSBMUFVBUlQxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAqLworICAvKiBHZXQgdGhlIEkyQzEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uICAgID0gX19IQUxfUkNDX0dFVF9JMkMxX1NPVVJDRSgpOworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0xQVElNMVNFTCkKKyAgLyogR2V0IHRoZSBMUFRJTTEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkxwdGltMUNsb2NrU2VsZWN0aW9uICA9IF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9MUFRJTTFTRUwgKi8KKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFRJTTJTRUwpCisgIC8qIEdldCB0aGUgTFBUSU0yIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5McHRpbTJDbG9ja1NlbGVjdGlvbiAgPSBfX0hBTF9SQ0NfR0VUX0xQVElNMl9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBUSU0yU0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVElNMVNFTCkKKyAgLyogR2V0IHRoZSBUSU0xIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5UaW0xQ2xvY2tTZWxlY3Rpb24gID0gX19IQUxfUkNDX0dFVF9USU0xX1NPVVJDRSgpOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICovCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVElNMTVTRUwpCisgIC8qIEdldCB0aGUgVElNMTUgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlRpbTE1Q2xvY2tTZWxlY3Rpb24gID0gX19IQUxfUkNDX0dFVF9USU0xNV9TT1VSQ0UoKTsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfVElNMTVTRUwgKi8KKyAgLyogR2V0IHRoZSBSVEMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uICAgICA9IF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpOworI2lmIGRlZmluZWQoUkNDX0NDSVBSX1JOR1NFTCkKKyAgLyogR2V0IHRoZSBSTkcgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlJuZ0Nsb2NrU2VsZWN0aW9uICAgICA9IF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSgpOworI2VuZGlmICAvKiBSQ0NfQ0NJUFJfUk5HU0VMICovCisgIC8qIEdldCB0aGUgQURDIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkFkY0Nsb2NrU2VsZWN0aW9uICAgICA9IF9fSEFMX1JDQ19HRVRfQURDX1NPVVJDRSgpOworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0NFQ1NFTCkKKyAgLyogR2V0IHRoZSBDRUMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+Q2VjQ2xvY2tTZWxlY3Rpb24gICAgID0gX19IQUxfUkNDX0dFVF9DRUNfU09VUkNFKCk7CisjZW5kaWYgIC8qIFJDQ19DQ0lQUl9DRUNTRUwgKi8KKyAgLyogR2V0IHRoZSBJMlMxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkkyczFDbG9ja1NlbGVjdGlvbiAgICA9IF9fSEFMX1JDQ19HRVRfSTJTMV9TT1VSQ0UoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5IGZvciBwZXJpcGhlcmFscyB3aXRoIGNsb2NrIHNvdXJjZSBmcm9tIFBMTAorICAqIEBub3RlICAgUmV0dXJuIDAgaWYgcGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgQVBJCisgICogQHBhcmFtICBQZXJpcGhDbGsgIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllcgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgUlRDIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0FEQyAgICAgQURDIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgSTJDMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMlMxICAgIEkyUzEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfVVNBUlQxICBVU0FSVDEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfUk5HICAgICBSTkcgcGVyaXBoZXJhbCBjbG9jayAgICAoMSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1RJTTE1ICAgVElNMTUgcGVyaXBoZXJhbCBjbG9jayAgKDEpKDIpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19USU0xICAgIFRJTTEgcGVyaXBoZXJhbCBjbG9jayAgICgxKSgyKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBUSU0xICBMUFRJTTEgcGVyaXBoZXJhbCBjbG9jayAoMSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0xQVElNMiAgTFBUSU0yIHBlcmlwaGVyYWwgY2xvY2sgKDEpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFVBUlQxIExQVUFSVDEgcGVyaXBoZXJhbCBjbG9jaygxKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQ0VDICAgICBDRUMgcGVyaXBoZXJhbCBjbG9jayAgICAoMSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMiAgVVNBUlQyIHBlcmlwaGVyYWwgY2xvY2sgKDEpKDIpCisgICogQG5vdGUgICAoMSkgUGVyaXBoZXJhbCBub3QgYXZhaWxhYmxlIG9uIGFsbCBkZXZpY2VzCisgICogQG5vdGUgICAoMikgUGVyaXBoZXJhbCBDbG9jayBjb25maWd1cmF0aW9uIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMKKyAgKiBAcmV0dmFsIEZyZXF1ZW5jeSBpbiBIegorICAqLwordWludDMyX3QgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEodWludDMyX3QgUGVyaXBoQ2xrKQoreworICB1aW50MzJfdCBmcmVxdWVuY3kgPSAwVTsKKyAgdWludDMyX3Qgc3JjY2xrOworICB1aW50MzJfdCBwbGx2Y287CisgIHVpbnQzMl90IHBsbG47CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfUk5HU0VMKQorICB1aW50MzJfdCBybmdjbGs7CisgIHVpbnQzMl90IHJuZ2RpdjsKKyNlbmRpZgorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BFUklQSENMT0NLKFBlcmlwaENsaykpOworCisgIGlmIChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19SVEMpCisgIHsKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRDIHNvdXJjZSAqLworICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfUlRDX1NPVVJDRSgpOworCisgICAgLyogQ2hlY2sgaWYgTFNFIGlzIHJlYWR5IGFuZCBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIExTRSAqLworICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19SVENDTEtTT1VSQ0VfTFNFKSkKKyAgICB7CisgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgfQorICAgIC8qIENoZWNrIGlmIExTSSBpcyByZWFkeSBhbmQgaWYgUlRDIGNsb2NrIHNlbGVjdGlvbiBpcyBMU0kgKi8KKyAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSkpCisgICAgeworICAgICAgZnJlcXVlbmN5ID0gTFNJX1ZBTFVFOworICAgIH0KKyAgICAvKiBDaGVjayBpZiBIU0UgaXMgcmVhZHkgIGFuZCBpZiBSVEMgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSV9ESVYzMiovCisgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0VSRFkpKSAmJihzcmNjbGsgPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpKQorICAgIHsKKyAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDMyVTsKKyAgICB9CisgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFJUQyovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogT3RoZXIgZXh0ZXJuYWwgcGVyaXBoZXJhbCBjbG9jayBzb3VyY2UgdGhhbiBSVEMgKi8KKworICAgIC8qIENvbXB1dGUgUExMIGNsb2NrIGlucHV0ICovCisgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpID09IFJDQ19QTExTT1VSQ0VfSFNJKSAgLyogSFNJID8gKi8KKyAgICB7CisgICAgICBwbGx2Y28gPSBIU0lfVkFMVUU7CisgICAgfQorICAgIGVsc2UgaWYgKF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpID09IFJDQ19QTExTT1VSQ0VfSFNFKSAgLyogSFNFID8gKi8KKyAgICB7CisgICAgICBwbGx2Y28gPSBIU0VfVkFMVUU7CisgICAgfQorICAgIGVsc2UgLyogTm8gc291cmNlICovCisgICAgeworICAgICAgcGxsdmNvID0gMFU7CisgICAgfQorCisgICAgLyogZihQTEwgU291cmNlKSAvIFBMTE0gKi8KKyAgICBwbGx2Y28gPSAocGxsdmNvIC8gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0pID4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSk7CisKKyAgICBzd2l0Y2ggKFBlcmlwaENsaykKKyAgICB7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfUk5HU0VMKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1JORzoKKworICAgICAgICBzcmNjbGsgPSBSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfUk5HU0VMKTsKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfUk5HQ0xLU09VUkNFX0hTSV9ESVY4KSAgLyogSFNJX0RJVjggPyAqLworICAgICAgICB7CisgICAgICAgICAgcm5nY2xrID0gSFNJX1ZBTFVFIC8gOFU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19STkdDTEtTT1VSQ0VfUExMKSAvKiBQTEwgPyAqLworICAgICAgICB7CisgICAgICAgICAgLyogZihQTExRKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExRICovCisgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3M7CisgICAgICAgICAgcm5nY2xrID0gKHBsbHZjbyAqIHBsbG4pIC8gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFEpID4+IFJDQ19QTExDRkdSX1BMTFFfUG9zKSArIDFVKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1JOR0NMS1NPVVJDRV9TWVNDTEspIC8qIFNZU0NMSyA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBybmdjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogTm8gY2xvY2sgc291cmNlICovCisgICAgICAgIHsKKyAgICAgICAgICBybmdjbGsgPSAwVTsKKyAgICAgICAgfQorCisgICAgICAgIHJuZ2RpdiA9ICgxVUwgPDwgKChSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfUk5HRElWKSkgPj4gUkNDX0NDSVBSX1JOR0RJVl9Qb3MpKTsKKyAgICAgICAgZnJlcXVlbmN5ID0gKHJuZ2NsayAvIHJuZ2Rpdik7CisKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgIC8qIFJDQ19DQ0lQUl9STkdTRUwgKi8KKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19VU0FSVDE6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBVU0FSVDEgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMSkgICAgICAgICAgICAvKiBQQ0xLMSA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSykgICAgIC8qIFNZU0NMSyA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0hTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFVTQVJUMSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGFzIGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDBVICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMjoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IFVTQVJUMiBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1VTQVJUMkNMS1NPVVJDRV9TWVNDTEspCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0hTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfVVNBUlQyQ0xLU09VUkNFX0xTRSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIFVTQVJUMiAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGFzIGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDBVICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUkNDX0NDSVBSX1VTQVJUMlNFTCAqLworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0NFQ1NFTCkKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19DRUM6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBDRUMgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQ0VDX1NPVVJDRSgpOworCisgICAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DUiwgUkNDX0NSX0hTSVJEWSkpICYmIChzcmNjbGsgPT0gUkNDX0NFQ0NMS1NPVVJDRV9IU0lfRElWNDg4KSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IChIU0lfVkFMVUUgLyA0ODhVKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19DRUNDTEtTT1VSQ0VfTFNFKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgQ0VDICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfQ0VDU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9MUFVBUlQxU0VMKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDE6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBMUFVBUlQxIHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0xQVUFSVDFfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UpKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBMUFVBUlQxICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBVQVJUMVNFTCAqLworCisgICAgICBjYXNlIFJDQ19QRVJJUEhDTEtfQURDOgorCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfQURDX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0FEQ0NMS1NPVVJDRV9TWVNDTEspCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfQURDQ0xLU09VUkNFX0hTSSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX0FEQ0NMS1NPVVJDRV9QTExBREMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHKFJDQ19QTExQQ0xLKSAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBmKFBMTFApID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFAgKi8KKyAgICAgICAgICAgIHBsbG4gPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgICAgZnJlcXVlbmN5ID0gKHBsbHZjbyAqIHBsbG4pIC8gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApID4+IFJDQ19QTExDRkdSX1BMTFBfUG9zKSArIDFVKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIEFEQyAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGFzIGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDBVICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19JMkMxOgorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgSTJDMSBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9JMkMxX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfUENMSzEpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9TWVNDTEspCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kpKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMkMxICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0kyUzE6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBJMlMxIHNvdXJjZSAqLworICAgICAgICBzcmNjbGsgPSBfX0hBTF9SQ0NfR0VUX0kyUzFfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfSTJTMUNMS1NPVVJDRV9QTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19IQUxfUkNDX0dFVF9QTExDTEtPVVRfQ09ORklHKFJDQ19QTExQQ0xLKSAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBmKFBMTFApID0gZihWQ08gaW5wdXQpICogUExMTiAvIFBMTFAgKi8KKyAgICAgICAgICAgIHBsbG4gPSBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zOworICAgICAgICAgICAgZnJlcXVlbmN5ID0gKHBsbHZjbyAqIHBsbG4pIC8gKChSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApID4+IFJDQ19QTExDRkdSX1BMTFBfUG9zKSArIDFVKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMlMxQ0xLU09VUkNFX1NZU0NMSykKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19JMlMxQ0xLU09VUkNFX0hTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3JjY2xrID09IFJDQ19JMlMxQ0xLU09VUkNFX0VYVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEV4dGVybmFsIGNsb2NrIHVzZWQuKi8KKyAgICAgICAgICBmcmVxdWVuY3kgPSBFWFRFUk5BTF9JMlMxX0NMT0NLX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8qIENsb2NrIG5vdCBlbmFibGVkIGZvciBJMlMxICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoUkNDX0NDSVBSX0xQVElNMVNFTCkKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19MUFRJTTE6CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBMUFRJTTEgc291cmNlICovCisgICAgICAgIHNyY2NsayA9IF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSVJEWSkpICYmIChzcmNjbGsgPT0gUkNDX0xQVElNMUNMS1NPVVJDRV9MU0kpKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChIQUxfSVNfQklUX1NFVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogQ2xvY2sgbm90IGVuYWJsZWQgZm9yIExQVElNMSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGFzIGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDBVICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUkNDX0NDSVBSX0xQVElNMVNFTCAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfTFBUSU0yU0VMKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX0xQVElNMjoKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IExQVElNMiBzb3VyY2UgKi8KKyAgICAgICAgc3JjY2xrID0gX19IQUxfUkNDX0dFVF9MUFRJTTJfU09VUkNFKCk7CisKKyAgICAgICAgaWYgKHNyY2NsayA9PSBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJUkRZKSkgJiYgKHNyY2NsayA9PSBSQ0NfTFBUSU0yQ0xLU09VUkNFX0xTSSkpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKEhBTF9JU19CSVRfU0VUKFJDQy0+Q1IsIFJDQ19DUl9IU0lSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19MUFRJTTJDTEtTT1VSQ0VfSFNJKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoSEFMX0lTX0JJVF9TRVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpKSAmJiAoc3JjY2xrID09IFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBDbG9jayBub3QgZW5hYmxlZCBmb3IgTFBUSU0yICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gYXMgZnJlcXVlbmN5IGFscmVhZHkgaW5pdGlhbGl6ZWQgdG8gMFUgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBSQ0NfQ0NJUFJfTFBUSU0yU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKQorICAgICAgY2FzZSBSQ0NfUEVSSVBIQ0xLX1RJTTE6CisKKyAgICAgICAgc3JjY2xrID0gUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1RJTTFTRUwpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1RJTTFDTEtTT1VSQ0VfUExMKSAvKiBQTEwgPyAqLworICAgICAgICB7CisgICAgICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhSQ0NfUExMUUNMSykgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZihQTExRKSA9IGYoVkNPIGlucHV0KSAqIFBMTE4gLyBQTExRICovCisgICAgICAgICAgICBwbGxuID0gUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiBSQ0NfUExMQ0ZHUl9QTExOX1BvczsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9IChwbGx2Y28gKiBwbGxuKSAvICgoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExRKSA+PiBSQ0NfUExMQ0ZHUl9QTExRX1BvcykgKyAxVSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNyY2NsayA9PSBSQ0NfVElNMUNMS1NPVVJDRV9QQ0xLMSkgLyogUENMSzEgPyAqLworICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIE5vIGNsb2NrIHNvdXJjZSAqLworICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyBhcyBmcmVxdWVuY3kgYWxyZWFkeSBpbml0aWFsaXplZCB0byAwVSAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICovCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xNVNFTCkKKyAgICAgIGNhc2UgUkNDX1BFUklQSENMS19USU0xNToKKworICAgICAgICBzcmNjbGsgPSBSRUFEX0JJVChSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVElNMTVTRUwpOworCisgICAgICAgIGlmIChzcmNjbGsgPT0gUkNDX1RJTTE1Q0xLU09VUkNFX1BMTCkgLyogUExMID8gKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX1BMTENMS09VVF9DT05GSUcoUkNDX1BMTFFDTEspICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGYoUExMUSkgPSBmKFZDTyBpbnB1dCkgKiBQTExOIC8gUExMUSAqLworICAgICAgICAgICAgcGxsbiA9IFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3M7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAocGxsdmNvICogcGxsbikgLyAoKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmNjbGsgPT0gUkNDX1RJTTE1Q0xLU09VUkNFX1BDTEsxKSAvKiBQQ0xLMSA/ICovCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogTm8gY2xvY2sgc291cmNlICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGFzIGZyZXF1ZW5jeSBhbHJlYWR5IGluaXRpYWxpemVkIHRvIDBVICovCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogUkNDX0NDSVBSX1RJTTE1U0VMICovCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAoZnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIENsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBjbG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUKKyAgICBhY3RpdmF0aW9uIG9yIGRlYWN0aXZhdGlvbiBvZiBMU0UgQ1NTLCBMb3cgc3BlZWQgY2xvY2sgb3V0cHV0IGFuZAorICAgIGNsb2NrIGFmdGVyIHdha2UtdXAgZnJvbSBTVE9QIG1vZGUuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgTG93IFNwZWVkIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTFNDTyBwaW4gKFBBMikuCisgICogQHBhcmFtICBMU0NPU291cmNlICBzcGVjaWZpZXMgdGhlIExvdyBTcGVlZCBjbG9jayBzb3VyY2UgdG8gb3V0cHV0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTQ09TT1VSQ0VfTFNJICBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTFNDTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNDT1NPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBMU0NPIHNvdXJjZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfRW5hYmxlTFNDTyh1aW50MzJfdCBMU0NPU291cmNlKQoreworICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdDsKKyAgRmxhZ1N0YXR1cyAgICAgICBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisgIEZsYWdTdGF0dXMgICAgICAgYmFja3VwY2hhbmdlZCA9IFJFU0VUOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNDT1NPVVJDRShMU0NPU291cmNlKSk7CisKKyAgLyogTFNDTyBQaW4gQ2xvY2sgRW5hYmxlICovCisgIExTQ09fQ0xLX0VOQUJMRSgpOworCisgIC8qIENvbmZpZ3VlIHRoZSBMU0NPIHBpbiBpbiBhbmFsb2cgbW9kZSAqLworICBHUElPX0luaXRTdHJ1Y3QuUGluID0gTFNDT19QSU47CisgIEdQSU9fSW5pdFN0cnVjdC5Nb2RlID0gR1BJT19NT0RFX0FOQUxPRzsKKyAgR1BJT19Jbml0U3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgR1BJT19Jbml0U3RydWN0LlB1bGwgPSBHUElPX05PUFVMTDsKKyAgSEFMX0dQSU9fSW5pdChMU0NPX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdCk7CisKKyAgLyogVXBkYXRlIExTQ09TRUwgY2xvY2sgc291cmNlIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAqLworICBpZiAoX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQoKSkKKyAgeworICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgIHB3cmNsa2NoYW5nZWQgPSBTRVQ7CisgIH0KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpCisgIHsKKyAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3MoKTsKKyAgICBiYWNrdXBjaGFuZ2VkID0gU0VUOworICB9CisKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09TRUwgfCBSQ0NfQkRDUl9MU0NPRU4sIExTQ09Tb3VyY2UgfCBSQ0NfQkRDUl9MU0NPRU4pOworCisgIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkKKyAgeworICAgIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3MoKTsKKyAgfQorICBpZiAocHdyY2xrY2hhbmdlZCA9PSBTRVQpCisgIHsKKyAgICBfX0hBTF9SQ0NfUFdSX0NMS19ESVNBQkxFKCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBMb3cgU3BlZWQgY2xvY2sgb3V0cHV0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTQ08odm9pZCkKK3sKKyAgRmxhZ1N0YXR1cyAgICAgICBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CisgIEZsYWdTdGF0dXMgICAgICAgYmFja3VwY2hhbmdlZCA9IFJFU0VUOworCisgIC8qIFVwZGF0ZSBMU0NPRU4gYml0IGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAqLworICBpZiAoX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQoKSkKKyAgeworICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpOworICAgIHB3cmNsa2NoYW5nZWQgPSBTRVQ7CisgIH0KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpCisgIHsKKyAgICAvKiBFbmFibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluICovCisgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CisgICAgYmFja3VwY2hhbmdlZCA9IFNFVDsKKyAgfQorCisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09FTik7CisKKyAgLyogUmVzdG9yZSBwcmV2aW91cyBjb25maWd1cmF0aW9uICovCisgIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkKKyAgeworICAgIC8qIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluICovCisgICAgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcygpOworICB9CisgIGlmIChwd3JjbGtjaGFuZ2VkID09IFNFVCkKKyAgeworICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfcm5nLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk0MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfcm5nLmMKQEAgLTAsMCArMSw4MTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3JuZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSTkcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICBUaGUgUk5HIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIEVuYWJsZSB0aGUgUk5HIGNvbnRyb2xsZXIgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFKCkgbWFjcm8KKyAgICAgICAgICBpbiBIQUxfUk5HX01zcEluaXQoKS4KKyAgICAgICgjKSBBY3RpdmF0ZSB0aGUgUk5HIHBlcmlwaGVyYWwgdXNpbmcgSEFMX1JOR19Jbml0KCkgZnVuY3Rpb24uCisgICAgICAoIykgV2FpdCB1bnRpbCB0aGUgMzIgYml0IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIGNvbnRhaW5zIGEgdmFsaWQKKyAgICAgICAgICByYW5kb20gZGF0YSB1c2luZyAocG9sbGluZy9pbnRlcnJ1cHQpIG1vZGUuCisgICAgICAoIykgR2V0IHRoZSAzMiBiaXQgcmFuZG9tIG51bWJlciB1c2luZyBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKCkgZnVuY3Rpb24uCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfUk5HX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIFJlYWR5RGF0YUNhbGxiYWNrLCB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrczoKKyAgICByZXNwZWN0aXZlbHkgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKSAsIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKS4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfUk5HX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1JOR19TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZSBAcmVmIEhBTF9STkdfRXJyb3JDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9STkdfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1JOR19Jbml0KCkgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIG9yIEhBTF9STkdfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9STkdfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9STkdfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSTkcKKyAgKiBAYnJpZWYgUk5HIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUk5HX01PRFVMRV9FTkFCTEVECisKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA0MXh4KQorLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUk5HX1ByaXZhdGVfQ29uc3RhbnRzIFJORyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFJOR19USU1FT1VUX1ZBTFVFICAgICAyVQorLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIFJORyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgICAgICAgaW4gdGhlIFJOR19Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZQorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgUk5HIHBlcmlwaGVyYWwKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBSTkcgTVNQCisgICAgICAoKykgRGVJbml0aWFsaXplIFJORyBNU1AKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUk5HIHBlcmlwaGVyYWwgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19Jbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICAvKiBDaGVjayB0aGUgUk5HIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChocm5nID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19STkdfQUxMX0lOU1RBTkNFKGhybmctPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19STkdfQ0VEKGhybmctPkluaXQuQ2xvY2tFcnJvckRldGVjdGlvbikpOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJuZy0+U3RhdGUgPT0gSEFMX1JOR19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocm5nLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgID0gSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFJlYWR5RGF0YUNhbGxiYWNrICAqLworICAgIGhybmctPkVycm9yQ2FsbGJhY2sgICAgICA9IEhBTF9STkdfRXJyb3JDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgKi8KKworICAgIGlmIChocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHJuZy0+TXNwSW5pdENhbGxiYWNrKGhybmcpOworICB9CisjZWxzZQorICBpZiAoaHJuZy0+U3RhdGUgPT0gSEFMX1JOR19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBocm5nLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX1JOR19Nc3BJbml0KGhybmcpOworICB9CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9CVVNZOworCisgIC8qIENsb2NrIEVycm9yIERldGVjdGlvbiBDb25maWd1cmF0aW9uICovCisgIE1PRElGWV9SRUcoaHJuZy0+SW5zdGFuY2UtPkNSLCBSTkdfQ1JfQ0VELCBocm5nLT5Jbml0LkNsb2NrRXJyb3JEZXRlY3Rpb24pOworCisgIC8qIEVuYWJsZSB0aGUgUk5HIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfUk5HX0VOQUJMRShocm5nKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBSTkcgc3RhdGUgKi8KKyAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFQURZOworCisgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8KKyAgaHJuZy0+RXJyb3JDb2RlID0gSEFMX1JOR19FUlJPUl9OT05FOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBSTkcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfRGVJbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICAvKiBDaGVjayB0aGUgUk5HIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChocm5nID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2xlYXIgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uIGJpdCAqLworICBDTEVBUl9CSVQoaHJuZy0+SW5zdGFuY2UtPkNSLCBSTkdfQ1JfQ0VEKTsKKworICAvKiBEaXNhYmxlIHRoZSBSTkcgUGVyaXBoZXJhbCAqLworICBDTEVBUl9CSVQoaHJuZy0+SW5zdGFuY2UtPkNSLCBSTkdfQ1JfSUUgfCBSTkdfQ1JfUk5HRU4pOworCisgIC8qIENsZWFyIFJORyBpbnRlcnJ1cHQgc3RhdHVzIGZsYWdzICovCisgIENMRUFSX0JJVChocm5nLT5JbnN0YW5jZS0+U1IsIFJOR19TUl9DRUlTIHwgUk5HX1NSX1NFSVMpOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhybmctPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhybmctPk1zcERlSW5pdENhbGxiYWNrKGhybmcpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1JOR19Nc3BEZUluaXQoaHJuZyk7CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogVXBkYXRlIHRoZSBSTkcgc3RhdGUgKi8KKyAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFU0VUOworCisgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8KKyAgaHJuZy0+RXJyb3JDb2RlID0gSEFMX1JOR19FUlJPUl9OT05FOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisKKyAgLyogUmV0dXJuIHRoZSBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUk5HIE1TUC4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9STkdfTXNwSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfTXNwSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFJORyBNU1AuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUk5HX01zcERlSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfTXNwRGVJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBSTkcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocm5nIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfUmVnaXN0ZXJDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUk5HX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocm5nKTsKKworICBpZiAoSEFMX1JOR19TVEFURV9SRUFEWSA9PSBocm5nLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9STkdfRVJST1JfQ0JfSUQgOgorICAgICAgICBocm5nLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUk5HX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9STkdfU1RBVEVfUkVTRVQgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUk5HX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhybmcpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gUk5HIENhbGxiYWNrCisgICogICAgICAgICBSTkcgY2FsbGFiY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocm5nIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUk5HX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfVW5SZWdpc3RlckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCBIQUxfUk5HX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIGlmIChIQUxfUk5HX1NUQVRFX1JFQURZID09IGhybmctPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1JOR19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhybmctPkVycm9yQ2FsbGJhY2sgPSBIQUxfUk5HX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9STkdfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhybmctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcERlSW5pdDsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfUk5HX1NUQVRFX1JFU0VUID09IGhybmctPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1JOR19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHJuZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BJbml0OyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwRGVJbml0OyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBEYXRhIFJlYWR5IFJORyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocm5nIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBEYXRhIFJlYWR5IENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHBSTkdfUmVhZHlEYXRhQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIGlmIChIQUxfUk5HX1NUQVRFX1JFQURZID09IGhybmctPlN0YXRlKQorICB7CisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgRGF0YSBSZWFkeSBSTkcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIERhdGEgUmVhZHkgUk5HIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhybmcgUk5HIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIGlmIChIQUxfUk5HX1NUQVRFX1JFQURZID09IGhybmctPlN0YXRlKQorICB7CisgICAgaHJuZy0+UmVhZHlEYXRhQ2FsbGJhY2sgPSBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBSZWFkeURhdGFDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBHZXQgdGhlIDMyIGJpdCBSYW5kb20gbnVtYmVyCisgICAgICAoKykgR2V0IHRoZSAzMiBiaXQgUmFuZG9tIG51bWJlciB3aXRoIGludGVycnVwdCBlbmFibGVkCisgICAgICAoKykgSGFuZGxlIFJORyBpbnRlcnJ1cHQgcmVxdWVzdAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlcyBhIDMyLWJpdCByYW5kb20gbnVtYmVyLgorICAqIEBub3RlICAgRWFjaCB0aW1lIHRoZSByYW5kb20gbnVtYmVyIGRhdGEgaXMgcmVhZCB0aGUgUk5HX0ZMQUdfRFJEWSBmbGFnCisgICogICAgICAgICBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHBhcmFtICByYW5kb20zMmJpdCBwb2ludGVyIHRvIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHZhcmlhYmxlIGlmIHN1Y2Nlc3NmdWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfR2VuZXJhdGVSYW5kb21OdW1iZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHVpbnQzMl90ICpyYW5kb20zMmJpdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OyAgICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgLyogQ2hlY2sgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYgKGhybmctPlN0YXRlID09IEhBTF9STkdfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfQlVTWTsKKworICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIENoZWNrIGlmIGRhdGEgcmVnaXN0ZXIgY29udGFpbnMgdmFsaWQgcmFuZG9tIGRhdGEgKi8KKyAgICB3aGlsZSAoX19IQUxfUk5HX0dFVF9GTEFHKGhybmcsIFJOR19GTEFHX0RSRFkpID09IFJFU0VUKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSTkdfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFQURZOworICAgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9USU1FT1VUOworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgYSAzMmJpdCBSYW5kb20gbnVtYmVyICovCisgICAgaHJuZy0+UmFuZG9tTnVtYmVyID0gaHJuZy0+SW5zdGFuY2UtPkRSOworICAgICpyYW5kb20zMmJpdCA9IGhybmctPlJhbmRvbU51bWJlcjsKKworICAgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRUFEWTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlcyBhIDMyLWJpdCByYW5kb20gbnVtYmVyIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcl9JVChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgLyogQ2hlY2sgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaWYgKGhybmctPlN0YXRlID09IEhBTF9STkdfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfQlVTWTsKKworICAgIC8qIEVuYWJsZSB0aGUgUk5HIEludGVycnVwdHM6IERhdGEgUmVhZHksIENsb2NrIGVycm9yLCBTZWVkIGVycm9yICovCisgICAgX19IQUxfUk5HX0VOQUJMRV9JVChocm5nKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhybmcpOworCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGVzIFJORyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSAgIEluIHRoZSBjYXNlIG9mIGEgY2xvY2sgZXJyb3IsIHRoZSBSTkcgaXMgbm8gbW9yZSBhYmxlIHRvIGdlbmVyYXRlCisgICogICAgICAgICByYW5kb20gbnVtYmVycyBiZWNhdXNlIHRoZSBQTEw0OENMSyBjbG9jayBpcyBub3QgY29ycmVjdC4gVXNlciBoYXMKKyAgKiAgICAgICAgIHRvIGNoZWNrIHRoYXQgdGhlIGNsb2NrIGNvbnRyb2xsZXIgaXMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgdG8gcHJvdmlkZQorICAqICAgICAgICAgdGhlIFJORyBjbG9jayBhbmQgY2xlYXIgdGhlIENFSVMgYml0IHVzaW5nIF9fSEFMX1JOR19DTEVBUl9JVCgpLgorICAqICAgICAgICAgVGhlIGNsb2NrIGVycm9yIGhhcyBubyBpbXBhY3Qgb24gdGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkCisgICogICAgICAgICByYW5kb20gbnVtYmVycywgYW5kIHRoZSBSTkdfRFIgcmVnaXN0ZXIgY29udGVudHMgY2FuIGJlIHVzZWQuCisgICogQG5vdGUgICBJbiB0aGUgY2FzZSBvZiBhIHNlZWQgZXJyb3IsIHRoZSBnZW5lcmF0aW9uIG9mIHJhbmRvbSBudW1iZXJzIGlzCisgICogICAgICAgICBpbnRlcnJ1cHRlZCBhcyBsb25nIGFzIHRoZSBTRUNTIGJpdCBpcyAnMScuIElmIGEgbnVtYmVyIGlzCisgICogICAgICAgICBhdmFpbGFibGUgaW4gdGhlIFJOR19EUiByZWdpc3RlciwgaXQgbXVzdCBub3QgYmUgdXNlZCBiZWNhdXNlIGl0IG1heQorICAqICAgICAgICAgbm90IGhhdmUgZW5vdWdoIGVudHJvcHkuIEluIHRoaXMgY2FzZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gY2xlYXIgdGhlCisgICogICAgICAgICBTRUlTIGJpdCB1c2luZyBfX0hBTF9STkdfQ0xFQVJfSVQoKSwgdGhlbiBkaXNhYmxlIGFuZCBlbmFibGUKKyAgKiAgICAgICAgIHRoZSBSTkcgcGVyaXBoZXJhbCB0byByZWluaXRpYWxpemUgYW5kIHJlc3RhcnQgdGhlIFJORy4KKyAgKiBAbm90ZSAgIFVzZXItd3JpdHRlbiBIQUxfUk5HX0Vycm9yQ2FsbGJhY2soKSBBUEkgaXMgY2FsbGVkIG9uY2Ugd2hldGhlciBTRUlTCisgICogICAgICAgICBvciBDRUlTIGFyZSBzZXQuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBOb25lCisKKyAgKi8KK3ZvaWQgSEFMX1JOR19JUlFIYW5kbGVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICB1aW50MzJfdCBybmdjbG9ja2Vycm9yID0gMFU7CisgIAorICAvKiBSTkcgY2xvY2sgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkICovCisgIGlmIChfX0hBTF9STkdfR0VUX0lUKGhybmcsIFJOR19JVF9DRUkpICE9IFJFU0VUKQorICB7CisgICAgcm5nY2xvY2tlcnJvciA9IDFVOworICB9CisgIGVsc2UgaWYgKF9fSEFMX1JOR19HRVRfSVQoaHJuZywgUk5HX0lUX1NFSSkgIT0gUkVTRVQpCisgIHsKKyAgICBybmdjbG9ja2Vycm9yID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisgIAorICBpZiAocm5nY2xvY2tlcnJvciA9PSAxVSkgICAgCisgIHsgCisgICAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX0VSUk9SOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBjYWxsYmFjayAqLworICAgIGhybmctPkVycm9yQ2FsbGJhY2soaHJuZyk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgRXJyb3IgY2FsbGJhY2sgKi8KKyAgICBIQUxfUk5HX0Vycm9yQ2FsbGJhY2soaHJuZyk7CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAvKiBDbGVhciB0aGUgY2xvY2sgZXJyb3IgZmxhZyAqLworICAgIF9fSEFMX1JOR19DTEVBUl9JVChocm5nLCBSTkdfSVRfQ0VJIHwgUk5HX0lUX1NFSSk7CisgIH0KKworICAvKiBDaGVjayBSTkcgZGF0YSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1JOR19HRVRfSVQoaHJuZywgUk5HX0lUX0RSRFkpICE9IFJFU0VUKQorICB7CisgICAgLyogR2VuZXJhdGUgcmFuZG9tIG51bWJlciBvbmNlLCBzbyBkaXNhYmxlIHRoZSBJVCAqLworICAgIF9fSEFMX1JOR19ESVNBQkxFX0lUKGhybmcpOworCisgICAgLyogR2V0IHRoZSAzMmJpdCBSYW5kb20gbnVtYmVyIChEUkRZIGZsYWcgYXV0b21hdGljYWxseSBjbGVhcmVkKSAqLworICAgIGhybmctPlJhbmRvbU51bWJlciA9IGhybmctPkluc3RhbmNlLT5EUjsKKworICAgIGlmIChocm5nLT5TdGF0ZSAhPSBIQUxfUk5HX1NUQVRFX0VSUk9SKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBSTkcgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFQURZOworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhybmcpOworICAgICAgCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIERhdGEgUmVhZHkgY2FsbGJhY2sgKi8KKyAgICAgIGhybmctPlJlYWR5RGF0YUNhbGxiYWNrKGhybmcsIGhybmctPlJhbmRvbU51bWJlcik7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBEYXRhIFJlYWR5IGNhbGxiYWNrICovCisgICAgICBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKGhybmcsIGhybmctPlJhbmRvbU51bWJlcik7CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBsYXRlc3QgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCByYW5kb20gdmFsdWUKKyAgKi8KK3VpbnQzMl90IEhBTF9STkdfUmVhZExhc3RSYW5kb21OdW1iZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIHJldHVybiAoaHJuZy0+UmFuZG9tTnVtYmVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEYXRhIFJlYWR5IGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEBwYXJhbSAgcmFuZG9tMzJiaXQgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIFVOVVNFRChyYW5kb20zMmJpdCk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSTkcgZXJyb3IgY2FsbGJhY2tzLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JOR19FcnJvckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocm5nKTsKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX1JOR19FcnJvckNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIFJORyBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1JOR19TdGF0ZVR5cGVEZWYgSEFMX1JOR19HZXRTdGF0ZShSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgcmV0dXJuIGhybmctPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUk5HIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHJuZzogcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIFJORyBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX1JOR19HZXRFcnJvcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUmV0dXJuIFJORyBFcnJvciBDb2RlICovCisgIHJldHVybiBocm5nLT5FcnJvckNvZGU7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYKKworI2VuZGlmIC8qIEhBTF9STkdfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9ydGMuYyBiL1NyYy9zdG0zMmcweHhfaGFsX3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTI0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9ydGMuYwpAQCAtMCwwICsxLDE4MzcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3J0Yy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSVEMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmVhbC1UaW1lIENsb2NrIChSVEMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgQ2FsZW5kYXIgKFRpbWUgYW5kIERhdGUpIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBBbGFybXMgKEFsYXJtIEEgYW5kIEFsYXJtIEIpIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBXYWtlVXAgVGltZXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWVTdGFtcCBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGFtcGVycyBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgQmFja3VwIERhdGEgUmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBSVEMgVGFtcGVyIGFuZCBUaW1lU3RhbXAgUGlucyBTZWxlY3Rpb24KKyAgKiAgICAgICAgICAgKyBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50CisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgT3BlcmF0aW5nIENvbmRpdGlvbiAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgcmVhbC10aW1lIGNsb2NrIChSVEMpIGFuZCB0aGUgUlRDIGJhY2t1cCByZWdpc3RlcnMgY2FuIGJlIHBvd2VyZWQKKyAgICAgICBmcm9tIHRoZSBWQkFUIHZvbHRhZ2Ugd2hlbiB0aGUgbWFpbiBWREQgc3VwcGx5IGlzIHBvd2VyZWQgb2ZmLgorICAgICAgIFRvIHJldGFpbiB0aGUgY29udGVudCBvZiB0aGUgUlRDIGJhY2t1cCByZWdpc3RlcnMgYW5kIHN1cHBseSB0aGUgUlRDCisgICAgICAgd2hlbiBWREQgaXMgdHVybmVkIG9mZiwgVkJBVCBwaW4gY2FuIGJlIGNvbm5lY3RlZCB0byBhbiBvcHRpb25hbAorICAgICAgIHN0YW5kYnkgdm9sdGFnZSBzdXBwbGllZCBieSBhIGJhdHRlcnkgb3IgYnkgYW5vdGhlciBzb3VyY2UuCisKKyAgICAgICAgICAgICAgICAgICAjIyMjIyBCYWNrdXAgRG9tYWluIFJlc2V0ICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoZSBiYWNrdXAgZG9tYWluIHJlc2V0IHNldHMgYWxsIFJUQyByZWdpc3RlcnMgYW5kIHRoZSBSQ0NfQkRDUiByZWdpc3RlcgorICAgICAgIHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4KKyAgICAgICBBIGJhY2t1cCBkb21haW4gcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIG9jY3VyczoKKyAgICAoKykgU29mdHdhcmUgcmVzZXQsIHRyaWdnZXJlZCBieSBzZXR0aW5nIHRoZSBCRFJTVCBiaXQgaW4gdGhlIAorICAgICAgICBSQ0MgQmFja3VwIGRvbWFpbiBjb250cm9sIHJlZ2lzdGVyIChSQ0NfQkRDUikuCisgICAgKCspIFZERCBvciBWQkFUIHBvd2VyIG9uLCBpZiBib3RoIHN1cHBsaWVzIGhhdmUgcHJldmlvdXNseSBiZWVuIHBvd2VyZWQgb2ZmLgorICAgICgrKSBUYW1wZXIgZGV0ZWN0aW9uIGV2ZW50IHJlc2V0cyBhbGwgZGF0YSBiYWNrdXAgcmVnaXN0ZXJzLgorCisgICAgICAgICAgICAgICAgICAgIyMjIyMgQmFja3VwIERvbWFpbiBBY2Nlc3MgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBBZnRlciByZXNldCwgdGhlIGJhY2t1cCBkb21haW4gKFJUQyByZWdpc3RlcnMgYW5kIFJUQyBiYWNrdXAgZGF0YSByZWdpc3RlcnMpCisgICAgICAgaXMgcHJvdGVjdGVkIGFnYWluc3QgcG9zc2libGUgdW53YW50ZWQgd3JpdGUgYWNjZXNzZXMuCisgIFsuLl0gVG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgUlRDIERvbWFpbiBhbmQgUlRDIHJlZ2lzdGVycywgcHJvY2VlZCBhcyBmb2xsb3dzOgorICAgICgrKSBFbmFibGUgdGhlIFBvd2VyIENvbnRyb2xsZXIgKFBXUikgQVBCMSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgdGhlCisgICAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRSgpIGZ1bmN0aW9uLgorICAgICgrKSBFbmFibGUgYWNjZXNzIHRvIFJUQyBkb21haW4gdXNpbmcgdGhlIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uLgorICAgICgrKSBTZWxlY3QgdGhlIFJUQyBjbG9jayBzb3VyY2UgdXNpbmcgdGhlIF9fSEFMX1JDQ19SVENfQ09ORklHKCkgZnVuY3Rpb24uCisgICAgKCspIEVuYWJsZSBSVEMgQ2xvY2sgdXNpbmcgdGhlIF9fSEFMX1JDQ19SVENfRU5BQkxFKCkgZnVuY3Rpb24uCisKKyAgWy4uXSBUbyBlbmFibGUgYWNjZXNzIHRvIHRoZSBSVEMgRG9tYWluIGFuZCBSVEMgcmVnaXN0ZXJzLCBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcgd2l0aCBSQ0NfUEVSSVBIQ0xLX1JUQyBmb3IKKyAgICAgICAgUGVyaXBoQ2xvY2tTZWxlY3Rpb24gYW5kIHNlbGVjdCBSVENDbG9ja1NlbGVjdGlvbiAoTFNFLCBMU0kgb3IgSFNFZGl2MzIpCisgICAgKCspIEVuYWJsZSBSVEMgQ2xvY2sgdXNpbmcgdGhlIF9fSEFMX1JDQ19SVENfRU5BQkxFKCkgbWFjcm8uCisKKyAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgUlRDIERyaXZlciAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFbmFibGUgdGhlIFJUQyBkb21haW4gYWNjZXNzIChzZWUgZGVzY3JpcHRpb24gaW4gdGhlIHNlY3Rpb24gYWJvdmUpLgorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBQcmVzY2FsZXIgKEFzeW5jaHJvbm91cyBhbmQgU3luY2hyb25vdXMpIGFuZCBSVEMgaG91cgorICAgICAgICBmb3JtYXQgdXNpbmcgdGhlIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorCisgICoqKiBUaW1lIGFuZCBEYXRlIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgQ2FsZW5kYXIgKFRpbWUgYW5kIERhdGUpIHVzZSB0aGUgSEFMX1JUQ19TZXRUaW1lKCkKKyAgICAgICAgYW5kIEhBTF9SVENfU2V0RGF0ZSgpIGZ1bmN0aW9ucy4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIENhbGVuZGFyLCB1c2UgdGhlIEhBTF9SVENfR2V0VGltZSgpIGFuZCBIQUxfUlRDX0dldERhdGUoKSBmdW5jdGlvbnMuCisKKyAgKioqIEFsYXJtIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRvIGNvbmZpZ3VyZSB0aGUgUlRDIEFsYXJtIHVzZSB0aGUgSEFMX1JUQ19TZXRBbGFybSgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSB0aGUgUlRDIEFsYXJtIHdpdGggaW50ZXJydXB0IG1vZGUgdXNpbmcgdGhlCisgICAgICAgICAgICBIQUxfUlRDX1NldEFsYXJtX0lUKCkgZnVuY3Rpb24uCisgICAgKCspIFRvIHJlYWQgdGhlIFJUQyBBbGFybSwgdXNlIHRoZSBIQUxfUlRDX0dldEFsYXJtKCkgZnVuY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBhbmQgbG93IHBvd2VyIG1vZGVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoZSBNQ1UgY2FuIGJlIHdva2VuIHVwIGZyb20gYSBsb3cgcG93ZXIgbW9kZSBieSBhbiBSVEMgYWx0ZXJuYXRlCisgICAgICAgZnVuY3Rpb24uCisgIFsuLl0gVGhlIFJUQyBhbHRlcm5hdGUgZnVuY3Rpb25zIGFyZSB0aGUgUlRDIGFsYXJtcyAoQWxhcm0gQSBhbmQgQWxhcm0gQiksCisgICAgICAgUlRDIHdha2V1cCwgUlRDIHRhbXBlciBldmVudCBkZXRlY3Rpb24gYW5kIFJUQyB0aW1lIHN0YW1wIGV2ZW50IGRldGVjdGlvbi4KKyAgICAgICBUaGVzZSBSVEMgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBjYW4gd2FrZSB1cCB0aGUgc3lzdGVtIGZyb20gdGhlIFN0b3AgYW5kCisgICAgICAgU3RhbmRieSBsb3cgcG93ZXIgbW9kZXMuCisgIFsuLl0gVGhlIHN5c3RlbSBjYW4gYWxzbyB3YWtlIHVwIGZyb20gbG93IHBvd2VyIG1vZGVzIHdpdGhvdXQgZGVwZW5kaW5nCisgICAgICAgb24gYW4gZXh0ZXJuYWwgaW50ZXJydXB0IChBdXRvLXdha2V1cCBtb2RlKSwgYnkgdXNpbmcgdGhlIFJUQyBhbGFybQorICAgICAgIG9yIHRoZSBSVEMgd2FrZXVwIGV2ZW50cy4KKyAgWy4uXSBUaGUgUlRDIHByb3ZpZGVzIGEgcHJvZ3JhbW1hYmxlIHRpbWUgYmFzZSBmb3Igd2FraW5nIHVwIGZyb20gdGhlCisgICAgICAgU3RvcCBvciBTdGFuZGJ5IG1vZGUgYXQgcmVndWxhciBpbnRlcnZhbHMuCisgICAgICAgV2FrZXVwIGZyb20gU1RPUCBhbmQgU1RBTkRCWSBtb2RlcyBpcyBwb3NzaWJsZSBvbmx5IHdoZW4gdGhlIFJUQyBjbG9jayBzb3VyY2UKKyAgICAgICBpcyBMU0Ugb3IgTFNJLgorCisgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgWy4uXQorICBGdW5jdGlvbiBAcmVmIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBBbGFybUFFdmVudENhbGxiYWNrICAgICAgICAgIDogIFJUQyBBbGFybSBBIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBBbGFybUJFdmVudENhbGxiYWNrICAgICAgICAgIDogIFJUQyBBbGFybSBCIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgICAgIDogIFJUQyBUaW1lU3RhbXAgRXZlbnQgY2FsbGJhY2suCisgICAgKCspIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjayAgICAgOiAgUlRDIFdha2VVcFRpbWVyIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIxRXZlbnRDYWxsYmFjayAgICAgICAgIDogIFJUQyBUYW1wZXIxRXZlbnQgY2FsbGJhY2suCisgICAgKCspIFRhbXBlcjJFdmVudENhbGxiYWNrICAgICAgICAgOiAgUlRDIFRhbXBlcjJFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXIxRXZlbnRDYWxsYmFjayA6ICBSVEMgSW50ZXJuYWwgVGFtcGVyIDEgRXZlbnQgY2FsbGJhY2suCisgICAgKCspIEludGVybmFsVGFtcGVyM0V2ZW50Q2FsbGJhY2sgOiAgUlRDIEludGVybmFsIFRhbXBlciAzIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBJbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrIDogIFJUQyBJbnRlcm5hbCBUYW1wZXIgNCBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayA6ICBSVEMgSW50ZXJuYWwgVGFtcGVyIDUgRXZlbnQgY2FsbGJhY2suCisgICAgKCspIEludGVybmFsVGFtcGVyNkV2ZW50Q2FsbGJhY2sgOiAgUlRDIEludGVybmFsIFRhbXBlciA2IEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBJbnRlcm5hbFRhbXBlcjdFdmVudENhbGxiYWNrIDogIFJUQyBJbnRlcm5hbCBUYW1wZXIgNyBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6ICBSVEMgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA6ICBSVEMgTXNwRGVJbml0LgorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgIHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgICAgICAgOiBSVEMgQWxhcm0gQSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgQWxhcm1CRXZlbnRDYWxsYmFjayAgICAgICAgICA6IFJUQyBBbGFybSBCIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgICAgIDogUlRDIFRpbWVTdGFtcCBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgV2FrZVVwVGltZXJFdmVudENhbGxiYWNrICAgICA6IFJUQyBXYWtlVXBUaW1lciBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMiBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXIxRXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgMSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXIzRXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgMyBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXI0RXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgNCBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgNSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgNiBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgSW50ZXJuYWxUYW1wZXI3RXZlbnRDYWxsYmFjayA6IFJUQyBJbnRlcm5hbCBUYW1wZXIgNyBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IFJUQyBNc3BJbml0IGNhbGxiYWNrLgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogUlRDIE1zcERlSW5pdCBjYWxsYmFjay4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9SVENfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfUlRDX1NUQVRFX1JFU0VULAorICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMgOgorICBleGFtcGxlcyBAcmVmIEFsYXJtQUV2ZW50Q2FsbGJhY2soKSwgQHJlZiBXYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soKS4KKyAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBhcmUgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9uCisgIGluIHRoZSBAcmVmIEhBTF9SVENfSW5pdCgpL0ByZWYgSEFMX1JUQ19EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCisgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIEByZWYgSEFMX1JUQ19Jbml0KCkvQHJlZiBIQUxfUlRDX0RlSW5pdCgpCisgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICBbLi5dCisgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1JUQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICBpbiBIQUxfUlRDX1NUQVRFX1JFQURZIG9yIEhBTF9SVENfU1RBVEVfUkVTRVQgc3RhdGUsCisgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgdXNpbmcgQHJlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9SVENfRGVJbml0KCkKKyAgb3IgQHJlZiBIQUxfUlRDX0luaXQoKSBmdW5jdGlvbi4KKworICBbLi5dCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgIEBlbmR2ZXJiYXRpbQorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQworICAqIEBicmllZiBSVEMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlCisgICAgICAgICBSVEMgUHJlc2NhbGVyIChTeW5jaHJvbm91cyBhbmQgQXN5bmNocm9ub3VzKSwgUlRDIEhvdXIgZm9ybWF0LCBkaXNhYmxlCisgICAgICAgICBSVEMgcmVnaXN0ZXJzIFdyaXRlIHByb3RlY3Rpb24sIGVudGVyIGFuZCBleGl0IHRoZSBSVEMgaW5pdGlhbGl6YXRpb24gbW9kZSwKKyAgICAgICAgIFJUQyByZWdpc3RlcnMgc3luY2hyb25pemF0aW9uIGNoZWNrIGFuZCByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uIGVuYWJsZS4KKyAgICAgICAgICgjKSBUaGUgUlRDIFByZXNjYWxlciBpcyBwcm9ncmFtbWVkIHRvIGdlbmVyYXRlIHRoZSBSVEMgMUh6IHRpbWUgYmFzZS4KKyAgICAgICAgICAgICBJdCBpcyBzcGxpdCBpbnRvIDIgcHJvZ3JhbW1hYmxlIHByZXNjYWxlcnMgdG8gbWluaW1pemUgcG93ZXIgY29uc3VtcHRpb24uCisgICAgICAgICAgICAgKCsrKSBBIDctYml0IGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgYW5kIGEgMTUtYml0IHN5bmNocm9ub3VzIHByZXNjYWxlci4KKyAgICAgICAgICAgICAoKyspIFdoZW4gYm90aCBwcmVzY2FsZXJzIGFyZSB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjb25maWd1cmUgdGhlCisgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgdG8gYSBoaWdoIHZhbHVlIHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgICAgICAgKCMpIEFsbCBSVEMgcmVnaXN0ZXJzIGFyZSBXcml0ZSBwcm90ZWN0ZWQuIFdyaXRpbmcgdG8gdGhlIFJUQyByZWdpc3RlcnMKKyAgICAgICAgICAgICBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgYSBrZXkgaW50byB0aGUgV3JpdGUgUHJvdGVjdGlvbiByZWdpc3RlciwgUlRDX1dQUi4KKyAgICAgICAgICgjKSBUbyBjb25maWd1cmUgdGhlIFJUQyBDYWxlbmRhciwgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgZW50ZXIKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBtb2RlLiBJbiB0aGlzIG1vZGUsIHRoZSBjYWxlbmRhciBjb3VudGVyIGlzIHN0b3BwZWQKKyAgICAgICAgICAgICBhbmQgaXRzIHZhbHVlIGNhbiBiZSB1cGRhdGVkLiBXaGVuIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpcworICAgICAgICAgICAgIGNvbXBsZXRlLCB0aGUgY2FsZW5kYXIgcmVzdGFydHMgY291bnRpbmcgYWZ0ZXIgNCBSVENDTEsgY3ljbGVzLgorICAgICAgICAgKCMpIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAgICAgICAgICAgIHRoZSBzb2Z0d2FyZSBtdXN0IGZpcnN0IGNsZWFyIHRoZSBSU0YgZmxhZy4gVGhlIHNvZnR3YXJlIG11c3QgdGhlbgorICAgICAgICAgICAgIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nIHRoZSBjYWxlbmRhciwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUKKyAgICAgICAgICAgICBSVENfVFIgYW5kIFJUQ19EUiBzaGFkb3cgcmVnaXN0ZXJzLlRoZSBIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICBpbXBsZW1lbnRzIHRoZSBhYm92ZSBzb2Z0d2FyZSBzZXF1ZW5jZSAoUlNGIGNsZWFyIGFuZCBSU0YgY2hlY2spLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJUQyBwZXJpcGhlcmFsCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworCisgIC8qIENoZWNrIHRoZSBSVEMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBpZihocnRjICE9IE5VTEwpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKGhydGMtPkluc3RhbmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSX0ZPUk1BVChocnRjLT5Jbml0LkhvdXJGb3JtYXQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FTWU5DSF9QUkVESVYoaHJ0Yy0+SW5pdC5Bc3luY2hQcmVkaXYpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NZTkNIX1BSRURJVihocnRjLT5Jbml0LlN5bmNoUHJlZGl2KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVQoaHJ0Yy0+SW5pdC5PdXRQdXQpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9SRU1BUChocnRjLT5Jbml0Lk91dFB1dFJlbWFwKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVRfUE9MKGhydGMtPkluaXQuT3V0UHV0UG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9UWVBFKGhydGMtPkluaXQuT3V0UHV0VHlwZSkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfT1VUUFVUX1BVTExVUChocnRjLT5Jbml0Lk91dFB1dFB1bGxVcCkpOworCisgIGlmKGhydGMtPlN0YXRlID09IEhBTF9SVENfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHJ0Yy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIFByb2Nlc3MgVEFNUCBwZXJpcGhlcmFsIG9mZnNldCBmcm9tIFJUQyBvbmUgKi8KKyAgICBocnRjLT5UYW1wT2Zmc2V0ID0gKFRBTVBfQkFTRSAtIFJUQ19CQVNFKTsKKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBocnRjLT5BbGFybUFFdmVudENhbGxiYWNrICAgICAgICAgID0gIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgICAqLworICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2sgICAgICAgICAgPSAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgQWxhcm1CRXZlbnRDYWxsYmFjayAgICAgICovCisgICAgaHJ0Yy0+VGltZVN0YW1wRXZlbnRDYWxsYmFjayAgICAgICA9ICBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgKi8KKyAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgICAgID0gIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjayAqLworICAgIGhydGMtPlRhbXBlcjFFdmVudENhbGxiYWNrICAgICAgICAgPSAgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICovCisgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICA9ICBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUYW1wZXIyRXZlbnRDYWxsYmFjayAgICAgKi8KKyAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrID0gIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrOyAgIC8qITwgTGVnYWN5IHdlYWsgSW50ZXJuYWxUYW1wZXIzRXZlbnRDYWxsYmFjayAqLworICAgIGhydGMtPkludGVybmFsVGFtcGVyNEV2ZW50Q2FsbGJhY2sgPSAgSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyNEV2ZW50Q2FsbGJhY2s7ICAgLyohPCBMZWdhY3kgd2VhayBJbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrICovCisgICAgaHJ0Yy0+SW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayA9ICBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjazsgICAvKiE8IExlZ2FjeSB3ZWFrIEludGVybmFsVGFtcGVyNUV2ZW50Q2FsbGJhY2sgKi8KKyAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjZFdmVudENhbGxiYWNrID0gIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjZFdmVudENhbGxiYWNrOyAgIC8qITwgTGVnYWN5IHdlYWsgSW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjayAqLworCisgICAgaWYoaHJ0Yy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHJ0Yy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2soaHJ0Yyk7CisKKyAgICBpZihocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BEZUluaXQ7CisgICAgfQorI2Vsc2UKKyAgICAvKiBJbml0aWFsaXplIFJUQyBNU1AgKi8KKyAgICBIQUxfUlRDX01zcEluaXQoaHJ0Yyk7CisjZW5kaWYgLyogKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKyAgfQorCisgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAgIC8qIEVudGVyIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBzdGF0dXMgPSBSVENfRW50ZXJJbml0TW9kZShocnRjKTsKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENsZWFyIFJUQ19DUiBGTVQsIE9TRUwgYW5kIFBPTCBCaXRzICovCisgICAgICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfRk1UIHwgUlRDX0NSX1BPTCB8IFJUQ19DUl9PU0VMIHwgUlRDX0NSX1RBTVBPRSk7CisgICAgICAvKiBTZXQgUlRDX0NSIHJlZ2lzdGVyICovCisgICAgICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKGhydGMtPkluaXQuSG91ckZvcm1hdCB8IGhydGMtPkluaXQuT3V0UHV0IHwgaHJ0Yy0+SW5pdC5PdXRQdXRQb2xhcml0eSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUlRDIFBSRVIgKi8KKyAgICAgIGhydGMtPkluc3RhbmNlLT5QUkVSID0gKGhydGMtPkluaXQuU3luY2hQcmVkaXYpOworICAgICAgaHJ0Yy0+SW5zdGFuY2UtPlBSRVIgfD0gKGhydGMtPkluaXQuQXN5bmNoUHJlZGl2IDw8IFJUQ19QUkVSX1BSRURJVl9BX1Bvcyk7CisKKyAgICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgICAgc3RhdHVzID0gUlRDX0V4aXRJbml0TW9kZShocnRjKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfVEFNUEFMUk1fUFUgfFJUQ19DUl9UQU1QQUxSTV9UWVBFIHwgUlRDX0NSX09VVDJFTik7CisgICAgICAgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAoaHJ0Yy0+SW5pdC5PdXRQdXRQdWxsVXAgfCBocnRjLT5Jbml0Lk91dFB1dFR5cGUgfCBocnRjLT5Jbml0Lk91dFB1dFJlbWFwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlc2V0IHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0RlSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoaHJ0Yy0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIEVudGVyIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgc3RhdHVzID0gUlRDX0VudGVySW5pdE1vZGUoaHJ0Yyk7CisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBSZXNldCBUUiwgRFIgYW5kIENSIHJlZ2lzdGVycyAqLworICAgIGhydGMtPkluc3RhbmNlLT5UUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5EUiA9ICgodWludDMyX3QpKFJUQ19EUl9XRFVfMCB8IFJUQ19EUl9NVV8wIHwgUlRDX0RSX0RVXzApKTsKKyAgICAvKiBSZXNldCBBbGwgQ1IgYml0cyBleGNlcHQgQ1JbMjowXSAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSBSVENfQ1JfV1VDS1NFTDsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgV1VUV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKCgoaHJ0Yy0+SW5zdGFuY2UtPklDU1IpICYgUlRDX0lDU1JfV1VUV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2V0IGFsbCBSVEMgQ1IgcmVnaXN0ZXIgYml0cyAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+V1VUUiA9IFJUQ19XVVRSX1dVVDsKKyAgICBocnRjLT5JbnN0YW5jZS0+UFJFUiA9ICgodWludDMyX3QpKFJUQ19QUkVSX1BSRURJVl9BIHwgMHgwMDAwMDBGRlUpKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5TSElGVFIgPSAweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q0FMUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVNTUiA9IDB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IDB4MDAwMDAwMDBVOworCisgICAgLyogRXhpdCBpbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgc3RhdHVzID0gUlRDX0V4aXRJbml0TW9kZShocnRjKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgIHsKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgIGlmKGhydGMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgIHsKKyAgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwRGVJbml0OworICAgICB9CisKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayhocnRjKTsKKworI2Vsc2UKKyAgICAvKiBEZS1Jbml0aWFsaXplIFJUQyBNU1AgKi8KKyAgICBIQUxfUlRDX01zcERlSW5pdChocnRjKTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUOworICAgfQorCisgICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFJUQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEICAgICAgICAgIEFsYXJtIEEgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEICAgICAgICAgIEFsYXJtIEIgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19USU1FU1RBTVBfRVZFTlRfQ0JfSUQgICAgICAgIFRpbWVTdGFtcCBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1dBS0VVUFRJTUVSX0VWRU5UX0NCX0lEICAgICAgV2FrZVVwIFRpbWVyIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVEFNUEVSMV9FVkVOVF9DQl9JRCAgICAgICAgICBUYW1wZXIgMSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjJfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDIgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19JTlRFUk5BTF9UQU1QRVIzX0VWRU5UX0NCX0lEIEludGVybmFsIFRhbXBlciAzIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNF9FVkVOVF9DQl9JRCBJbnRlcm5hbCBUYW1wZXIgNCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjVfRVZFTlRfQ0JfSUQgSW50ZXJuYWwgVGFtcGVyIDUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19JTlRFUk5BTF9UQU1QRVI2X0VWRU5UX0NCX0lEIEludGVybmFsIFRhbXBlciA2IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICBNc3AgSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgTXNwIERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1JlZ2lzdGVyQ2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIEhBTF9SVENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFJUQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBpZihIQUxfUlRDX1NUQVRFX1JFQURZID09IGhydGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9SVENfQUxBUk1fQV9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5BbGFybUFFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfQUxBUk1fQl9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5BbGFybUJFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRhbXBlcjFFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfVEFNUEVSMl9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5UYW1wZXIyRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSM19FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNF9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNV9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjVFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNl9FVkVOVF9DQl9JRCA6CisgICAgICAgaHJ0Yy0+SW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisKKyAgIGNhc2UgSEFMX1JUQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEhBTF9SVENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmKEhBTF9SVENfU1RBVEVfUkVTRVQgPT0gaHJ0Yy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JUQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEhBTF9SVENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFJUQyBDYWxsYmFjaworICAqICAgICAgICAgUlRDIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQV9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBBIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfQUxBUk1fQl9FVkVOVF9DQl9JRCAgICAgICAgICBBbGFybSBCIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEICAgICAgICBUaW1lU3RhbXAgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCAgICAgIFdha2VVcCBUaW1lciBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDEgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEICAgICAgICAgIFRhbXBlciAyIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSM19FVkVOVF9DQl9JRCBJbnRlcm5hbCBUYW1wZXIgMyBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjRfRVZFTlRfQ0JfSUQgSW50ZXJuYWwgVGFtcGVyIDQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19JTlRFUk5BTF9UQU1QRVI1X0VWRU5UX0NCX0lEIEludGVybmFsIFRhbXBlciA1IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNl9FVkVOVF9DQl9JRCBJbnRlcm5hbCBUYW1wZXIgNiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX01TUElOSVRfQ0JfSUQgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgTXNwIERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19VblJlZ2lzdGVyQ2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIEhBTF9SVENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaWYoSEFMX1JUQ19TVEFURV9SRUFEWSA9PSBocnRjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfUlRDX0FMQVJNX0FfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+QWxhcm1BRXZlbnRDYWxsYmFjayA9IEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBbGFybUFFdmVudENhbGxiYWNrICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWxhcm1CRXZlbnRDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfVElNRVNUQU1QX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjazsgICAgLyogTGVnYWN5IHdlYWsgVGltZVN0YW1wRXZlbnRDYWxsYmFjayAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfV0FLRVVQVElNRVJfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+V2FrZVVwVGltZXJFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgV2FrZVVwVGltZXJFdmVudENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRhbXBlcjFFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRhbXBlcjFFdmVudENhbGxiYWNrICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1RBTVBFUjJfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgSEFMX1JUQ19JTlRFUk5BTF9UQU1QRVIzX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkludGVybmFsVGFtcGVyM0V2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXIzRXZlbnRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEludGVybmFsVGFtcGVyM0V2ZW50Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfSU5URVJOQUxfVEFNUEVSNF9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyNEV2ZW50Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBJbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX0lOVEVSTkFMX1RBTVBFUjVfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+SW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjVFdmVudENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgSW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayAgICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19JTlRFUk5BTF9UQU1QRVI2X0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkludGVybmFsVGFtcGVyNkV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEludGVybmFsVGFtcGVyNkV2ZW50Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgSEFMX1JUQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwSW5pdDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwRGVJbml0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmKEhBTF9SVENfU1RBVEVfUkVTRVQgPT0gaHJ0Yy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JUQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhydGMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwSW5pdDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9SVENfTXNwRGVJbml0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSVEMgTVNQLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDX01zcEluaXQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFJUQyBNU1AuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfTXNwRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgUlRDIFRpbWUgYW5kIERhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgVGltZSBhbmQgRGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29uZmlndXJlIFRpbWUgYW5kIERhdGUgZmVhdHVyZXMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDIGN1cnJlbnQgdGltZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc1RpbWUgUG9pbnRlciB0byBUaW1lIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19EQVlMSUdIVF9TQVZJTkcoc1RpbWUtPkRheUxpZ2h0U2F2aW5nKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfU1RPUkVfT1BFUkFUSU9OKHNUaW1lLT5TdG9yZU9wZXJhdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogRW50ZXIgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBzdGF0dXMgPSBSVENfRW50ZXJJbml0TW9kZShocnRjKTsKKyAgaWYoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9IDBVKQorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihzVGltZS0+SG91cnMpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc1RpbWUtPlRpbWVGb3JtYXQpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc1RpbWUtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoc1RpbWUtPkhvdXJzKSk7CisgICAgICB9CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoc1RpbWUtPk1pbnV0ZXMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhzVGltZS0+U2Vjb25kcykpOworCisgICAgICB0bXByZWcgPSAodWludDMyX3QpKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc1RpbWUtPkhvdXJzKSA8PCBSVENfVFJfSFVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+TWludXRlcykgPDwgUlRDX1RSX01OVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNUaW1lLT5TZWNvbmRzKSA8PCBSVENfVFJfU1VfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc1RpbWUtPlRpbWVGb3JtYXQpIDw8IFJUQ19UUl9QTV9Qb3MpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5Ib3VycykpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc1RpbWUtPlRpbWVGb3JtYXQpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc1RpbWUtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKSkpOworICAgICAgfQorICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5NaW51dGVzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5TZWNvbmRzKSkpOworICAgICAgdG1wcmVnID0gKCgodWludDMyX3QpKHNUaW1lLT5Ib3VycykgPDwgUlRDX1RSX0hVX1BvcykgfCBcCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc1RpbWUtPk1pbnV0ZXMpIDw8IFJUQ19UUl9NTlVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShzVGltZS0+U2Vjb25kcykgPDwgUlRDX1RSX1NVX1BvcykgfCBcCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc1RpbWUtPlRpbWVGb3JtYXQpIDw8IFJUQ19UUl9QTV9Qb3MpKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIFJUQ19UUiByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5UUiA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX1RSX1JFU0VSVkVEX01BU0spOworCisgICAgLyogQ2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQzMl90KX5SVENfQ1JfQktQKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgUlRDX0NSIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoc1RpbWUtPkRheUxpZ2h0U2F2aW5nIHwgc1RpbWUtPlN0b3JlT3BlcmF0aW9uKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIHN0YXR1cyA9IFJUQ19FeGl0SW5pdE1vZGUoaHJ0Yyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgIAorICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDIGN1cnJlbnQgdGltZS4KKyAgKiBAbm90ZSAgWW91IGNhbiB1c2UgU3ViU2Vjb25kcyBhbmQgU2Vjb25kRnJhY3Rpb24gKHNUaW1lIHN0cnVjdHVyZSBmaWVsZHMgcmV0dXJuZWQpIHRvIGNvbnZlcnQgU3ViU2Vjb25kcworICAqICAgICAgICB2YWx1ZSBpbiBzZWNvbmQgZnJhY3Rpb24gcmF0aW8gd2l0aCB0aW1lIHVuaXQgZm9sbG93aW5nIGdlbmVyaWMgZm9ybXVsYToKKyAgKiAgICAgICAgU2Vjb25kIGZyYWN0aW9uIHJhdGlvICogdGltZV91bml0PSBbKFNlY29uZEZyYWN0aW9uLVN1YlNlY29uZHMpLyhTZWNvbmRGcmFjdGlvbisxKV0gKiB0aW1lX3VuaXQKKyAgKiAgICAgICAgVGhpcyBjb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgb25seSBpZiBubyBzaGlmdCBvcGVyYXRpb24gaXMgcGVuZGluZyAoaWUuIFNIRlA9MCkgd2hlbiBQUkVESVZfUyA+PSBTUworICAqIEBub3RlICBZb3UgbXVzdCBjYWxsIEhBTF9SVENfR2V0RGF0ZSgpIGFmdGVyIEhBTF9SVENfR2V0VGltZSgpIHRvIHVubG9jayB0aGUgdmFsdWVzCisgICogICAgICAgIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIgc2hhZG93IHJlZ2lzdGVycyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgdGltZSBhbmQgZGF0ZSB2YWx1ZXMuCisgICogICAgICAgIFJlYWRpbmcgUlRDIGN1cnJlbnQgdGltZSBsb2NrcyB0aGUgdmFsdWVzIGluIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgQ3VycmVudCBkYXRlIGlzIHJlYWQKKyAgKiAgICAgICAgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIHRpbWUgYW5kIGRhdGUgdmFsdWVzLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlIHdpdGggSG91cnMsIE1pbnV0ZXMgYW5kIFNlY29uZHMgZmllbGRzIHJldHVybmVkCisgICogICAgICAgICAgICAgICAgd2l0aCBpbnB1dCBmb3JtYXQgKEJJTiBvciBCQ0QpLCBhbHNvIFN1YlNlY29uZHMgZmllbGQgcmV0dXJuaW5nIHRoZQorICAqICAgICAgICAgICAgICAgIFJUQ19TU1IgcmVnaXN0ZXIgY29udGVudCBhbmQgU2Vjb25kRnJhY3Rpb24gZmllbGQgdGhlIFN5bmNocm9ub3VzIHByZS1zY2FsZXIKKyAgKiAgICAgICAgICAgICAgICBmYWN0b3IgdG8gYmUgdXNlZCBmb3Igc2Vjb25kIGZyYWN0aW9uIHJhdGlvIGNvbXB1dGF0aW9uLgorICAqIEBwYXJhbSAgRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfRk9STUFUKEZvcm1hdCkpOworCisgIC8qIEdldCBzdWJzZWNvbmRzIHN0cnVjdHVyZSBmaWVsZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyKi8KKyAgc1RpbWUtPlN1YlNlY29uZHMgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5TU1IpOworCisgIC8qIEdldCBTZWNvbmRGcmFjdGlvbiBzdHJ1Y3R1cmUgZmllbGQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBmaWVsZCovCisgIHNUaW1lLT5TZWNvbmRGcmFjdGlvbiA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlBSRVIgJiBSVENfUFJFUl9QUkVESVZfUyk7CisKKyAgLyogR2V0IHRoZSBUUiByZWdpc3RlciAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UUiAmIFJUQ19UUl9SRVNFUlZFRF9NQVNLKTsKKworICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZS0+SG91cnMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfSFQgfCBSVENfVFJfSFUpKSA+PiBSVENfVFJfSFVfUG9zKTsKKyAgc1RpbWUtPk1pbnV0ZXMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSkpID4+IFJUQ19UUl9NTlVfUG9zKTsKKyAgc1RpbWUtPlNlY29uZHMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKSA+PiBSVENfVFJfU1VfUG9zKTsKKyAgc1RpbWUtPlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfUE0pKSA+PiBSVENfVFJfUE1fUG9zKTsKKworICAvKiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3JtYXQgKi8KKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgLyogQ29udmVydCB0aGUgdGltZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc1RpbWUtPkhvdXJzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKTsKKyAgICBzVGltZS0+TWludXRlcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lLT5NaW51dGVzKTsKKyAgICBzVGltZS0+U2Vjb25kcyA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNUaW1lLT5TZWNvbmRzKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gZGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IGRhdGV0bXByZWc7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsgIAorCisgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisKKyAvKiBQcm9jZXNzIExvY2tlZCAqLworIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgaWYoKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikgJiYgKChzRGF0ZS0+TW9udGggJiAweDEwVSkgPT0gMHgxMFUpKQorICB7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKChzRGF0ZS0+TW9udGggJiAodWludDhfdCl+KDB4MTBVKSkgKyAodWludDhfdCkweDBBVSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dFRUtEQVkoc0RhdGUtPldlZWtEYXkpKTsKKworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1lFQVIoc0RhdGUtPlllYXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01PTlRIKHNEYXRlLT5Nb250aCkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfREFURShzRGF0ZS0+RGF0ZSkpOworCisgICBkYXRldG1wcmVnID0gKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0RhdGUtPlllYXIpICA8PCBSVENfRFJfWVVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzRGF0ZS0+TW9udGgpIDw8IFJUQ19EUl9NVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNEYXRlLT5EYXRlKSAgPDwgUlRDX0RSX0RVX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICgodWludDMyX3Qpc0RhdGUtPldlZWtEYXkgPDwgUlRDX0RSX1dEVV9Qb3MpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1lFQVIoUlRDX0JjZDJUb0J5dGUoc0RhdGUtPlllYXIpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NT05USChSVENfQmNkMlRvQnl0ZShzRGF0ZS0+TW9udGgpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19EQVRFKFJUQ19CY2QyVG9CeXRlKHNEYXRlLT5EYXRlKSkpOworCisgICAgZGF0ZXRtcHJlZyA9ICgoKCh1aW50MzJfdClzRGF0ZS0+WWVhcikgPDwgUlRDX0RSX1lVX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClzRGF0ZS0+TW9udGgpIDw8IFJUQ19EUl9NVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc0RhdGUtPkRhdGUpIDw8IFJUQ19EUl9EVV9Qb3MpfCBcCisgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClzRGF0ZS0+V2Vla0RheSkgPDwgUlRDX0RSX1dEVV9Qb3MpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIEVudGVyIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgc3RhdHVzID0gUlRDX0VudGVySW5pdE1vZGUoaHJ0Yyk7CisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgdGhlIFJUQ19EUiByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5EUiA9ICh1aW50MzJfdCkoZGF0ZXRtcHJlZyAmIFJUQ19EUl9SRVNFUlZFRF9NQVNLKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIHN0YXR1cyA9IFJUQ19FeGl0SW5pdE1vZGUoaHJ0Yyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVEMgY3VycmVudCBkYXRlLgorICAqIEBub3RlICBZb3UgbXVzdCBjYWxsIEhBTF9SVENfR2V0RGF0ZSgpIGFmdGVyIEhBTF9SVENfR2V0VGltZSgpIHRvIHVubG9jayB0aGUgdmFsdWVzCisgICogICAgICAgIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIgc2hhZG93IHJlZ2lzdGVycyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgdGltZSBhbmQgZGF0ZSB2YWx1ZXMuCisgICogICAgICAgIFJlYWRpbmcgUlRDIGN1cnJlbnQgdGltZSBsb2NrcyB0aGUgdmFsdWVzIGluIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgQ3VycmVudCBkYXRlIGlzIHJlYWQuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNEYXRlIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiAgQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiAgQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldERhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19EYXRlVHlwZURlZiAqc0RhdGUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgZGF0ZXRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworICAvKiBHZXQgdGhlIERSIHJlZ2lzdGVyICovCisgIGRhdGV0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5EUiAmIFJUQ19EUl9SRVNFUlZFRF9NQVNLKTsKKworICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzRGF0ZS0+WWVhciA9ICh1aW50OF90KSgoZGF0ZXRtcHJlZyAmIChSVENfRFJfWVQgfCBSVENfRFJfWVUpKSA+PiBSVENfRFJfWVVfUG9zKTsKKyAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpKChkYXRldG1wcmVnICYgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpID4+IFJUQ19EUl9NVV9Qb3MpOworICBzRGF0ZS0+RGF0ZSA9ICh1aW50OF90KSgoZGF0ZXRtcHJlZyAmIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKSA+PiBSVENfRFJfRFVfUG9zKTsKKyAgc0RhdGUtPldlZWtEYXkgPSAodWludDhfdCkoKGRhdGV0bXByZWcgJiAoUlRDX0RSX1dEVSkpID4+IFJUQ19EUl9XRFVfUG9zKTsKKworICAvKiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3JtYXQgKi8KKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgLyogQ29udmVydCB0aGUgZGF0ZSBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB0byBCaW5hcnkgZm9ybWF0ICovCisgICAgc0RhdGUtPlllYXIgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzRGF0ZS0+WWVhcik7CisgICAgc0RhdGUtPk1vbnRoID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc0RhdGUtPk1vbnRoKTsKKyAgICBzRGF0ZS0+RGF0ZSA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNEYXRlLT5EYXRlKTsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICBSVEMgQWxhcm0gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgQWxhcm0gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBBbGFybSBmZWF0dXJlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc0FsYXJtIFBvaW50ZXIgdG8gQWxhcm0gc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgdG1wcmVnOworICB1aW50MzJfdCBzdWJzZWNvbmR0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oc0FsYXJtLT5BbGFybSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX01BU0soc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9IDBVKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSk7CisKKyAgICBpZihzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisKKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgUlRDX0FMUk1BUl9IVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpIDw8IFJUQ19BTFJNQVJfTU5VX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykgPDwgUlRDX0FMUk1BUl9TVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCBSVENfQUxSTUFSX1BNX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSA8PCBSVENfQUxSTUFSX0RVX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAwVSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfREFURShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisKKyAgICB0bXByZWcgPSAoKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpIDw8IFJUQ19BTFJNQVJfSFVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykgPDwgUlRDX0FMUk1BUl9NTlVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykgPDwgUlRDX0FMUk1BUl9TVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCBSVENfQUxSTUFSX1BNX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQSBvciBBbGFybSBCIFN1YiBTZWNvbmQgcmVnaXN0ZXJzICovCisgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSB8ICh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVN1YlNlY29uZE1hc2spKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHJlZ2lzdGVyICovCisgIGlmKHNBbGFybS0+QWxhcm0gPT0gUlRDX0FMQVJNX0EpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJBKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEEgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShocnRjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBCIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJCKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJCV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUJSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0VOQUJMRShocnRjKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybSB3aXRoIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRoZSBBbGFybSByZWdpc3RlciBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQWxhcm0KKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIChVc2UgdGhlIEhBTF9SVENfRGVhY3RpdmF0ZUFsYXJtKCkpLgorICAqIEBub3RlICAgVGhlIEhBTF9SVENfU2V0VGltZSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgQWxhcm0gZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgc0FsYXJtIFBvaW50ZXIgdG8gQWxhcm0gc3RydWN0dXJlCisgICogQHBhcmFtICBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRBbGFybV9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgdG1wcmVnOworICB1aW50MzJfdCBzdWJzZWNvbmR0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oc0FsYXJtLT5BbGFybSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX01BU0soc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgaWYoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9IDBVKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfU0VDT05EUyhzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSk7CisKKyAgICBpZihzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gUlRDX0FMQVJNREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgdG1wcmVnID0gKCgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpIDw8IFJUQ19BTFJNQVJfSFVfUG9zKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCBSVENfQUxSTUFSX01OVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpIDw8IFJUQ19BTFJNQVJfU1VfUG9zKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkgPDwgUlRDX0FMUk1BUl9QTV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkgPDwgUlRDX0FMUk1BUl9EVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpKTsKKworICAgIGlmKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykgPDwgUlRDX0FMUk1BUl9IVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCBSVENfQUxSTUFSX01OVV9Qb3MpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSA8PCBSVENfQUxSTUFSX1NVX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpIDw8IFJUQ19BTFJNQVJfUE1fUG9zKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSA8PCBSVENfQUxSTUFSX0RVX1BvcykgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOworICB9CisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQSBvciBBbGFybSBCIFN1YiBTZWNvbmQgcmVnaXN0ZXJzICovCisgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSB8ICh1aW50MzJfdCkoc0FsYXJtLT5BbGFybVN1YlNlY29uZE1hc2spKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHJlZ2lzdGVyICovCisgIGlmKHNBbGFybS0+QWxhcm0gPT0gUlRDX0FMQVJNX0EpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKworICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEEgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShocnRjKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoaHJ0YyxSVENfSVRfQUxSQSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgQWxhcm0gQiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBDbGVhciBmbGFnIGFsYXJtIEIgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLCBSVENfQ0xFQVJfQUxSQkYpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkJXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlIgPSAodWludDMyX3QpdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQiBTdWIgU2Vjb25kIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CU1NSID0gc3Vic2Vjb25kdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRU5BQkxFKGhydGMpOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVChocnRjLCBSVENfSVRfQUxSQik7CisgIH0KKworICAvKiBSVEMgQWxhcm0gSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgQWxhcm0gU3BlY2lmaWVzIHRoZSBBbGFybS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfQUxBUk1fQTogIEFsYXJtQQorICAqICAgICAgICAgICAgQGFyZyBSVENfQUxBUk1fQjogIEFsYXJtQgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19EZWFjdGl2YXRlQWxhcm0oUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEFsYXJtKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTShBbGFybSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgaWYoQWxhcm0gPT0gUlRDX0FMQVJNX0EpCisgIHsKKyAgICAvKiBBbGFybUEgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChocnRjLCBSVENfSVRfQUxSQSk7CisKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJ4V0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKCAoSEFMX0dldFRpY2soKSAgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBBbGFybUIgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVChocnRjLFJUQ19JVF9BTFJCKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUnhXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSVEMgQWxhcm0gdmFsdWUgYW5kIG1hc2tzLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzQWxhcm0gUG9pbnRlciB0byBEYXRlIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgQWxhcm0gU3BlY2lmaWVzIHRoZSBBbGFybS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0E6IEFsYXJtQQorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0I6IEFsYXJtQgorICAqIEBwYXJhbSAgRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiBCQ0QgZGF0YSBmb3JtYXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfR2V0QWxhcm0oUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19BbGFybVR5cGVEZWYgKnNBbGFybSwgdWludDMyX3QgQWxhcm0sIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICB1aW50MzJfdCBzdWJzZWNvbmR0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oQWxhcm0pKTsKKworICBpZihBbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIEFsYXJtQSAqLworICAgIHNBbGFybS0+QWxhcm0gPSBSVENfQUxBUk1fQTsKKworICAgIHRtcHJlZyA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUik7CisgICAgc3Vic2Vjb25kdG1wcmVnID0gKHVpbnQzMl90KSgoaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BU1NSICkgJiBSVENfQUxSTUFTU1JfU1MpOworCisgICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICAgIHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1BUl9IVCB8IFJUQ19BTFJNQVJfSFUpKSA+PiBSVENfQUxSTUFSX0hVX1Bvcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpKSA+PiBSVENfQUxSTUFSX01OVV9Qb3MpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSkpID4+IFJUQ19BTFJNQVJfU1VfUG9zKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gKHVpbnQ4X3QpKCh0bXByZWcgJiBSVENfQUxSTUFSX1BNKSA+PiBSVENfQUxSTUFSX1NVX1Bvcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfRFQgfCBSVENfQUxSTUFSX0RVKSkgPj4gUlRDX0FMUk1BUl9EVV9Qb3MpOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX0FMUk1BUl9XRFNFTCk7CisgICAgc0FsYXJtLT5BbGFybU1hc2sgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTEFSTU1BU0tfQUxMKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzQWxhcm0tPkFsYXJtID0gUlRDX0FMQVJNX0I7CisKKyAgICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5BTFJNQlIpOworICAgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUikgJiBSVENfQUxSTUJTU1JfU1MpOworCisgICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICAgIHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1CUl9IVCB8IFJUQ19BTFJNQlJfSFUpKSA+PiBSVENfQUxSTUJSX0hVX1Bvcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQlJfTU5UIHwgUlRDX0FMUk1CUl9NTlUpKSA+PiBSVENfQUxSTUJSX01OVV9Qb3MpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSkpID4+IFJUQ19BTFJNQlJfU1VfUG9zKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gKHVpbnQ4X3QpKCh0bXByZWcgJiBSVENfQUxSTUJSX1BNKSA+PiBSVENfQUxSTUJSX1BNX1Bvcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQlJfRFQgfCBSVENfQUxSTUJSX0RVKSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX0FMUk1CUl9XRFNFTCk7CisgICAgc0FsYXJtLT5BbGFybU1hc2sgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTEFSTU1BU0tfQUxMKTsKKyAgfQorCisgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpOworICAgIHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMgPSBSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcyk7CisgICAgc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5ID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEFsYXJtIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBHZXQgdGhlIEFsYXJtQSBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkEpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1BIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgIT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIEFsYXJtQSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgQ29tcGFyZSBNYXRjaCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5BbGFybUFFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIC8qIEFsYXJtQSBjYWxsYmFjayAqLworICAgICAgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIEdldCB0aGUgQWxhcm1CIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfQUxBUk1fR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfQUxSQikgIT0gMFUpCisgIHsKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBBbGFybUIgSW50ZXJydXB0ICovCisgICAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgQWxhcm1CIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0NMRUFSX0FMUkJGKTsKKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgQ29tcGFyZSBNYXRjaCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5BbGFybUJFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIC8qIEFsYXJtQiBjYWxsYmFjayAqLworICAgICAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxhcm0gQSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEFsYXJtQSBQb2xsaW5nIHJlcXVlc3QuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19Qb2xsRm9yQWxhcm1BRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpID09IDBVKQorICB7CisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgQWxhcm0gaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIFdhaXQgZm9yIFJUQyBUaW1lIGFuZCBEYXRlIFN5bmNocm9uaXphdGlvbgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdhaXQgdW50aWwgdGhlIFJUQyBUaW1lIGFuZCBEYXRlIHJlZ2lzdGVycyAoUlRDX1RSIGFuZCBSVENfRFIpIGFyZQorICAqICAgICAgICAgc3luY2hyb25pemVkIHdpdGggUlRDIEFQQiBjbG9jay4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgUmVzeW5jaHJvbml6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQG5vdGUgICBUbyByZWFkIHRoZSBjYWxlbmRhciB0aHJvdWdoIHRoZSBzaGFkb3cgcmVnaXN0ZXJzIGFmdGVyIENhbGVuZGFyCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAqICAgICAgICAgdGhlIHNvZnR3YXJlIG11c3QgZmlyc3QgY2xlYXIgdGhlIFJTRiBmbGFnLgorICAqICAgICAgICAgVGhlIHNvZnR3YXJlIG11c3QgdGhlbiB3YWl0IHVudGlsIGl0IGlzIHNldCBhZ2FpbiBiZWZvcmUgcmVhZGluZworICAqICAgICAgICAgdGhlIGNhbGVuZGFyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuCisgICogICAgICAgICBjb3JyZWN0bHkgY29waWVkIGludG8gdGhlIFJUQ19UUiBhbmQgUlRDX0RSIHNoYWRvdyByZWdpc3RlcnMuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfV2FpdEZvclN5bmNocm8oUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDbGVhciBSU0YgZmxhZyAqLworICBocnRjLT5JbnN0YW5jZS0+SUNTUiAmPSAodWludDMyX3QpUlRDX1JTRl9NQVNLOworCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aGUgcmVnaXN0ZXJzIHRvIGJlIHN5bmNocm9uaXNlZCAqLworICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9SU0YpID09IDBVKQorICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCisgICAgICAoKykgR2V0IFJUQyBzdGF0ZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFJUQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1JUQ1N0YXRlVHlwZURlZiBIQUxfUlRDX0dldFN0YXRlKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBSZXR1cm4gUlRDIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHJ0Yy0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW50ZXIgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOyAgCisKKyAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCisgIGlmKChocnRjLT5JbnN0YW5jZS0+SUNTUiAmIFJUQ19JQ1NSX0lOSVRGKSA9PSAwVSkKKyAgeworICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIFNFVF9CSVQoaHJ0Yy0+SW5zdGFuY2UtPklDU1IsIFJUQ19JQ1NSX0lOSVQpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIGlzIGluIElOSVQgc3RhdGUgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKCgoaHJ0Yy0+SW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gMFUpICYmIChzdGF0dXMgIT0gSEFMX1RJTUVPVVQpKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpICAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEV4aXQgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBSVENfRXhpdEluaXRNb2RlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIENMRUFSX0JJVChSVEMtPklDU1IsIFJUQ19JQ1NSX0lOSVQpOworCisgIC8qIElmIENSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyAqLworICBpZiAoUkVBRF9CSVQoUlRDLT5DUiwgUlRDX0NSX0JZUFNIQUQpID09IDBVKQorICB7CisgICAgaWYgKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIGVsc2UgLyogV0EgMi43LjEgQ2FsZW5kYXIgaW5pdGlhbGl6YXRpb24gbWF5IGZhaWwgaW4gY2FzZSBvZiBjb25zZWN1dGl2ZSBJTklUIG1vZGUgZW50cnkuCisgICAgICAgICAgUGxlYXNlIGxvb2sgYXQgU1RNMzJHMCBFcnJhdGEgc2hlZXQgb24gdGhlIGludGVybmV0IGZvciBkZXRhaWxzLiAqLworICB7CisgICAgLyogQ2xlYXIgQllQU0hBRCBiaXQgKi8KKyAgICBDTEVBUl9CSVQoUlRDLT5DUiwgUlRDX0NSX0JZUFNIQUQpOworICAgIGlmIChIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgIH0KKyAgICAvKiBSZXN0b3JlIEJZUFNIQUQgYml0ICovCisgICAgU0VUX0JJVChSVEMtPkNSLCBSVENfQ1JfQllQU0hBRCk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGEgMiBkaWdpdCBkZWNpbWFsIHRvIEJDRCBmb3JtYXQuCisgICogQHBhcmFtICBWYWx1ZSBCeXRlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIGJ5dGUKKyAgKi8KK3VpbnQ4X3QgUlRDX0J5dGVUb0JjZDIodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgYmNkaGlnaCA9IDBVOworICB1aW50OF90IFBhcmFtID0gVmFsdWU7CisKKyAgd2hpbGUoUGFyYW0gPj0gMTBVKQorICB7CisgICAgYmNkaGlnaCsrOworICAgIFBhcmFtIC09IDEwVTsKKyAgfQorCisgIHJldHVybiAgKCh1aW50OF90KShiY2RoaWdoIDw8IDRVKSB8IFBhcmFtKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGZyb20gMiBkaWdpdCBCQ0QgdG8gQmluYXJ5LgorICAqIEBwYXJhbSAgVmFsdWUgQkNEIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIHdvcmQKKyAgKi8KK3VpbnQ4X3QgUlRDX0JjZDJUb0J5dGUodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgdG1wOworICB0bXAgPSAoKCh1aW50MzJfdClWYWx1ZSAmIDB4RjBVKSA+PiA0VSkgKiAxMFU7CisgIHJldHVybiAodWludDhfdCkodG1wICsgKCh1aW50MzJfdClWYWx1ZSAmIDB4MEZVKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUlRDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfcnRjX2V4LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9ydGNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDk1YmUxCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfcnRjX2V4LmMKQEAgLTAsMCArMSwxOTUyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9ydGNfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgUlRDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlYWwgVGltZSBDbG9jayAoUlRDKSBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFJUQyBUaW1lIFN0YW1wIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFJUQyBUYW1wZXIgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUlRDIFdha2UtdXAgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBSVEMgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFbmFibGUgdGhlIFJUQyBkb21haW4gYWNjZXNzLgorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBQcmVzY2FsZXIgKEFzeW5jaHJvbm91cyBhbmQgU3luY2hyb25vdXMpIGFuZCBSVEMgaG91cgorICAgICAgICBmb3JtYXQgdXNpbmcgdGhlIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorCisgICoqKiBSVEMgV2FrZXVwIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIENsb2NrIHNvdXJjZSBhbmQgQ291bnRlciB1c2UgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIHRpbWVyIHdpdGggaW50ZXJydXB0IG1vZGUKKyAgICAgICAgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgV2FrZVVwIENvdW50ZXIgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ0V4X0dldFdha2VVcFRpbWVyKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgKioqIE91dHB1dHMgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgVGhlIFJUQyBoYXMgMiBkaWZmZXJlbnQgb3V0cHV0czoKKyAgICAoKykgUlRDX0FMQVJNOiB0aGlzIG91dHB1dCBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgUlRDIEFsYXJtIEEsIEFsYXJtIEIKKyAgICAgICAgYW5kIFdhS2VVcCBzaWduYWxzLgorICAgICAgICBUbyBvdXRwdXQgdGhlIHNlbGVjdGVkIFJUQyBzaWduYWwsIHVzZSB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uCisgICAgKCspIFJUQ19DQUxJQjogdGhpcyBvdXRwdXQgaXMgNTEySHogc2lnbmFsIG9yIDFIei4KKyAgICAgICAgVG8gZW5hYmxlIHRoZSBSVENfQ0FMSUIsIHVzZSB0aGUgSEFMX1JUQ0V4X1NldENhbGlicmF0aW9uT3V0UHV0KCkgZnVuY3Rpb24uCisgICAgKCspIFR3byBwaW5zIGNhbiBiZSB1c2VkIGFzIFJUQ19BTEFSTSBvciBSVENfQ0FMSUIgKFBDMTMsIFBCMikgbWFuYWdlZCBvbgorICAgICAgICB0aGUgUlRDX09SIHJlZ2lzdGVyLgorICAgICgrKSBXaGVuIHRoZSBSVENfQ0FMSUIgb3IgUlRDX0FMQVJNIG91dHB1dCBpcyBzZWxlY3RlZCwgdGhlIFJUQ19PVVQgcGluIGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlZCBpbiBvdXRwdXQgYWx0ZXJuYXRlIGZ1bmN0aW9uLgorCisgICoqKiBTbW9vdGggZGlnaXRhbCBDYWxpYnJhdGlvbiBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBPcmlnaW5hbCBEaWdpdGFsIENhbGlicmF0aW9uIFZhbHVlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKDMycywxNnMgYW5kIDhzKSB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgKioqIFRpbWVTdGFtcCBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgRW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0VGltZVN0YW1wKCkgZnVuY3Rpb24uCisgICAgICAgIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgdGhlIFJUQyBUaW1lU3RhbXAgd2l0aCBpbnRlcnJ1cHQgbW9kZSB1c2luZyB0aGUKKyAgICAgICAgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcF9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgVGltZVN0YW1wIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcCgpCisgICAgICAgIGZ1bmN0aW9uLgorCisgICoqKiBJbnRlcm5hbCBUaW1lU3RhbXAgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIGludGVybmFsIFRpbWVTdGFtcCB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldEludGVybmFsVGltZVN0YW1wKCkgZnVuY3Rpb24uCisgICAgICAgIFVzZXIgaGFzIHRvIGNoZWNrIGludGVybmFsIHRpbWVzdGFtcCBvY2N1cnJlbmNlIHVzaW5nIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfR0VUX0ZMQUcuCisgICAgKCspIFRvIHJlYWQgdGhlIFJUQyBUaW1lU3RhbXAgVGltZSBhbmQgRGF0ZSByZWdpc3RlciwgdXNlIHRoZSBIQUxfUlRDRXhfR2V0VGltZVN0YW1wKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgICoqKiBUYW1wZXIgY29uZmlndXJhdGlvbiAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0KKyAgICAgKCspIEVuYWJsZSB0aGUgUlRDIFRhbXBlciBhbmQgY29uZmlndXJlIHRoZSBUYW1wZXIgZmlsdGVyIGNvdW50LCB0cmlnZ2VyIEVkZ2UKKyAgICAgICAgIG9yIExldmVsIGFjY29yZGluZyB0byB0aGUgVGFtcGVyIGZpbHRlciAoaWYgZXF1YWwgdG8gMCBFZGdlIGVsc2UgTGV2ZWwpCisgICAgICAgICB2YWx1ZSwgc2FtcGxpbmcgZnJlcXVlbmN5LCBOb0VyYXNlLCBNYXNrRmxhZywgIHByZWNoYXJnZSBvciBkaXNjaGFyZ2UgYW5kCisgICAgICAgICBQdWxsLVVQIHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0VGFtcGVyKCkgZnVuY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIFJUQyBUYW1wZXIKKyAgICAgICAgIHdpdGggaW50ZXJydXB0IG1vZGUgdXNpbmcgSEFMX1JUQ0V4X1NldFRhbXBlcl9JVCgpIGZ1bmN0aW9uLgorICAgICAoKykgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgVGFtcGVyIGVyYXNlcyB0aGUgYmFja3VwIHJlZ2lzdGVycy4gVG8gYXZvaWQKKyAgICAgICAgIGVyYXNlLCBlbmFibGUgdGhlIE5vRXJhc2UgZmllbGQgb24gdGhlIFJUQ19UQU1QQ1IgcmVnaXN0ZXIuCisgICAgICgrKSBXaXRoIG5ldyBSVEMgdGFtcGVyIGNvbmZpZ3VyYXRpb24sIHlvdSBoYXZlIHRvIGNhbGwgSEFMX1JUQ19Jbml0KCkgaW4gb3JkZXIgdG8KKyAgICAgICAgIHBlcmZvcm0gVEFNUCBiYXNlIGFkZHJlc3Mgb2Zmc2V0IGNhbGN1bGF0aW9uLgorICAgICAoKykgSWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gaGF2ZSB0YW1wZXIgdXNpbmcgUlRDIGNsb2NrLCB5b3UgY2FuIGJ5cGFzcyBpdHMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgIGJ5IHNldHRpbmcgQ2xvY2tFbmFibGUgaW50aSBmaWVsZCB0byBSVENfQ0xPQ0tfRElTQUJMRS4KKyAgICAgKCspIEVuYWJsZSBJbnRlcm5hbCB0YW1wZXIgdXNpbmcgSEFMX1JUQ0V4X1NldEludGVybmFsVGFtcGVyLiBJVCBtb2RlIGNhbiBiZSBjaG9zZW4gdXNpbmcKKyAgICAgICAgIHNldHRpbmcgSW50ZXJydXB0IGZpZWxkLgorCisgICAqKiogQmFja3VwIERhdGEgUmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBbLi5dCisgICAgICgrKSBUbyB3cml0ZSB0byB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycywgdXNlIHRoZSBIQUxfUlRDRXhfQktVUFdyaXRlKCkKKyAgICAgICAgIGZ1bmN0aW9uLgorICAgICAoKykgVG8gcmVhZCB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycywgdXNlIHRoZSBIQUxfUlRDRXhfQktVUFJlYWQoKQorICAgICAgICAgZnVuY3Rpb24uCisgICAgICgrKSBCZWZvZXIgY2FsbGluZ3Rob3NlIGZ1Y250aW9uIHlvdSBoYXZlIHRvIGNhbGwgSEFMX1JUQ19Jbml0KCkgaW4gb3JkZXIgdG8KKyAgICAgICAgIHBlcmZvcm0gVEFNUCBiYXNlIGFkZHJlc3Mgb2Zmc2V0IGNhbGN1bGF0aW9uLgorCisgICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXgKKyAgKiBAYnJpZWYgUlRDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgVGltZVN0YW1wIGFuZCBUYW1wZXIgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBUaW1lU3RhbXAgZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUaW1lU3RhbXAuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIFRpbWVTdGFtcCBmZWF0dXJlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lU3RhbXBFZGdlIFNwZWNpZmllcyB0aGUgcGluIGVkZ2Ugb24gd2hpY2ggdGhlIFRpbWVTdGFtcCBpcworICAqICAgICAgICAgYWN0aXZhdGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9SSVNJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogQHBhcmFtICBSVENfVGltZVN0YW1wUGluIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBQaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVDogUEMxMyBpcyBzZWxlY3RlZCBhcyBSVEMgVGltZVN0YW1wIFBpbi4KKyAgKiAgICAgICAgICAgICAgIFRoZSBSVEMgVGltZVN0YW1wIFBpbiBpcyBwZXIgZGVmYXVsdCBQQzEzLCBidXQgZm9yIHJlYXNvbnMgb2YKKyAgKiAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnfD0gVGltZVN0YW1wRWRnZTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgU3RhbXAgVFNFREdFIGFuZCBFbmFibGUgYml0cyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodWludDMyX3QpdG1wcmVnOworCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBUaW1lU3RhbXAgd2l0aCBJbnRlcnJ1cHQuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIFRpbWVTdGFtcCBmZWF0dXJlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lU3RhbXBFZGdlIFNwZWNpZmllcyB0aGUgcGluIGVkZ2Ugb24gd2hpY2ggdGhlIFRpbWVTdGFtcCBpcworICAqICAgICAgICAgYWN0aXZhdGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9SSVNJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogQHBhcmFtICBSVENfVGltZVN0YW1wUGluIFNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBQaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVDogUEMxMyBpcyBzZWxlY3RlZCBhcyBSVEMgVGltZVN0YW1wIFBpbi4KKyAgKiAgICAgICAgICAgICAgIFRoZSBSVEMgVGltZVN0YW1wIFBpbiBpcyBwZXIgZGVmYXVsdCBQQzEzLCBidXQgZm9yIHJlYXNvbnMgb2YKKyAgKiAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcF9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnIHw9IFRpbWVTdGFtcEVkZ2U7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIFN0YW1wIFRTRURHRSBhbmQgRW5hYmxlIGJpdHMgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSID0gKHVpbnQzMl90KXRtcHJlZzsKKworICBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgSVQgdGltZXN0YW1wICovCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFX0lUKGhydGMsUlRDX0lUX1RTKTsKKworICAvKiBSVEMgdGltZXN0YW1wIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIFRpbWVTdGFtcC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEVfSVQoaHJ0YywgUlRDX0lUX1RTKTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIFN0YW1wIFRTRURHRSBhbmQgRW5hYmxlIGJpdHMgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSID0gKHVpbnQzMl90KXRtcHJlZzsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEludGVybmFsIFRpbWVTdGFtcC4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyB0aGUgaW50ZXJuYWwgVGltZVN0YW1wIGZlYXR1cmUuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRJbnRlcm5hbFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIGludGVybmFsIFRpbWUgU3RhbXAgRW5hYmxlIGJpdHMgKi8KKyAgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSBJbnRlcm5hbCBUaW1lU3RhbXAuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlSW50ZXJuYWxUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBpbnRlcm5hbCBUaW1lIFN0YW1wIEVuYWJsZSBiaXRzICovCisgIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfRElTQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSVEMgVGltZVN0YW1wIHZhbHVlLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGltZVN0YW1wIFBvaW50ZXIgdG8gVGltZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIHNUaW1lU3RhbXBEYXRlIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIEZvcm1hdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfR2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYqIHNUaW1lU3RhbXAsIFJUQ19EYXRlVHlwZURlZiogc1RpbWVTdGFtcERhdGUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wdGltZSwgdG1wZGF0ZTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworICAvKiBHZXQgdGhlIFRpbWVTdGFtcCB0aW1lIGFuZCBkYXRlIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKyAgdG1wdGltZSA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlRTVFIgJiBSVENfVFJfUkVTRVJWRURfTUFTSyk7CisgIHRtcGRhdGUgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UU0RSICYgUlRDX0RSX1JFU0VSVkVEX01BU0spOworCisgIC8qIEZpbGwgdGhlIFRpbWUgc3RydWN0dXJlIGZpZWxkcyB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc1RpbWVTdGFtcC0+SG91cnMgPSAodWludDhfdCkoKHRtcHRpbWUgJiAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSkgPj4gUlRDX1RTVFJfSFVfUG9zKTsKKyAgc1RpbWVTdGFtcC0+TWludXRlcyA9ICh1aW50OF90KSgodG1wdGltZSAmIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSkpID4+UlRDX1RTVFJfTU5VX1Bvcyk7CisgIHNUaW1lU3RhbXAtPlNlY29uZHMgPSAodWludDhfdCkoKHRtcHRpbWUgJiAoUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSkgPj4gUlRDX1RTVFJfU1VfUG9zKTsKKyAgc1RpbWVTdGFtcC0+VGltZUZvcm1hdCA9ICh1aW50OF90KSgodG1wdGltZSAmIChSVENfVFJfUE0pKSA+PiBSVENfVFNUUl9QTV9Qb3MpOworICBzVGltZVN0YW1wLT5TdWJTZWNvbmRzID0gKHVpbnQzMl90KSBocnRjLT5JbnN0YW5jZS0+VFNTU1I7CisKKyAgLyogRmlsbCB0aGUgRGF0ZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZVN0YW1wRGF0ZS0+WWVhciA9IDBVOworICBzVGltZVN0YW1wRGF0ZS0+TW9udGggPSAodWludDhfdCkoKHRtcGRhdGUgJiAoUlRDX0RSX01UIHwgUlRDX0RSX01VKSkgPj4gUlRDX1RTRFJfTVVfUG9zKTsKKyAgc1RpbWVTdGFtcERhdGUtPkRhdGUgPSAodWludDhfdCkodG1wZGF0ZSAmIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKTsKKyAgc1RpbWVTdGFtcERhdGUtPldlZWtEYXkgPSAodWludDhfdCkoKHRtcGRhdGUgJiAoUlRDX0RSX1dEVSkpID4+IFJUQ19UU0RSX1dEVV9Qb3MpOworCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICAvKiBDb252ZXJ0IHRoZSBUaW1lU3RhbXAgc3RydWN0dXJlIHBhcmFtZXRlcnMgdG8gQmluYXJ5IGZvcm1hdCAqLworICAgIHNUaW1lU3RhbXAtPkhvdXJzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcC0+SG91cnMpOworICAgIHNUaW1lU3RhbXAtPk1pbnV0ZXMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5NaW51dGVzKTsKKyAgICBzVGltZVN0YW1wLT5TZWNvbmRzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcC0+U2Vjb25kcyk7CisKKyAgICAvKiBDb252ZXJ0IHRoZSBEYXRlVGltZVN0YW1wIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHRvIEJpbmFyeSBmb3JtYXQgKi8KKyAgICBzVGltZVN0YW1wRGF0ZS0+TW9udGggPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+TW9udGgpOworICAgIHNUaW1lU3RhbXBEYXRlLT5EYXRlID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcERhdGUtPkRhdGUpOworICAgIHNUaW1lU3RhbXBEYXRlLT5XZWVrRGF5ID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcERhdGUtPldlZWtEYXkpOworICB9CisKKyAgLyogQ2xlYXIgdGhlIFRJTUVTVEFNUCBGbGFncyAqLworICBfX0hBTF9SVENfSU5URVJOQUxfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfSVRTRik7CisgIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UU0YpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZVN0YW1wIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBUaW1lU3RhbXAgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ0V4X1RpbWVTdGFtcElSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgVGltZVN0YW1wIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX1RTKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRJTUVTVEFNUCBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRikgIT0gMFUpCisgICAgeworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgVGltZVN0YW1wRXZlbnQgcmVnaXN0ZXJlZCBDYWxsYmFjayAqLworICAgICAgaHJ0Yy0+VGltZVN0YW1wRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgICAvKiBUSU1FU1RBTVAgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAvKiBDbGVhciB0aGUgVElNRVNUQU1QIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRik7CisgICAgfQorICB9CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVGltZVN0YW1wIHBvbGxpbmcgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRpbWVTdGFtcEV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKSA9PSAwVSkKKyAgeworICAgIGlmKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNPVkYpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUSU1FU1RBTVAgT3ZlclJ1biBGbGFnICovCisgICAgICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNPVkYpOworCisgICAgICAvKiBDaGFuZ2UgVElNRVNUQU1QIHN0YXRlICovCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEBicmllZiAgICBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIFdha2UtdXAgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBXYWtlLXVwIGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgd2FrZSB1cCB0aW1lci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgV2FrZVVwQ291bnRlciBXYWtlIHVwIGNvdW50ZXIKKyAgKiBAcGFyYW0gIFdha2VVcENsb2NrIFdha2UgdXAgY2xvY2sKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DTE9DSyhXYWtlVXBDbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DT1VOVEVSKFdha2VVcENvdW50ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENsZWFyIFdVVEUgaW4gUlRDX0NSIHRvIGRpc2FibGUgdGhlIHdha2V1cCB0aW1lciAqLworICBDTEVBUl9CSVQoUlRDLT5DUiwgUlRDX0NSX1dVVEUpOworCisgIC8qIFBvbGwgV1VUV0YgdW50aWwgaXQgaXMgc2V0IGluIFJUQ19JQ1NSIHRvIG1ha2Ugc3VyZSB0aGUgYWNjZXNzIHRvIHdha2V1cCBhdXRvcmVsb2FkCisgICAgIGNvdW50ZXIgYW5kIHRvIFdVQ0tTRUxbMjowXSBiaXRzIGlzIGFsbG93ZWQuIFRoaXMgc3RlcCBtdXN0IGJlIHNraXBwZWQgaW4KKyAgICAgY2FsZW5kYXIgaW5pdGlhbGl6YXRpb24gbW9kZS4gKi8KKyAgaWYgKFJFQURfQklUKFJUQy0+SUNTUiwgUlRDX0lDU1JfSU5JVEYpID09IDBVKQorICB7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgV2FrZXVwIFRpbWVyIGNsb2NrIHNvdXJjZSBiaXRzIGluIENSIHJlZ2lzdGVyICovCisgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpflJUQ19DUl9XVUNLU0VMOworCisgIC8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlICovCisgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpV2FrZVVwQ2xvY2s7CisKKyAgLyogQ29uZmlndXJlIHRoZSBXYWtldXAgVGltZXIgY291bnRlciAqLworICBocnRjLT5JbnN0YW5jZS0+V1VUUiA9ICh1aW50MzJfdClXYWtlVXBDb3VudGVyOworCisgICAvKiBFbmFibGUgdGhlIFdha2V1cCBUaW1lciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgd2FrZSB1cCB0aW1lciB3aXRoIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgV2FrZVVwQ291bnRlciBXYWtlIHVwIGNvdW50ZXIKKyAgKiBAcGFyYW0gIFdha2VVcENsb2NrIFdha2UgdXAgY2xvY2sKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DTE9DSyhXYWtlVXBDbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DT1VOVEVSKFdha2VVcENvdW50ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIERpc2FibGUgdGhlIFdha2UtVXAgdGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZyBXYWtlLVVwICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIC8qIFBvbGwgV1VUV0YgdW50aWwgaXQgaXMgc2V0IGluIFJUQ19JQ1NSIHRvIG1ha2Ugc3VyZSB0aGUgYWNjZXNzIHRvIHdha2V1cCBhdXRvcmVsb2FkCisgICAgIGNvdW50ZXIgYW5kIHRvIFdVQ0tTRUxbMjowXSBiaXRzIGlzIGFsbG93ZWQuIFRoaXMgc3RlcCBtdXN0IGJlIHNraXBwZWQgaW4KKyAgICAgY2FsZW5kYXIgaW5pdGlhbGl6YXRpb24gbW9kZS4gKi8KKyAgaWYgKFJFQURfQklUKFJUQy0+SUNTUiwgUlRDX0lDU1JfSU5JVEYpID09IDBVKQorICB7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFdha2V1cCBUaW1lciBjb3VudGVyICovCisgIGhydGMtPkluc3RhbmNlLT5XVVRSID0gKHVpbnQzMl90KVdha2VVcENvdW50ZXI7CisKKyAgLyogQ2xlYXIgdGhlIFdha2V1cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVdha2VVcENsb2NrOworCisgIC8qIFJUQyBXYWtlVXBUaW1lciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgSW50ZXJydXB0IGluIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVChocnRjLFJUQ19JVF9XVVQpOworCisgIC8qIEVuYWJsZSB0aGUgV2FrZXVwIFRpbWVyICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgd2FrZSB1cCB0aW1lciBjb3VudGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVdha2VVcFRpbWVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBEaXNhYmxlIHRoZSBXYWtldXAgVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKGhydGMsUlRDX0lUX1dVVCk7CisKKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMFUpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2FrZSB1cCB0aW1lciBjb3VudGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgY291bnRlciB2YWx1ZSAqLworICByZXR1cm4gKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPldVVFIgJiBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFdBS0VVUFRJTUVSIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgV0FLRVVQVElNRVIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKTsKKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgV2FrZVVwVGltZXJFdmVudCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgLyogV0FLRVVQVElNRVIgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdha2UgVXAgVGltZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBQb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yV2FrZVVwVGltZXJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VURikgPT0gMFUpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBGbGFnICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBXcml0ZSBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyCisgICAgICAoKykgUmVhZCBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyCisgICAgICAoKykgU2V0IHRoZSBDb2Fyc2UgY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICgrKSBEZWFjdGl2YXRlIHRoZSBDb2Fyc2UgY2FsaWJyYXRpb24gcGFyYW1ldGVycworICAgICAgKCspIFNldCB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBTeW5jaHJvbml6YXRpb24gU2hpZnQgQ29udHJvbCBTZXR0aW5ncy4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIENhbGlicmF0aW9uIFBpbm91dCAoUlRDX0NBTElCKSBTZWxlY3Rpb24gKDFIeiBvciA1MTJIeikuCisgICAgICAoKykgRGVhY3RpdmF0ZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgICAgICgrKSBFbmFibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAgICAgKCspIERpc2FibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAgICAgKCspIEVuYWJsZSB0aGUgQnlwYXNzIFNoYWRvdyBmZWF0dXJlLgorICAgICAgKCspIERpc2FibGUgdGhlIEJ5cGFzcyBTaGFkb3cgZmVhdHVyZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBTbW9vdGggY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgKiBAbm90ZSAgIFRvIGRlYWN0aXZhdGUgdGhlIHNtb290aCBjYWxpYnJhdGlvbiwgdGhlIGZpZWxkIFNtb290aENhbGliUGx1c1B1bHNlcworICAqICAgICAgICAgbXVzdCBiZSBlcXVhbCB0byBTTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1JFU0VUIGFuZCB0aGUgZmllbGQKKyAgKiAgICAgICAgIFNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSBtdXN0IGJlIGVxdWFsIHRvIDAuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFNtb290aENhbGliUGVyaW9kIFNlbGVjdCB0aGUgU21vb3RoIENhbGlicmF0aW9uIFBlcmlvZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyA6CisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzMyU0VDOiBUaGUgc21vb3RoIGNhbGlicmF0aW9uIHBlcmlvZCBpcyAzMnMuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzE2U0VDOiBUaGUgc21vb3RoIGNhbGlicmF0aW9uIHBlcmlvZCBpcyAxNnMuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzhTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDhzLgorICAqIEBwYXJhbSAgU21vb3RoQ2FsaWJQbHVzUHVsc2VzIFNlbGVjdCB0byBTZXQgb3IgcmVzZXQgdGhlIENBTFAgYml0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19TRVQ6IEFkZCBvbmUgUlRDQ0xLIHB1bHNlIGV2ZXJ5IDIqMTEgcHVsc2VzLgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQ6IE5vIFJUQ0NMSyBwdWxzZXMgYXJlIGFkZGVkLgorICAqIEBwYXJhbSAgU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlIFNlbGVjdCB0aGUgdmFsdWUgb2YgQ0FMTVs4OjBdIGJpdHMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBhbnkgdmFsdWUgZnJvbSAwIHRvIDB4MDAwMDAxRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U21vb3RoQ2FsaWIoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IFNtb290aENhbGliUGVyaW9kLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMsIHVpbnQzMl90IFNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfU01PT1RIX0NBTElCX1BFUklPRChTbW9vdGhDYWxpYlBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9QTFVTKFNtb290aENhbGliUGx1c1B1bHNlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9NSU5VUyhTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIGNoZWNrIGlmIGEgY2FsaWJyYXRpb24gaXMgcGVuZGluZyovCisgIGlmKChocnRjLT5JbnN0YW5jZS0+SUNTUiAmIFJUQ19JQ1NSX1JFQ0FMUEYpICE9IDBVKQorICB7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIGNoZWNrIGlmIGEgY2FsaWJyYXRpb24gaXMgcGVuZGluZyovCisgICAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JQ1NSICYgUlRDX0lDU1JfUkVDQUxQRikgIT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBTbW9vdGggY2FsaWJyYXRpb24gc2V0dGluZ3MgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNBTFIgPSAodWludDMyX3QpKCh1aW50MzJfdClTbW9vdGhDYWxpYlBlcmlvZCB8ICh1aW50MzJfdClTbW9vdGhDYWxpYlBsdXNQdWxzZXMgfCAodWludDMyX3QpU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFN5bmNocm9uaXphdGlvbiBTaGlmdCBDb250cm9sIFNldHRpbmdzLgorICAqIEBub3RlICAgV2hlbiBSRUZDS09OIGlzIHNldCwgZmlybXdhcmUgbXVzdCBub3Qgd3JpdGUgdG8gU2hpZnQgY29udHJvbCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgU2hpZnRBZGQxUyBTZWxlY3QgdG8gYWRkIG9yIG5vdCAxIHNlY29uZCB0byB0aGUgdGltZSBjYWxlbmRhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NISUZUQUREMVNfU0VUOiBBZGQgb25lIHNlY29uZCB0byB0aGUgY2xvY2sgY2FsZW5kYXIuCisgICogICAgICAgICAgICAgQGFyZyBSVENfU0hJRlRBREQxU19SRVNFVDogTm8gZWZmZWN0LgorICAqIEBwYXJhbSAgU2hpZnRTdWJGUyBTZWxlY3QgdGhlIG51bWJlciBvZiBTZWNvbmQgRnJhY3Rpb25zIHRvIHN1YnN0aXR1dGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBhbnkgdmFsdWUgZnJvbSAwIHRvIDB4N0ZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRTeW5jaHJvU2hpZnQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IFNoaWZ0QWRkMVMsIHVpbnQzMl90IFNoaWZ0U3ViRlMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NISUZUX0FERDFTKFNoaWZ0QWRkMVMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TSElGVF9TVUJGUyhTaGlmdFN1YkZTKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBzaGlmdCBpcyBjb21wbGV0ZWQqLworICAgIHdoaWxlKChocnRjLT5JbnN0YW5jZS0+SUNTUiAmIFJUQ19JQ1NSX1NIUEYpICE9IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiBpcyBkaXNhYmxlZCAqLworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfUkVGQ0tPTikgPT0gMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBTaGlmdCBzZXR0aW5ncyAqLworICAgICAgaHJ0Yy0+SW5zdGFuY2UtPlNISUZUUiA9ICh1aW50MzJfdCkodWludDMyX3QpKFNoaWZ0U3ViRlMpIHwgKHVpbnQzMl90KShTaGlmdEFkZDFTKTsKKworICAgICAgLyogSWYgIFJUQ19DUl9CWVBTSEFEIGJpdCA9IDAsIHdhaXQgZm9yIHN5bmNocm8gZWxzZSB0aGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgICB7CisgICAgICAgIGlmKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsaWJPdXRwdXQgU2VsZWN0IHRoZSBDYWxpYnJhdGlvbiBvdXRwdXQgU2VsZWN0aW9uIC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0NBTElCT1VUUFVUXzUxMkhaOiBBIHNpZ25hbCBoYXMgYSByZWd1bGFyIHdhdmVmb3JtIGF0IDUxMkh6LgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0NBTElCT1VUUFVUXzFIWjogQSBzaWduYWwgaGFzIGEgcmVndWxhciB3YXZlZm9ybSBhdCAxSHouCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0Q2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IENhbGliT3V0cHV0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0NBTElCX09VVFBVVChDYWxpYk91dHB1dCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgYmVmb3JlIGNvbmZpZyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfQ09TRUw7CisKKyAgLyogQ29uZmlndXJlIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClDYWxpYk91dHB1dDsKKworICBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZUNhbGlicmF0aW9uT3V0UHV0KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRElTQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0UmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIEVudGVyIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgc3RhdHVzID0gUlRDX0VudGVySW5pdE1vZGUoaHJ0Yyk7CisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgY2xvY2tyZWYgZGV0ZWN0aW9uICovCisgICAgX19IQUxfUlRDX0NMT0NLUkVGX0RFVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBzdGF0dXMgPSBSVENfRXhpdEluaXRNb2RlKGhydGMpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlUmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIEVudGVyIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgc3RhdHVzID0gUlRDX0VudGVySW5pdE1vZGUoaHJ0Yyk7CisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBjbG9ja3JlZiBkZXRlY3Rpb24gKi8KKyAgICBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBzdGF0dXMgPSBSVENfRXhpdEluaXRNb2RlKGhydGMpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICogQG5vdGUgICBXaGVuIHRoZSBCeXBhc3MgU2hhZG93IGlzIGVuYWJsZWQgdGhlIGNhbGVuZGFyIHZhbHVlIGFyZSB0YWtlbgorICAqICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgQ2FsZW5kYXIgY291bnRlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0VuYWJsZUJ5cGFzc1NoYWRvdyhSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBTZXQgdGhlIEJZUFNIQUQgYml0ICovCisgIGhydGMtPkluc3RhbmNlLT5DUiB8PSAodWludDhfdClSVENfQ1JfQllQU0hBRDsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICogQG5vdGUgICBXaGVuIHRoZSBCeXBhc3MgU2hhZG93IGlzIGVuYWJsZWQgdGhlIGNhbGVuZGFyIHZhbHVlIGFyZSB0YWtlbgorICAqICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgQ2FsZW5kYXIgY291bnRlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0Rpc2FibGVCeXBhc3NTaGFkb3coUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogUmVzZXQgdGhlIEJZUFNIQUQgYml0ICovCisgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQ4X3QpflJUQ19DUl9CWVBTSEFEKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUlRDIEFsYXJtIEIgY2FsbGJhY2sKKyAgICAgICgrKSBSVEMgUG9sbCBmb3IgQWxhcm0gQiByZXF1ZXN0CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQWxhcm0gQiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBbGFybSBCIFBvbGxpbmcgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckFsYXJtQkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRikgPT0gMFUpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBBbGFybSBGbGFnICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNQorICAqIEBicmllZiAgICAgIEV4dGVuZGVkIFJUQyBUYW1wZXIgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUYW1wZXIgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAoKykgQmVmb3JlIGNhbGxpbmcgYW55IHRhbXBlciBvciBpbnRlcm5hbCB0YW1wZXIgZnVuY3Rpb24sIHlvdSBoYXZlIHRvIGNhbGwgZmlyc3QKKyAgICAgICBIQUxfUlRDX0luaXQoKSBmdW5jdGlvbi4KKyAgICgrKSBJbiB0aGF0IGluZSB5b3UgY2FuIHNlbGVjdCB0byBvdXRwdXQgdGFtcGVyIGV2ZW50IG9uIFJUQyBwaW4uCisgIFsuLl0KKyAgICgrKSBFbmFibGUgdGhlIFRhbXBlciBhbmQgY29uZmlndXJlIHRoZSBUYW1wZXIgZmlsdGVyIGNvdW50LCB0cmlnZ2VyIEVkZ2UKKyAgICAgICBvciBMZXZlbCBhY2NvcmRpbmcgdG8gdGhlIFRhbXBlciBmaWx0ZXIgKGlmIGVxdWFsIHRvIDAgRWRnZSBlbHNlIExldmVsKQorICAgICAgIHZhbHVlLCBzYW1wbGluZyBmcmVxdWVuY3ksIE5vRXJhc2UsIE1hc2tGbGFnLCBwcmVjaGFyZ2Ugb3IgZGlzY2hhcmdlIGFuZAorICAgICAgIFB1bGwtVVAsIHRpbWVzdGFtcCB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFRhbXBlcigpIGZ1bmN0aW9uLgorICAgICAgIFlvdSBjYW4gY29uZmlndXJlIFRhbXBlciB3aXRoIGludGVycnVwdCBtb2RlIHVzaW5nIEhBTF9SVENFeF9TZXRUYW1wZXJfSVQoKSBmdW5jdGlvbi4KKyAgICgrKSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBUYW1wZXIgZXJhc2VzIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiBUbyBhdm9pZAorICAgICAgIGVyYXNlLCBlbmFibGUgdGhlIE5vRXJhc2UgZmllbGQgb24gdGhlIFRBTVBfVEFNUENSIHJlZ2lzdGVyLgorICBbLi5dCisgICAoKykgRW5hYmxlIEludGVybmFsIFRhbXBlciBhbmQgY29uZmlndXJlIGl0IHdpdGggaW50ZXJydXB0LCB0aW1lc3RhbXAgdXNpbmcKKyAgICAgICB0aGUgSEFMX1JUQ0V4X1NldEludGVybmFsVGFtcGVyKCkgZnVuY3Rpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNUYW1wZXIgUG9pbnRlciB0byBUYW1wZXIgU3RydWN0dXJlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX1RhbXBlclR5cGVEZWYqIHNUYW1wZXIpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgLyogUHJvY2VzcyBUQU1QIGluc3RhbmNlIHBvaW50ZXIgKi8KKyAgVEFNUF9UeXBlRGVmICp0YW1wID0gKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpaHJ0Yy0+SW5zdGFuY2UgKyBocnRjLT5UYW1wT2Zmc2V0KTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUihzVGFtcGVyLT5UYW1wZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfVFJJR0dFUihzVGFtcGVyLT5UcmlnZ2VyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX0VSQVNFX01PREUoc1RhbXBlci0+Tm9FcmFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9NQVNLRkxBR19TVEFURShzVGFtcGVyLT5NYXNrRmxhZykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9GSUxURVIoc1RhbXBlci0+RmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVEoc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OKHNUYW1wZXItPlByZWNoYXJnZUR1cmF0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1BVTExVUF9TVEFURShzVGFtcGVyLT5UYW1wZXJQdWxsVXApKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OKHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSk7CisKKyAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAyICovCisgIHRtcHJlZyA9IHRhbXAtPkNSMjsKKyAgdG1wcmVnICY9IH4oKHNUYW1wZXItPlRhbXBlciA8PCAyNCkgfCAoc1RhbXBlci0+VGFtcGVyIDw8IDE2KSB8IChzVGFtcGVyLT5UYW1wZXIpKTsKKworICBpZihzVGFtcGVyLT5UcmlnZ2VyICE9IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpCisgIHsKKyAgICB0bXByZWcgfD0gKHNUYW1wZXItPlRhbXBlciA8PCAyNCk7CisgIH0KKworICBpZihzVGFtcGVyLT5NYXNrRmxhZyAhPSBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUpCisgIHsKKyAgICB0bXByZWcgfD0gKHNUYW1wZXItPlRhbXBlciA8PCAxNik7CisgIH0KKworICBpZihzVGFtcGVyLT5Ob0VyYXNlICE9IFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRSkKKyAgeworICAgIHRtcHJlZyB8PSBzVGFtcGVyLT5UYW1wZXI7CisgIH0KKyAgdGFtcC0+Q1IyID0gdG1wcmVnOworCisgIC8qIEZpbHRlciBjb250cm9sIHJlZ2lzdGVyICovCisgIHRhbXAtPkZMVENSID0gKHNUYW1wZXItPkZpbHRlcikgfCAoc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kpIHwgXAorICAgICAgICAgICAgICAgICAoc1RhbXBlci0+UHJlY2hhcmdlRHVyYXRpb24pIHwgKHNUYW1wZXItPlRhbXBlclB1bGxVcCk7CisKKyAgLyogdGltZXN0YW1wIG9uIHRhbXBlciAqLworICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX1RBTVBUUykgIT0gKHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSkKKyAgeworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAgICB0bXByZWcgPSAoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgflJUQ19DUl9UQU1QVFMpOworICAgIGhydGMtPkluc3RhbmNlLT5DUiA9ICh0bXByZWcgfCAoc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pKTsKKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgfQorCisgIC8qIENvbnRyb2wgcmVnaXN0ZXIgMSAqLworICB0YW1wLT5DUjEgfD0gKHNUYW1wZXItPlRhbXBlcik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUYW1wZXIgaW4gSVQgbW9kZQorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzVGFtcGVyIFBvaW50ZXIgdG8gVGFtcGVyIFN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUYW1wZXJfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UYW1wZXJUeXBlRGVmKiBzVGFtcGVyKQoreworICB1aW50MzJfdCB0bXByZWc7CisgIC8qIFByb2Nlc3MgVEFNUCBpbnN0YW5jZSBwb2ludGVyICovCisgIFRBTVBfVHlwZURlZiAqdGFtcCA9IChUQU1QX1R5cGVEZWYgKikoKHVpbnQzMl90KWhydGMtPkluc3RhbmNlICsgaHJ0Yy0+VGFtcE9mZnNldCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVIoc1RhbXBlci0+VGFtcGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RSSUdHRVIoc1RhbXBlci0+VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9FUkFTRV9NT0RFKHNUYW1wZXItPk5vRXJhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfTUFTS0ZMQUdfU1RBVEUoc1RhbXBlci0+TWFza0ZsYWcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfRklMVEVSKHNUYW1wZXItPkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9TQU1QTElOR19GUkVRKHNUYW1wZXItPlNhbXBsaW5nRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoc1RhbXBlci0+VGFtcGVyUHVsbFVwKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpOworCisgIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMiAqLworICB0bXByZWcgPSB0YW1wLT5DUjI7CisgIHRtcHJlZyAmPSB+KChzVGFtcGVyLT5UYW1wZXIgPDwgMjQpIHwgKHNUYW1wZXItPlRhbXBlciA8PCAxNikgfCAoc1RhbXBlci0+VGFtcGVyKSk7CisKKyAgaWYoc1RhbXBlci0+VHJpZ2dlciAhPSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFKQorICB7CisgICAgdG1wcmVnIHw9IChzVGFtcGVyLT5UYW1wZXIgPDwgMjQpOworICB9CisKKyAgaWYoc1RhbXBlci0+TWFza0ZsYWcgIT0gUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFKQorICB7CisgICAgdG1wcmVnIHw9IChzVGFtcGVyLT5UYW1wZXIgPDwgMTYpOworICB9CisKKyAgaWYoc1RhbXBlci0+Tm9FcmFzZSAhPSBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9FTkFCTEUpCisgIHsKKyAgICB0bXByZWcgfD0gc1RhbXBlci0+VGFtcGVyOworICB9CisgIHRhbXAtPkNSMiA9IHRtcHJlZzsKKworICAvKiBGaWx0ZXIgY29udHJvbCByZWdpc3RlciAqLworICB0YW1wLT5GTFRDUiA9IChzVGFtcGVyLT5GaWx0ZXIpIHwgKHNUYW1wZXItPlNhbXBsaW5nRnJlcXVlbmN5KSB8IFwKKyAgICAgICAgICAgICAgICAgKHNUYW1wZXItPlByZWNoYXJnZUR1cmF0aW9uKSB8IChzVGFtcGVyLT5UYW1wZXJQdWxsVXApOworCisgIC8qIHRpbWVzdGFtcCBvbiB0YW1wZXIgKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9UQU1QVFMpICE9IChzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpCisgIHsKKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgICAgdG1wcmVnID0gKGhydGMtPkluc3RhbmNlLT5DUiAmIH5SVENfQ1JfVEFNUFRTKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodG1wcmVnIHwgKHNUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSk7CisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgIH0KKworICAvKiBSVEMgVGFtcGVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9FWFRJX0VOQUJMRV9JVCgpOworCisgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKyAgdGFtcC0+SUVSIHw9IHNUYW1wZXItPlRhbXBlcjsKKworICAvKiBDb250cm9sIHJlZ2lzdGVyIDEgKi8KKyAgdGFtcC0+Q1IxIHw9IChzVGFtcGVyLT5UYW1wZXIpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgVGFtcGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUYW1wZXIgU2VsZWN0ZWQgdGFtcGVyIHBpbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBSVENfVEFNUEVSXzEKKyAgKiAgICAgICAgIEBhcmcgUlRDX1RBTVBFUl8yCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGFtcGVyKQoreworICAvKiBQcm9jZXNzIFRBTVAgaW5zdGFuY2UgcG9pbnRlciAqLworICBUQU1QX1R5cGVEZWYgKnRhbXAgPSAoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdClocnRjLT5JbnN0YW5jZSArIGhydGMtPlRhbXBPZmZzZXQpOworCisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSKFRhbXBlcikpOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFRhbXBlciBwaW4gKi8KKyAgdGFtcC0+Q1IxICY9IH5UYW1wZXI7CisKKyAgLyogQ2xlYXIgdGFtcGVyIG1hc2svbm9lcmFzZS90cmlnZ2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgdGFtcC0+Q1IyICY9IH4oKFRhbXBlciA8PCAyNCkgfCAoVGFtcGVyIDw8IDE2KSB8IFRhbXBlcik7CisKKyAgLyogQ2xlYXIgdGFtcGVyIGludGVycnVwdCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgdGFtcC0+SUVSICY9IH5UYW1wZXI7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciBldmVudCBwb2xsaW5nLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBUYW1wZXIgU2VsZWN0ZWQgdGFtcGVyIHBpbi4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBSVENfVEFNUEVSXzEKKyAgKiAgICAgICAgIEBhcmcgUlRDX1RBTVBFUl8yCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRhbXBlciwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogUHJvY2VzcyBUQU1QIGluc3RhbmNlIHBvaW50ZXIgKi8KKyAgVEFNUF9UeXBlRGVmICp0YW1wID0gKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpaHJ0Yy0+SW5zdGFuY2UgKyBocnRjLT5UYW1wT2Zmc2V0KTsKKworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUihUYW1wZXIpKTsKKworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoKHRhbXAtPlNSICYgVGFtcGVyKSAhPSBUYW1wZXIpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIHRhbXAtPlNDUiA9IFRhbXBlcjsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgU2V0IEludGVybmFsIFRhbXBlciBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBzSW50VGFtcGVyIFBvaW50ZXIgdG8gSW50ZXJuYWwgVGFtcGVyIFN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRJbnRlcm5hbFRhbXBlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0ludGVybmFsVGFtcGVyVHlwZURlZiogc0ludFRhbXBlcikKK3sKKyAgLyogUHJvY2VzcyBUQU1QIGluc3RhbmNlIHBvaW50ZXIgKi8KKyAgVEFNUF9UeXBlRGVmICp0YW1wID0gKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpaHJ0Yy0+SW5zdGFuY2UgKyBocnRjLT5UYW1wT2Zmc2V0KTsKKworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19JTlRFUk5BTF9UQU1QRVIoc0ludFRhbXBlci0+SW50VGFtcGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihzSW50VGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpOworCisgIC8qIHRpbWVzdGFtcCBvbiBpbnRlcm5hbCB0YW1wZXIgKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9UQU1QVFMpICE9IChzSW50VGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpCisgIHsKKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgICAgdG1wcmVnID0gKGhydGMtPkluc3RhbmNlLT5DUiAmIH5SVENfQ1JfVEFNUFRTKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodG1wcmVnIHwgKHNJbnRUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSk7CisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgIH0KKworICAvKiBDb250cm9sIHJlZ2lzdGVyIDEgKi8KKyAgdGFtcC0+Q1IxIHw9IChzSW50VGFtcGVyLT5JbnRUYW1wZXIpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBTZXQgSW50ZXJuYWwgVGFtcGVyCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHNJbnRUYW1wZXIgUG9pbnRlciB0byBJbnRlcm5hbCBUYW1wZXIgU3RydWN0dXJlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldEludGVybmFsVGFtcGVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfSW50ZXJuYWxUYW1wZXJUeXBlRGVmKiBzSW50VGFtcGVyKQoreworICAvKiBQcm9jZXNzIFRBTVAgaW5zdGFuY2UgcG9pbnRlciAqLworICBUQU1QX1R5cGVEZWYgKnRhbXAgPSAoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdClocnRjLT5JbnN0YW5jZSArIGhydGMtPlRhbXBPZmZzZXQpOworCisgIHVpbnQzMl90IHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0lOVEVSTkFMX1RBTVBFUihzSW50VGFtcGVyLT5JbnRUYW1wZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfVElNRVNUQU1QT05UQU1QRVJfREVURUNUSU9OKHNJbnRUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSk7CisKKyAgLyogdGltZXN0YW1wIG9uIGludGVybmFsIHRhbXBlciAqLworICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX1RBTVBUUykgIT0gKHNJbnRUYW1wZXItPlRpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uKSkKKyAgeworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAgICB0bXByZWcgPSAoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgflJUQ19DUl9UQU1QVFMpOworICAgIGhydGMtPkluc3RhbmNlLT5DUiA9ICh0bXByZWcgfCAoc0ludFRhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pKTsKKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKyAgfQorCisgIC8qIFJUQyBUYW1wZXIgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICBfX0hBTF9SVENfVEFNUEVSX0VYVElfRU5BQkxFX0lUKCk7CisKKyAgLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworICB0YW1wLT5JRVIgfD0gc0ludFRhbXBlci0+SW50VGFtcGVyOworCisgIC8qIENvbnRyb2wgcmVnaXN0ZXIgMSAqLworICB0YW1wLT5DUjEgfD0gKHNJbnRUYW1wZXItPkludFRhbXBlcik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIEludGVybmFsIFRhbXBlci4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgSW50VGFtcGVyIFNlbGVjdGVkIGludGVybmFsIHRhbXBlciBldmVudC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIGV4aXN0aW5nIGludGVybmFsIHRhbXBlcnMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZUludGVybmFsVGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBJbnRUYW1wZXIpCit7CisgIC8qIFByb2Nlc3MgVEFNUCBpbnN0YW5jZSBwb2ludGVyICovCisgIFRBTVBfVHlwZURlZiAqdGFtcCA9IChUQU1QX1R5cGVEZWYgKikoKHVpbnQzMl90KWhydGMtPkluc3RhbmNlICsgaHJ0Yy0+VGFtcE9mZnNldCk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19JTlRFUk5BTF9UQU1QRVIoSW50VGFtcGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgVGFtcGVyIHBpbiAqLworICB0YW1wLT5DUjEgJj0gfkludFRhbXBlcjsKKworICAvKiBDbGVhciBpbnRlcm5hbCB0YW1wZXIgaW50ZXJydXB0IG1vZGUgY29uZmlndXJhdGlvbiAqLworICB0YW1wLT5JRVIgJj0gfkludFRhbXBlcjsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgSW50ZXJuYWwgVGFtcGVyIGV2ZW50IHBvbGxpbmcuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIEludFRhbXBlciBzZWxlY3RlZCB0YW1wZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBleGlzdGluZyBpbnRlcm5hbCB0YW1wZXJzLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckludGVybmFsVGFtcGVyRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEludFRhbXBlciwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogUHJvY2VzcyBUQU1QIGluc3RhbmNlIHBvaW50ZXIgKi8KKyAgVEFNUF9UeXBlRGVmICp0YW1wID0gKFRBTVBfVHlwZURlZiAqKSgodWludDMyX3QpaHJ0Yy0+SW5zdGFuY2UgKyBocnRjLT5UYW1wT2Zmc2V0KTsKKworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0lOVEVSTkFMX1RBTVBFUihJbnRUYW1wZXIpKTsKKworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoKHRhbXAtPlNSICYgSW50VGFtcGVyKSAhPSBJbnRUYW1wZXIpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFRhbXBlciBGbGFnICovCisgIHRhbXAtPlNDUiA9IEludFRhbXBlcjsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRhbXBlciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfVGFtcGVySVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgdWludDMyX3QgdG1wOworICAvKiBQcm9jZXNzIFRBTVAgaW5zdGFuY2UgcG9pbnRlciAqLworICBUQU1QX1R5cGVEZWYgKnRhbXAgPSAoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdClocnRjLT5JbnN0YW5jZSArIGhydGMtPlRhbXBPZmZzZXQpOworCisgIC8qIEdldCBpbnRlcnJ1cHQgc3RhdHVzICovCisgIHRtcCA9IHRhbXAtPk1JU1I7CisKKyAgLyogSW1tZWRpYXRseSBjbGVhciBmbGFncyAqLworICB0YW1wLT5TQ1IgPSB0bXA7CisKKyAgLyogQ2hlY2sgVGFtcGVyMSBzdGF0dXMgKi8KKyAgaWYoKHRtcCAmIFJUQ19UQU1QRVJfMSkgPT0gUlRDX1RBTVBFUl8xKQorICB7CisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCBUYW1wZXIgMSBFdmVudCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5UYW1wZXIxRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgLyogVGFtcGVyMSBjYWxsYmFjayAqLworICAgIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIENoZWNrIFRhbXBlcjIgc3RhdHVzICovCisgIGlmKCh0bXAgJiBSVENfVEFNUEVSXzIpID09IFJUQ19UQU1QRVJfMikKKyAgeworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgVGFtcGVyIDIgRXZlbnQgcmVnaXN0ZXJlZCBDYWxsYmFjayAqLworICAgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgIC8qIFRhbXBlcjIgY2FsbGJhY2sgKi8KKyAgICBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworCisgIC8qIENoZWNrIEludGVybmFsIFRhbXBlcjMgc3RhdHVzICovCisgIGlmKCh0bXAgJiBSVENfSU5UX1RBTVBFUl8zKSA9PSBSVENfSU5UX1RBTVBFUl8zKQorICB7CisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCBJbnRlcm5hbCBUYW1wZXIgMyBFdmVudCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAvKiBJbnRlcm5hbCBUYW1wZXIzIGNhbGxiYWNrICovCisgICAgSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyM0V2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBDaGVjayBJbnRlcm5hbCBUYW1wZXI0IHN0YXR1cyAqLworICBpZigodG1wICYgUlRDX0lOVF9UQU1QRVJfNCkgPT0gUlRDX0lOVF9UQU1QRVJfNCkKKyAgeworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgSW50ZXJuYWwgVGFtcGVyIDQgRXZlbnQgcmVnaXN0ZXJlZCBDYWxsYmFjayAqLworICAgICAgaHJ0Yy0+SW50ZXJuYWxUYW1wZXI0RXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgLyogSW50ZXJuYWwgVGFtcGVyNCBjYWxsYmFjayAqLworICAgIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjRFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogQ2hlY2sgSW50ZXJuYWwgVGFtcGVyNSBzdGF0dXMgKi8KKyAgaWYoKHRtcCAmIFJUQ19JTlRfVEFNUEVSXzUpID09IFJUQ19JTlRfVEFNUEVSXzUpCisgIHsKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIEludGVybmFsIFRhbXBlciA1IEV2ZW50IHJlZ2lzdGVyZWQgQ2FsbGJhY2sgKi8KKyAgICAgIGhydGMtPkludGVybmFsVGFtcGVyNUV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgIC8qIEludGVybmFsIFRhbXBlcjUgY2FsbGJhY2sgKi8KKyAgICBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXI1RXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIENoZWNrIEludGVybmFsIFRhbXBlcjYgc3RhdHVzICovCisgIGlmKCh0bXAgJiBSVENfSU5UX1RBTVBFUl82KSA9PSBSVENfSU5UX1RBTVBFUl82KQorICB7CisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCBJbnRlcm5hbCBUYW1wZXIgNiBFdmVudCByZWdpc3RlcmVkIENhbGxiYWNrICovCisgICAgICBocnRjLT5JbnRlcm5hbFRhbXBlcjZFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAvKiBJbnRlcm5hbCBUYW1wZXI2IGNhbGxiYWNrICovCisgICAgSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyNkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworfQorCisKKy8qKgorICAqIEBicmllZiAgVGFtcGVyIDEgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgVGFtcGVyIDIgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKworCisvKioKKyAgKiBAYnJpZWYgIEludGVybmFsIFRhbXBlciAzIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXIzRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjNFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQGJyaWVmICBJbnRlcm5hbCBUYW1wZXIgNCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyNEV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXI0RXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgSW50ZXJuYWwgVGFtcGVyIDUgY2FsbGJhY2suCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjVFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X0ludGVybmFsVGFtcGVyNUV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEludGVybmFsIFRhbXBlciA2IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfSW50ZXJuYWxUYW1wZXI2RXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9JbnRlcm5hbFRhbXBlcjZFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA2CisgICogQGJyaWVmICAgICAgRXh0ZW5kZWQgUlRDIEJhY2t1cCByZWdpc3RlciBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBSVEMgQmFja3VwIHJlZ2lzdGVyIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICgrKSBCZWZvcmUgY2FsbGluZyBhbnkgdGFtcGVyIG9yIGludGVybmFsIHRhbXBlciBmdW5jdGlvbiwgeW91IGhhdmUgdG8gY2FsbCBmaXJzdAorICAgICAgIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorICAgKCspIEluIHRoYXQgaW5lIHlvdSBjYW4gc2VsZWN0IHRvIG91dHB1dCB0YW1wZXIgZXZlbnQgb24gUlRDIHBpbi4KKyAgWy4uXQorICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgKCspIFdyaXRlIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKKyAgICgrKSBSZWFkIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIGRhdGEgaW4gYSBzcGVjaWZpZWQgUlRDIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlcjogUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyIG51bWJlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFJUQ19CS1BfRFJ4IHdoZXJlIHggY2FuIGJlIGZyb20gMCB0byA0CisgICogICAgICAgICAgc3BlY2lmeSB0aGUgcmVnaXN0ZXIuCisgICogQHBhcmFtICBEYXRhIERhdGEgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIEJhY2t1cCBkYXRhIHJlZ2lzdGVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDRXhfQktVUFdyaXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlciwgdWludDMyX3QgRGF0YSkKK3sKKyAgdWludDMyX3QgdG1wOworICAvKiBQcm9jZXNzIFRBTVAgaW5zdGFuY2UgcG9pbnRlciAqLworICBUQU1QX1R5cGVEZWYgKnRhbXAgPSAoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdClocnRjLT5JbnN0YW5jZSArIGhydGMtPlRhbXBPZmZzZXQpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KSYodGFtcC0+QktQMFIpOworICB0bXAgKz0gKEJhY2t1cFJlZ2lzdGVyICogNFUpOworCisgIC8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKi8KKyAgKihfX0lPIHVpbnQzMl90ICopdG1wID0gKHVpbnQzMl90KURhdGE7Cit9CisKKworLyoqCisgICogQGJyaWVmICBSZWFkcyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIuCisgICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIEJhY2t1cFJlZ2lzdGVyICBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIgbnVtYmVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBSVENfQktQX0RSeCB3aGVyZSB4IGNhbiBiZSBmcm9tIDAgdG8gNAorICAqICAgICAgICAgc3BlY2lmeSB0aGUgcmVnaXN0ZXIuCisgICogQHJldHZhbCBSZWFkIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfQktVUFJlYWQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEJhY2t1cFJlZ2lzdGVyKQoreworICB1aW50MzJfdCB0bXAgOworICAvKiBQcm9jZXNzIFRBTVAgaW5zdGFuY2UgcG9pbnRlciAqLworICBUQU1QX1R5cGVEZWYgKnRhbXAgPSAoVEFNUF9UeXBlRGVmICopKCh1aW50MzJfdClocnRjLT5JbnN0YW5jZSArIGhydGMtPlRhbXBPZmZzZXQpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KSYodGFtcC0+QktQMFIpOworICB0bXAgKz0gKEJhY2t1cFJlZ2lzdGVyICogNFUpOworCisgIC8qIFJlYWQgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLworICByZXR1cm4gKCooX19JTyB1aW50MzJfdCAqKXRtcCk7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9zbWFydGNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU3YTI4Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkLmMKQEAgLTAsMCArMSwzMDc4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9zbWFydGNhcmQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU01BUlRDQVJEIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgU01BUlRDQVJEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIGhzbWFydGNhcmQpLgorICAgICgjKSBBc3NvY2lhdGUgYSBVU0FSVCB0byB0aGUgU01BUlRDQVJEIGhhbmRsZSBoc21hcnRjYXJkLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TTUFSVENBUkRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVVNBUlQgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0FSVCBHUElPcy4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUIHBpbnMgKFRYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLCBSWCBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gSW5wdXQpLgorICAgICAgICAoKyspIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKSBBUElzKToKKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUIElSUSBoYW5kbGUuCisgICAgICAgICgrKykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9ETUEoKSBBUElzKToKKyAgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZCBUeC9SeCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBTTUFSVENBUkQgRE1BIFR4L1J4IGhhbmRsZS4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgKCMpIFByb2dyYW0gdGhlIEJhdWQgUmF0ZSwgUGFyaXR5LCBNb2RlKFJlY2VpdmVyL1RyYW5zbWl0dGVyKSwgY2xvY2sgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBhY2NvcmRpbmdseSwKKyAgICAgICAgdGhlIGNsb2NrIHBhcmFtZXRlcnMgKHBhcml0eSwgcGhhc2UsIGxhc3QgYml0KSwgcHJlc2NhbGVyIHZhbHVlLCBndWFyZCB0aW1lIGFuZCBOQUNLIG9uIHRyYW5zbWlzc2lvbgorICAgICAgICBlcnJvciBlbmFibGluZyBvciBkaXNhYmxpbmcgaW4gdGhlIGhzbWFydGNhcmQgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIElmIHJlcXVpcmVkLCBwcm9ncmFtIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyAoVFgvUlggcGlucyBzd2FwLCBUaW1lT3V0LCBhdXRvLXJldHJ5IGNvdW50ZXIsLi4uKQorICAgICAgICBpbiB0aGUgaHNtYXJ0Y2FyZCBoYW5kbGUgQWR2YW5jZWRJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9TTUFSVENBUkRfSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBUaGlzIEFQSSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KCkgQVBJLgorICAgICAgICBbLi5dCisgICAgICAgIChAKSBUaGUgc3BlY2lmaWMgU01BUlRDQVJEIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVCgpIGFuZCBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzcy4KKworICAgIFsuLl0KKyAgICBbLi5dIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01BUlRDQVJEX1RyYW5zbWl0KCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfUmVjZWl2ZSgpCisKKyAgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICoqKiBTTUFSVENBUkQgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTTUFSVENBUkQgSEFMIGRyaXZlci4KKworICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcgOiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBmbGFnIGlzIHNldAorICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyA6IENsZWFyIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIHBlbmRpbmcgZmxhZworICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIGludGVycnVwdAorICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRTogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgaW50ZXJydXB0IGlzIGVuYWJsZWQKKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIFNNQVJUQ0FSRCBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKworICAgIFsuLl0KKyAgICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suCisgICAgRnVuY3Rpb24gQHJlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgOiBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgIDogUnggRmlmbyBGdWxsIENhbGxiYWNrLgorICAgICgrKSBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgIDogVHggRmlmbyBFbXB0eSBDYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogU01BUlRDQVJEIE1zcERlSW5pdC4KKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4KKyAgICBAcmVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgOiBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgIDogUnggRmlmbyBGdWxsIENhbGxiYWNrLgorICAgICgrKSBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgIDogVHggRmlmbyBFbXB0eSBDYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogU01BUlRDQVJEIE1zcERlSW5pdC4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfU01BUlRDQVJEX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9TTUFSVENBUkRfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgYW5kIEByZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZIG9yIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9TTUFSVENBUkRfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9TTUFSVENBUkRfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEIFNNQVJUQ0FSRAorICAqIEBicmllZiBIQUwgU01BUlRDQVJEIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfQ29uc3RhbnRzIFNNQVJUQ0FSRCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBTTUFSVENBUkRfVEVBQ0tfUkVBQ0tfVElNRU9VVCAgICAgICAgICAgICAgIDEwMDBVICAgICAgLyohPCBTTUFSVENBUkQgVFggb3IgUlggZW5hYmxlIGFja25vd2xlZGdlIHRpbWUtb3V0IHZhbHVlICAqLworCisjZGVmaW5lIFVTQVJUX0NSMV9GSUVMRFMgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9PVkVSOHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0ZJRk9FTiApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFNNQVJUQ0FSRF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IyX0NMS19GSUVMRFMgICgodWludDMyX3QpKFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUE9MIHwgVVNBUlRfQ1IyX0NQSEEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJDTCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBjbG9jay1yZWxhdGVkIFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyAqLworCisjZGVmaW5lIFVTQVJUX0NSMl9GSUVMRFMgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfUlRPRU4gfCBVU0FSVF9DUjJfQ0xLX0ZJRUxEUyB8IFVTQVJUX0NSMl9TVE9QKSkgICAvKiE8IFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgU01BUlRDQVJEX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9DUjNfRklFTERTICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IzX09ORUJJVCB8IFVTQVJUX0NSM19OQUNLIHwgVVNBUlRfQ1IzX1NDQVJDTlQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHICkpICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIENSMyBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgU01BUlRDQVJEX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUlOICAgIDB4MTBVICAgICAgICAvKiE8IFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUFYICAgIDB4MDAwMEZGRkZVICAvKiE8IFVTQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgU01BUlRDQVJEX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9TZXRDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0FkdkZlYXR1cmVDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9DaGVja0lkbGVTdGF0ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0VuZFR4VHJhbnNmZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0VuZFJ4VHJhbnNmZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9UeElTUihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfVHhJU1JfRklGT0VOKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfUnhJU1IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX1J4SVNSX0ZJRk9FTihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnMgU01BUlRDQVJEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVHgKKyAgYXNzb2NpYXRlZCB0byB0aGUgU21hcnRDYXJkLgorICAoKykgVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFBhcml0eTogcGFyaXR5IHNob3VsZCBiZSBlbmFibGVkLCBmcmFtZSBMZW5ndGggaXMgZml4ZWQgdG8gOCBiaXRzIHBsdXMgcGFyaXR5CisgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisgICAgICAoKyspIFN5bmNocm9ub3VzIG1vZGUgKGFuZCBpZiBlbmFibGVkLCBwaGFzZSwgcG9sYXJpdHkgYW5kIGxhc3QgYml0IHBhcmFtZXRlcnMpCisgICAgICAoKyspIFByZXNjYWxlciB2YWx1ZQorICAgICAgKCsrKSBHdWFyZCBiaXQgdGltZQorICAgICAgKCsrKSBOQUNLIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiB0cmFuc21pc3Npb24gZXJyb3IKKworICAoKykgVGhlIGZvbGxvd2luZyBhZHZhbmNlZCBmZWF0dXJlcyBjYW4gYmUgY29uZmlndXJlZCBhcyB3ZWxsOgorICAgICAgKCsrKSBUWCBhbmQvb3IgUlggcGluIGxldmVsIGludmVyc2lvbgorICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uCisgICAgICAoKyspIFJYIGFuZCBUWCBwaW5zIHN3YXAKKyAgICAgICgrKykgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nCisgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3IKKyAgICAgICgrKykgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZQorICAgICAgKCsrKSBUaW1lIG91dCBlbmFibGluZyAoYW5kIGlmIGFjdGl2YXRlZCwgdGltZW91dCB2YWx1ZSkKKyAgICAgICgrKykgQmxvY2sgbGVuZ3RoCisgICAgICAoKyspIEF1dG8tcmV0cnkgY291bnRlcgorICBbLi5dCisgIFRoZSBIQUxfU01BUlRDQVJEX0luaXQoKSBBUEkgZm9sbG93cyB0aGUgVVNBUlQgc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzCisgIChkZXRhaWxzIGZvciB0aGUgcHJvY2VkdXJlcyBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKworICBUaGUgVVNBUlQgZnJhbWUgZm9ybWF0IGlzIGdpdmVuIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKyAgICBUYWJsZSAxLiBVU0FSVCBmcmFtZSBmb3JtYXQuCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IE0xTTAgYml0cyB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgVVNBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAgMDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGUgU01BUlRDQVJEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc21hcnRjYXJkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIFVTQVJUIGFzc29jaWF0ZWQgdG8gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9JTlNUQU5DRShoc21hcnRjYXJkLT5JbnN0YW5jZSkpOworCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoc21hcnRjYXJkLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgICBTTUFSVENBUkRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChoc21hcnRjYXJkKTsKKworICAgIGlmIChoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9TTUFSVENBUkRfTXNwSW5pdChoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsIHRvIHNldCBzbWFydGNhcmQgbW9kZSAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAvKiBJbiBTbWFydENhcmQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gSERTRUwgYW5kIElSRU4gIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworCisgIC8qIHNldCB0aGUgVVNBUlQgaW4gU01BUlRDQVJEIG1vZGUgKi8KKyAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7CisKKyAgLyogU2V0IHRoZSBTTUFSVENBUkQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChTTUFSVENBUkRfU2V0Q29uZmlnKGhzbWFydGNhcmQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uICovCisgIFNNQVJUQ0FSRF9UUkFOU01JU1NJT05fQ09NUExFVElPTl9TRVRUSU5HKGhzbWFydGNhcmQpOworCisgIGlmIChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFNNQVJUQ0FSRF9BZHZGZWF0dXJlQ29uZmlnKGhzbWFydGNhcmQpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChTTUFSVENBUkRfQ2hlY2tJZGxlU3RhdGUoaHNtYXJ0Y2FyZCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9EZUluaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHRoZSBTTUFSVENBUkQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzbWFydGNhcmQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgVVNBUlQvVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgMHgwVSk7CisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIDB4MFUpOworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJUT1IsIDB4MFUpOworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkdUUFIsIDB4MFUpOworCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisjaWYgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyAgaWYgKGhzbWFydGNhcmQtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhzbWFydGNhcmQtPk1zcERlSW5pdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQoaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICBoc21hcnRjYXJkLT5nU3RhdGUgICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOworICBoc21hcnRjYXJkLT5SeFN0YXRlICAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBNU1AuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIE1TUC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX01zcERlSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgU01BUlRDQVJEIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBzbWFydGNhcmQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfUlhfRklGT19GVUxMX0NCX0lEIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBTTUFSVENBUkRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+VHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9SWF9GSUZPX0ZVTExfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5SeEZpZm9GdWxsQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBTTUFSVENBUkQgY2FsbGJhY2sKKyAgKiAgICAgICAgIFNNQVJUQ0FSRCBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgc21hcnRjYXJkIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfUlhfRklGT19GVUxMX0NCX0lEIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGlmIChIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZID09IGhzbWFydGNhcmQtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5UeENwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5SeENwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9SWF9GSUZPX0ZVTExfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5SeEZpZm9GdWxsQ2FsbGJhY2sgPSBIQUxfU01BUlRDQVJERXhfUnhGaWZvRnVsbENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUID09IGhzbWFydGNhcmQtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFNNQVJUQ0FSRCBUcmFuc21pdCBhbmQgUmVjZWl2ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU01BUlRDQVJEIGRhdGEgdHJhbnNmZXJzLgorCisgIFsuLl0KKyAgICBTbWFydGNhcmQgaXMgYSBzaW5nbGUgd2lyZSBoYWxmIGR1cGxleCBjb21tdW5pY2F0aW9uIHByb3RvY29sLgorICAgIFRoZSBTbWFydGNhcmQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgYXN5bmNocm9ub3VzIHByb3RvY29sIFNtYXJ0Y2FyZHMgYXMKKyAgICBkZWZpbmVkIGluIHRoZSBJU08gNzgxNi0zIHN0YW5kYXJkLiBUaGUgVVNBUlQgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXM6CisgICAgKCspIDggYml0cyBwbHVzIHBhcml0eTogd2hlcmUgTT0xIGFuZCBQQ0U9MSBpbiB0aGUgVVNBUlRfQ1IxIHJlZ2lzdGVyCisgICAgKCspIDEuNSBzdG9wIGJpdHMgd2hlbiB0cmFuc21pdHRpbmcgYW5kIHJlY2VpdmluZzogd2hlcmUgU1RPUD0xMSBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLgorCisgIFsuLl0KKyAgICAoKykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICAgKCsrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgICgrKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICAgb3IgRE1BLCB0aGUgcmVsZXZhbnQgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgIGRlZGljYXRlZCBTTUFSVENBUkQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorICAgICAgICAoKyspIFRoZSBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIFRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgIFRoZSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24KKyAgICAgICAgICAgICBlcnJvciBpcyBkZXRlY3RlZC4KKworICAgICgrKSBCbG9ja2luZyBtb2RlIEFQSXMgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1JlY2VpdmUoKQorCisgICAgKCspIE5vbiBCbG9ja2luZyBtb2RlIEFQSXMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfSVJRSGFuZGxlcigpCisKKyAgICAoKykgTm9uIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggRE1BIGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9ETUEoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9ETUEoKQorCisgICAgKCspIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gbm9uIEJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0KCkKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0X0lUKCkKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdF9JVCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9TTUFSVENBUkRfQWJvcnR4eHhfSVQpLCBhIHNldCBvZiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkOgorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKQorCisgICAgKCMpIEluIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycywgcG9zc2libGUgZXJyb3JzIGFyZSBzcGxpdCBpbnRvIDIgY2F0ZWdvcmllcy4KKyAgICAgICAgRXJyb3JzIGFyZSBoYW5kbGVkIGFzIGZvbGxvd3MgOgorICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzCisgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgIFJlY2VpdmVkIGNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLAorICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFNNQVJUQ0FSRCBzaWRlLgorICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICBUaGlzIGNvbmNlcm5zIEZyYW1lIEVycm9yIGluIEludGVycnVwdCBtb2RlIHRyYW5taXNzaW9uLCBPdmVycnVuIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkLCB3cml0aW5nIGEgZGF0YSBpbiB0aGUgVERSIHJlZ2lzdGVyIGFkZHMgb25lCisgICogICAgICAgICBkYXRhIHRvIHRoZSBUWEZJRk8uIFdyaXRlIG9wZXJhdGlvbnMgdG8gdGhlIFREUiByZWdpc3RlciBhcmUgcGVyZm9ybWVkCisgICogICAgICAgICB3aGVuIFRYRk5GIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBUWEZORiBmbGFnIGFuZAorICAqICAgICAgICAgVFhFIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtICBUaW1lb3V0ICBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHB0bXBkYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGUgZm9yIFRYIG1hc3RlciAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogRGlzYWJsZSBSeCwgZW5hYmxlIFR4ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlFSLCAodWludDE2X3QpU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcHRtcGRhdGEgJiAweEZGVSk7CisgICAgICBwdG1wZGF0YSsrOworICAgIH0KKyAgICBpZiAoU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OX0ZMQUcoaHNtYXJ0Y2FyZCksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIC8qIFJlLWVuYWJsZSBSeCBhdCBlbmQgb2YgdHJhbnNtaXNzaW9uIGlmIGluaXRpYWwgbW9kZSBpcyBSeC9UeCAqLworICAgIGlmIChoc21hcnRjYXJkLT5Jbml0Lk1vZGUgPT0gU01BUlRDQVJEX01PREVfVFhfUlgpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZXMgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gRklGTyBtb2RlIGlzIGVuYWJsZWQsIHRoZSBSWEZORSBmbGFnIGlzIHNldCBhcyBsb25nIGFzIHRoZSBSWEZJRk8KKyAgKiAgICAgICAgIGlzIG5vdCBlbXB0eS4gUmVhZCBvcGVyYXRpb25zIGZyb20gdGhlIFJEUiByZWdpc3RlciBhcmUgcGVyZm9ybWVkIHdoZW4KKyAgKiAgICAgICAgIFJYRk5FIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBSWEZORSBmbGFnIGFuZAorICAqICAgICAgICAgUlhORSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwdG1wZGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbiBkYXRhIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgKnB0bXBkYXRhID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweDAwRkYpOworICAgICAgcHRtcGRhdGErKzsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBGSUZPIG1vZGUgaXMgZGlzYWJsZWQsIFVTQVJUIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbmV2ZXIKKyAgKiAgICAgICAgIFVTQVJUX1REUiByZWdpc3RlciBpcyBlbXB0eSwgaS5lIG9uZSBpbnRlcnJ1cHQgcGVyIGRhdGEgdG8gdHJhbnNtaXQuCisgICogQG5vdGUgICBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkLCBVU0FSVCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW5ldmVyCisgICogICAgICAgICBUWEZJRk8gdGhyZXNob2xkIHJlYWNoZWQuIEluIHRoYXQgY2FzZSB0aGUgaW50ZXJydXB0IHJhdGUgZGVwZW5kcyBvbgorICAqICAgICAgICAgVFhGSUZPIHRocmVzaG9sZCBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBoc21hcnRjYXJkLT5UeElzciBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0bworICAqICAgICAgICAgdGhlIEZJRk8gbW9kZSAoZGF0YSB0cmFuc21pc3Npb24gcHJvY2Vzc2luZyBkZXBlbmRzIG9uIEZJRk8gbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWDsKKworICAgIGhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSAgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21hcnRjYXJkLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsIGZpcnN0IHRvIHVwZGF0ZSBtb2RlIGZvciBUWCBtYXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIERpc2FibGUgUngsIGVuYWJsZSBUeCAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJRUiwgKHVpbnQxNl90KVNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogQ29uZmlndXJlIFR4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgaWYgKGhzbWFydGNhcmQtPkZpZm9Nb2RlID09IFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IHRoZSBUeCBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBTTUFSVENBUkRfVHhJU1JfRklGT0VOOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoc21hcnRjYXJkLT5UeElTUiA9IFNNQVJUQ0FSRF9UeElTUjsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIEZJRk8gbW9kZSBpcyBkaXNhYmxlZCwgVVNBUlQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuZXZlcgorICAqICAgICAgICAgVVNBUlRfUkRSIHJlZ2lzdGVyIGNhbiBiZSByZWFkLCBpLmUgb25lIGludGVycnVwdCBwZXIgZGF0YSB0byByZWNlaXZlLgorICAqIEBub3RlICAgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgVVNBUlQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuZXZlcgorICAqICAgICAgICAgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkLiBJbiB0aGF0IGNhc2UgdGhlIGludGVycnVwdCByYXRlIGRlcGVuZHMgb24KKyAgKiAgICAgICAgIFJYRklGTyB0aHJlc2hvbGQgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaHNtYXJ0Y2FyZC0+UnhJc3IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8KKyAgKiAgICAgICAgIHRoZSBGSUZPIG1vZGUgKGRhdGEgcmVjZXB0aW9uIHByb2Nlc3NpbmcgZGVwZW5kcyBvbiBGSUZPIG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYOworCisgICAgaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbmZpZ3VyZSBSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmICgoaHNtYXJ0Y2FyZC0+Rmlmb01vZGUgPT0gU01BUlRDQVJEX0ZJRk9NT0RFX0VOQUJMRSkgJiYgKFNpemUgPj0gaHNtYXJ0Y2FyZC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSX0ZJRk9FTjsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWDsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZSBmb3IgVFggbWFzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBEaXNhYmxlIFJ4LCBlbmFibGUgVHggKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SUVIsICh1aW50MTZfdClTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoc21hcnRjYXJkLT5oZG1hdHgsICh1aW50MzJfdCloc21hcnRjYXJkLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIsIFNpemUpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPklDUiwgVVNBUlRfSUNSX1RDQ0YpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAbm90ZSAgIFRoZSBTTUFSVENBUkQtYXNzb2NpYXRlZCBVU0FSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0RNQShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIGhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCwgKHVpbnQzMl90KSZoc21hcnRjYXJkLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciwgU2l6ZSkgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICAgICAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+U3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSwgUlhGVCwgVFhGVCBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzbWFydGNhcmQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoc21hcnRjYXJkLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFJlc2V0IEhhbmRsZSBFcnJvckNvZGUgdG8gTm8gRXJyb3IgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgVENJRSwgVFhFSUUgYW5kIFRYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgVHggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhzbWFydGNhcmQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFJYTkUsIFBFLCBSWEZULCBUWEZUIGFuZCAgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogQ2hlY2sgaWYgYSBUcmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhzbWFydGNhcmQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgYWJvcnRjcGx0ID0gMVU7CisKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSwgUlhGVCwgVFhGVCBhbmQgIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JUT0lFIHwgVVNBUlRfQ1IxX0VPQklFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBTTUFSVENBUkQgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNNQVJUQ0FSRCBUeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNNQVJUQ0FSRCBSeCBETUEgQWJvcnQgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGFib3J0Y3BsdCA9IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBpZiBubyBETUEgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uIGlzIHJlcXVpcmVkID0+IGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBpZiAoYWJvcnRjcGx0ID09IDFVKQorICB7CisgICAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgaHNtYXJ0Y2FyZC0+UnhJU1IgPSBOVUxMOworICAgIGhzbWFydGNhcmQtPlR4SVNSID0gTlVMTDsKKworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPkFib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdF9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUQ0lFLCBUWEVJRSBhbmQgVFhGVElFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhzbWFydGNhcmQtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBOVUxMOworCisgICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGhzbWFydGNhcmQtPlR4SVNSID0gTlVMTDsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0ZFRik7CisKKyAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZV9JVChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFJYTkUsIFBFLCBSWEZUIGFuZCAgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogQ2hlY2sgaWYgYSBUcmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hcngpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhJU1IgPSBOVUxMOworCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUFSVENBUkQgaW50ZXJydXB0IHJlcXVlc3RzLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NNQVJUQ0FSRF9JUlFIYW5kbGVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCBpc3JmbGFncyAgID0gUkVBRF9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyAgICAgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzICAgICA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMpOworICB1aW50MzJfdCBlcnJvcmZsYWdzOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FIHwgVVNBUlRfSVNSX1JUT0YpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gMFUpCisgIHsKKyAgICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKQorICAgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKQorICAgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfUlhGVElFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIGlmIChoc21hcnRjYXJkLT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBoc21hcnRjYXJkLT5SeElTUihoc21hcnRjYXJkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBJZiBzb21lIGVycm9ycyBvY2N1ciAqLworICBpZiAoKGVycm9yZmxhZ3MgIT0gMFUpCisgICAgICAmJiAoKCgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpCisgICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSkgIT0gMFUpKSkpCisgIHsKKyAgICAvKiBTTUFSVENBUkQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX1BFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX1BFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBTTUFSVENBUkQgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfTkVGKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfTkU7CisgICAgfQorCisgICAgLyogU01BUlRDQVJEIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkKKyAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlRPRikgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JUT0lFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9SVE9GKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfUlRPOworICAgIH0KKworICAgIC8qIENhbGwgU01BUlRDQVJEIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlICE9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpCisgICAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkKKyAgICAgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfUlhGVElFKSAhPSAwVSkpKQorICAgICAgeworICAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+UnhJU1IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGhzbWFydGNhcmQtPlJ4SVNSKGhzbWFydGNhcmQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIElmIEVycm9yIGlzIHRvIGJlIGNvbnNpZGVyZWQgYXMgYmxvY2tpbmcgOgorICAgICAgICAgIC0gUmVjZWl2ZXIgVGltZW91dCBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgICAgICAtIE92ZXJydW4gZXJyb3IgaW4gUmVjZXB0aW9uCisgICAgICAgICAgLSBhbnkgZXJyb3Igb2NjdXJzIGluIERNQSBtb2RlIHJlY2VwdGlvbgorICAgICAgKi8KKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICAgIHx8ICgoaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlICYgKEhBTF9TTUFSVENBUkRfRVJST1JfUlRPIHwgSEFMX1NNQVJUQ0FSRF9FUlJPUl9PUkUpKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgICBTZXQgdGhlIFNNQVJUQ0FSRCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIFJ4IEludGVycnVwdHMsIGFuZCBkaXNhYmxlIFJ4IERNQSByZXF1ZXN0LCBpZiBvbmdvaW5nICovCisgICAgICAgIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKGhzbWFydGNhcmQpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgICAgICAgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhzbWFydGNhcmQtPmhkbWFyeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIG90aGVyIGVycm9yIHR5cGUgdG8gYmUgY29uc2lkZXJlZCBhcyBibG9ja2luZyA6CisgICAgICAgICAgLSBGcmFtZSBlcnJvciBpbiBUcmFuc21pc3Npb24KKyAgICAgICovCisgICAgICBlbHNlIGlmICgoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCkKKyAgICAgICAgICAgICAgICYmICgoaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlICYgSEFMX1NNQVJUQ0FSRF9FUlJPUl9GRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBTTUFSVENBUkQgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKKyAgICAgICAgICAgRGlzYWJsZSBUeCBJbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSBUeCBETUEgcmVxdWVzdCwgaWYgb25nb2luZyAqLworICAgICAgICBTTUFSVENBUkRfRW5kVHhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisKKyAgfSAvKiBFbmQgaWYgc29tZSBlcnJvciBvY2N1cnMgKi8KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciwgZW5kIG9mIGJsb2NrIGludGVycnVwdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9FT0JGKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfRU9CSUUpICE9IDBVKSkKKyAgeworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgLyogQ2xlYXIgRU9CRiBpbnRlcnJ1cHQgYWZ0ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGNhbGwgZm9yIHRoZSBFbmQgb2YgQmxvY2sgaW5mb3JtYXRpb24KKyAgICAgICB0byBiZSBhdmFpbGFibGUgZHVyaW5nIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSBwcm9jZXNzaW5nICovCisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKQorICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1RYRlRJRSkgIT0gMFUpKSkKKyAgeworICAgIGlmIChoc21hcnRjYXJkLT5UeElTUiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPlR4SVNSKGhzbWFydGNhcmQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVQoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0UoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChoc21hcnRjYXJkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBTTUFSVENBUkQgVFggRmlmbyBFbXB0eSBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhGRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRkVJRSkgIT0gMFUpKQorICB7CisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+VHhGaWZvRW1wdHlDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICByZXR1cm47CisgIH0KKworICAvKiBTTUFSVENBUkQgUlggRmlmbyBGdWxsIG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWEZGKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhGRklFKSAhPSAwVSkpCisgIHsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJERXhfUnhGaWZvRnVsbENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgcmV0dXJuOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBTTUFSVENBUkQgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gcmV0dXJuIHRoZSBTdGF0ZSBvZiBTbWFydENhcmQKKyAgICBoYW5kbGUgYW5kIGFsc28gcmV0dXJuIFBlcmlwaGVyYWwgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHByb2Nlc3MKKyAgICAgKCspIEhBTF9TTUFSVENBUkRfR2V0U3RhdGUoKSBBUEkgY2FuIGJlIGhlbHBmdWwgdG8gY2hlY2sgaW4gcnVuLXRpbWUgdGhlIHN0YXRlCisgICAgICAgICBvZiB0aGUgU01BUlRDQVJEIHBlcmlwaGVyYWwuCisgICAgICgrKSBIQUxfU01BUlRDQVJEX0dldEVycm9yKCkgY2hlY2tzIGluIHJ1bi10aW1lIGVycm9ycyB0aGF0IGNvdWxkIG9jY3VyIGR1cmluZworICAgICAgICAgY29tbXVuaWNhdGlvbi4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgU01BUlRDQVJEIGhhbmRsZSBzdGF0ZQorICAqLworSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgSEFMX1NNQVJUQ0FSRF9HZXRTdGF0ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUmV0dXJuIFNNQVJUQ0FSRCBoYW5kbGUgc3RhdGUgKi8KKyAgdWludDMyX3QgdGVtcDEsIHRlbXAyOworICB0ZW1wMSA9ICh1aW50MzJfdCloc21hcnRjYXJkLT5nU3RhdGU7CisgIHRlbXAyID0gKHVpbnQzMl90KWhzbWFydGNhcmQtPlJ4U3RhdGU7CisKKyAgcmV0dXJuIChIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTTUFSVENBUkQgaGFuZGxlIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgU01BUlRDQVJEIGhhbmRsZSBFcnJvciBDb2RlCisgICovCit1aW50MzJfdCBIQUxfU01BUlRDQVJEX0dldEVycm9yKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICByZXR1cm4gaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0Z1bmN0aW9ucyBTTUFSVENBUkQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCit2b2lkIFNNQVJUQ0FSRF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBJbml0IHRoZSBTTUFSVENBUkQgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBoc21hcnRjYXJkLT5SeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgPSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA9IEhBTF9TTUFSVENBUkRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICBoc21hcnRjYXJkLT5UeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgID0gSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICovCisKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9TZXRDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgU01BUlRDQVJEX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOworICBjb25zdCB1aW50MTZfdCBTTUFSVENBUkRQcmVzY1RhYmxlWzEyXSA9IHsxVSwgMlUsIDRVLCA2VSwgOFUsIDEwVSwgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQkFVRFJBVEUoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1dPUkRfTEVOR1RIKGhzbWFydGNhcmQtPkluaXQuV29yZExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1NUT1BCSVRTKGhzbWFydGNhcmQtPkluaXQuU3RvcEJpdHMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9QQVJJVFkoaHNtYXJ0Y2FyZC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9NT0RFKGhzbWFydGNhcmQtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1BPTEFSSVRZKGhzbWFydGNhcmQtPkluaXQuQ0xLUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9QSEFTRShoc21hcnRjYXJkLT5Jbml0LkNMS1BoYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfTEFTVEJJVChoc21hcnRjYXJkLT5Jbml0LkNMS0xhc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRShoc21hcnRjYXJkLT5Jbml0Lk9uZUJpdFNhbXBsaW5nKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfTkFDSyhoc21hcnRjYXJkLT5Jbml0Lk5BQ0tFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9USU1FT1VUKGhzbWFydGNhcmQtPkluaXQuVGltZU91dEVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FVVE9SRVRSWV9DT1VOVChoc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50KSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQ0xPQ0tQUkVTQ0FMRVIoaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBJbiBTbWFydENhcmQgbW9kZSwgTSBhbmQgUENFIGFyZSBmb3JjZWQgdG8gMSAoOCBiaXRzICsgcGFyaXR5KS4KKyAgICogT3ZlcnNhbXBsaW5nIGlzIGZvcmNlZCB0byAxNiAoT1ZFUjggPSAwKS4KKyAgICogQ29uZmlndXJlIHRoZSBQYXJpdHkgYW5kIE1vZGU6CisgICAqICBzZXQgUFMgYml0IGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB2YWx1ZQorICAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0Lk1vZGUgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB8IGhzbWFydGNhcmQtPkluaXQuTW9kZTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5Xb3JkTGVuZ3RoIHwgaHNtYXJ0Y2FyZC0+Rmlmb01vZGU7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gaHNtYXJ0Y2FyZC0+SW5pdC5TdG9wQml0czsKKyAgLyogU3luY2hyb25vdXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgZGVmYXVsdCAqLworICB0bXByZWcgfD0gKHVpbnQzMl90KSBVU0FSVF9DUjJfQ0xLRU4gfCBoc21hcnRjYXJkLT5Jbml0LkNMS1BvbGFyaXR5OworICB0bXByZWcgfD0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LkNMS1BoYXNlIHwgaHNtYXJ0Y2FyZC0+SW5pdC5DTEtMYXN0Qml0OworICB0bXByZWcgfD0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRFbmFibGU7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUKKyAgICogICBhY2NvcmRpbmcgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5PbmVCaXRTYW1wbGluZworICAgKiAtIE5BQ0sgdHJhbnNtaXNzaW9uIGluIGNhc2Ugb2YgcGFyaXR5IGVycm9yIGFjY29yZGluZworICAgKiAgIHRvIGhzbWFydGNhcmQtPkluaXQuTkFDS0VuYWJsZQorICAgKiAtIGF1dG9yZXRyeSBjb3VudGVyIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50ICovCisKKyAgdG1wcmVnID0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0Lk9uZUJpdFNhbXBsaW5nIHwgaHNtYXJ0Y2FyZC0+SW5pdC5OQUNLRW5hYmxlOworICB0bXByZWcgfD0gKCh1aW50MzJfdCloc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50IDw8IFVTQVJUX0NSM19TQ0FSQ05UX1Bvcyk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUFSVENBUkQgY2xvY2sgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICogLSBTTUFSVENBUkQgQ2xvY2sgUHJlc2NhbGVyOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LkNsb2NrUHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsIGhzbWFydGNhcmQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bXByZWcgPSAoaHNtYXJ0Y2FyZC0+SW5pdC5QcmVzY2FsZXIgfCAoKHVpbnQzMl90KWhzbWFydGNhcmQtPkluaXQuR3VhcmRUaW1lIDw8IFVTQVJUX0dUUFJfR1RfUG9zKSk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkdUUFIsICh1aW50MTZfdCkoVVNBUlRfR1RQUl9HVCB8IFVTQVJUX0dUUFJfUFNDKSwgKHVpbnQxNl90KXRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBSVE9SIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHRtcHJlZyA9ICgodWludDMyX3QpaHNtYXJ0Y2FyZC0+SW5pdC5CbG9ja0xlbmd0aCA8PCBVU0FSVF9SVE9SX0JMRU5fUG9zKTsKKyAgaWYgKGhzbWFydGNhcmQtPkluaXQuVGltZU91dEVuYWJsZSA9PSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RJTUVPVVRfVkFMVUUoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWUpKTsKKyAgICB0bXByZWcgfD0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRWYWx1ZTsKKyAgfQorICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SVE9SLCAoVVNBUlRfUlRPUl9SVE8gfCBVU0FSVF9SVE9SX0JMRU4pLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBTTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UoaHNtYXJ0Y2FyZCwgY2xvY2tzb3VyY2UpOworICB0bXByZWcgPSAgIDBVOworICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICB7CisgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKCgoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSAvIFNNQVJUQ0FSRFByZXNjVGFibGVbaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcl0pICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9IU0k6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKCgoSFNJX1ZBTFVFIC8gU01BUlRDQVJEUHJlc2NUYWJsZVtoc21hcnRjYXJkLT5Jbml0LkNsb2NrUHJlc2NhbGVyXSkgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpIC8gU01BUlRDQVJEUHJlc2NUYWJsZVtoc21hcnRjYXJkLT5Jbml0LkNsb2NrUHJlc2NhbGVyXSkgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKCh1aW50MTZfdCkoTFNFX1ZBTFVFIC8gU01BUlRDQVJEUHJlc2NUYWJsZVtoc21hcnRjYXJkLT5Jbml0LkNsb2NrUHJlc2NhbGVyXSkgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgKi8KKyAgaWYgKCh0bXByZWcgPj0gVVNBUlRfQlJSX01JTikgJiYgKHRtcHJlZyA8PSBVU0FSVF9CUlJfTUFYKSkKKyAgeworICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5CUlIgPSB0bXByZWc7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0ID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBoc21hcnRjYXJkLT5OYlR4RGF0YVRvUHJvY2VzcyA9IDFVOworICBoc21hcnRjYXJkLT5OYlJ4RGF0YVRvUHJvY2VzcyA9IDFVOworCisgIC8qIENsZWFyIElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICBoc21hcnRjYXJkLT5SeElTUiAgID0gTlVMTDsKKyAgaHNtYXJ0Y2FyZC0+VHhJU1IgICA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBTTUFSVENBUkQgYXNzb2NpYXRlZCBVU0FSVCBwZXJpcGhlcmFsIGFkdmFuY2VkIGZlYXR1cmVzLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgc2V0IG9mIGFkdmFuY2VkIGZlYXR1cmVzIHRvIGNvbmZpZ3VyZSBpcyBwcm9wZXJseSBzZXQgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0lOSVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0KSk7CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgZGF0YSBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOViwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkRhdGFJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWC9UWCBwaW5zIHN3YXAgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5Td2FwKSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlN3YXApOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhPVkVSUlVORElTQUJMRV9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfT1ZFUlJVTihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19PVlJESVMsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5PdmVycnVuRGlzYWJsZSk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIERNQSBkaXNhYmxpbmcgb24gcmVjZXB0aW9uIGVycm9yICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQURJU0FCTEVPTkVSUk9SX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcikpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0REUkUsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5ETUFEaXNhYmxlb25SeEVycm9yKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgTVNCIGZpcnN0IG9uIGNvbW11bmljYXRpb24gbGluZSAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9NU0JGSVJTVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9NU0JGSVJTVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuTVNCRmlyc3QpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KTsKKyAgfQorCit9CisKKy8qKgorICAqIEBicmllZiBDaGVjayB0aGUgU01BUlRDQVJEIElkbGUgU3RhdGUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfQ2hlY2tJZGxlU3RhdGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgRXJyb3JDb2RlICovCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1RFKSA9PSBVU0FSVF9DUjFfVEUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFRFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgU01BUlRDQVJEX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIC8qIENoZWNrIGlmIHRoZSBSZWNlaXZlciBpcyBlbmFibGVkICovCisgIGlmICgoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9SRSkgPT0gVVNBUlRfQ1IxX1JFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBzdGF0ZXMgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQVJUQ0FSRCBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgU01BUlRDQVJEIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgVGhlIG5ldyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcoaHNtYXJ0Y2FyZCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgICAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBUeCB0cmFuc2ZlciBvbiBTTUFSVENBUkQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBSZWNlcHRpb24gY29tcGxldGlvbikuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0VuZFJ4VHJhbnNmZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFUIGJpdAorICBpbiB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgIGluIHRoZSBTTUFSVENBUkQgYXNzb2NpYXRlZCBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIFN0b3AgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZihIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICAgIFNNQVJUQ0FSRF9FbmRUeFRyYW5zZmVyKGhzbWFydGNhcmQpOworICAgIH0KKyAgfQorCisgIC8qIFN0b3AgU01BUlRDQVJEIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworICAgICAgU01BUlRDQVJEX0VuZFJ4VHJhbnNmZXIoaHNtYXJ0Y2FyZCk7CisgICAgfQorICB9CisKKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdF9JVCBBUEkgKEFib3J0IG9ubHkgVHggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgVHggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTTUFSVENBUkQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUIEFQSSAoQWJvcnQgb25seSBSeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBSeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgKiAgICAgICAgIGFuZCB3aGVuIHRoZSBGSUZPIG1vZGUgaXMgZGlzYWJsZWQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX1R4SVNSKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIgJiAweEZGVSk7CisgICAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyKys7CisgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICogICAgICAgICBhbmQgd2hlbiB0aGUgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX1R4SVNSX0ZJRk9FTihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDE2X3QgICBuYl90eF9kYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBoc21hcnRjYXJkLT5OYlR4RGF0YVRvUHJvY2VzcyA7IG5iX3R4X2RhdGEgPiAwVSA7IG5iX3R4X2RhdGEtLSkKKyAgICB7CisgICAgICBpZiAoaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFJFQURfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKQorICAgICAgeworICAgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpoc21hcnRjYXJkLT5wVHhCdWZmUHRyICYgMHhGRlUpOworICAgICAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyKys7CisgICAgICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXcmFwIHVwIHRyYW5zbWlzc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pOworCisgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgIH0KKworICAvKiBSZS1lbmFibGUgUnggYXQgZW5kIG9mIHRyYW5zbWlzc2lvbiBpZiBpbml0aWFsIG1vZGUgaXMgUngvVHggKi8KKyAgaWYgKGhzbWFydGNhcmQtPkluaXQuTW9kZSA9PSBTTUFSVENBUkRfTU9ERV9UWF9SWCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGVzICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKyAgfQorCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBoc21hcnRjYXJkLT5UeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5UeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkKKyAgKiAgICAgICAgIGFuZCB3aGVuIHRoZSBGSUZPIG1vZGUgaXMgZGlzYWJsZWQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX1J4SVNSKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgICpoc21hcnRjYXJkLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweEZGKTsKKyAgICBoc21hcnRjYXJkLT5wUnhCdWZmUHRyKys7CisKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudC0tOworICAgIGlmIChoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKworICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgICAgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfU01BUlRDQVJEX1NFTkRfUkVRKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpCisgICogICAgICAgICBhbmQgd2hlbiB0aGUgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX1J4SVNSX0ZJRk9FTihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDE2X3QgICBuYl9yeF9kYXRhOworICB1aW50MTZfdCByeGRhdGFjb3VudDsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGZvciAobmJfcnhfZGF0YSA9IGhzbWFydGNhcmQtPk5iUnhEYXRhVG9Qcm9jZXNzIDsgbmJfcnhfZGF0YSA+IDBVIDsgbmJfcnhfZGF0YS0tKQorICAgIHsKKyAgICAgICpoc21hcnRjYXJkLT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweEZGKTsKKyAgICAgIGhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIrKzsKKworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQtLTsKKyAgICAgIGlmIChoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgICAgICAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXaGVuIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gdGhlIFJYIEZJRk8KKyAgICB0aHJlc2hvbGQsIG5leHQgaW5jb21pbmcgZnJhbWVzIGFyZSBwcm9jZXNzZWQgYXMgaWYgRklGTyBtb2RlIHdhcworICAgIGRpc2FibGVkIChpLmUuIG9uZSBpbnRlcnJ1cHQgcGVyIHJlY2VpdmVkIGZyYW1lKS4KKyAgICAqLworICAgIHJ4ZGF0YWNvdW50ID0gaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKCgocnhkYXRhY291bnQgIT0gMFUpKSAmJiAocnhkYXRhY291bnQgPCBoc21hcnRjYXJkLT5OYlJ4RGF0YVRvUHJvY2VzcykpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBSWEZUIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhJU1IgPSBTTUFSVENBUkRfUnhJU1I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9TRU5EX1JFUShoc21hcnRjYXJkLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkX2V4LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9zbWFydGNhcmRfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI2YTU4Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfc21hcnRjYXJkX2V4LmMKQEAgLTAsMCArMSw0ODcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3NtYXJ0Y2FyZF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTTUFSVENBUkQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGV4dGVuZGVkIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU21hcnRDYXJkLgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAjIyMjIyBTTUFSVENBUkQgcGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICBUaGUgRXh0ZW5kZWQgU01BUlRDQVJEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBBZnRlciBoYXZpbmcgY29uZmlndXJlZCB0aGUgU01BUlRDQVJEIGJhc2ljIGZlYXR1cmVzIHdpdGggSEFMX1NNQVJUQ0FSRF9Jbml0KCksCisgICAgICAgIHRoZW4gcHJvZ3JhbSBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgaWYgcmVxdWlyZWQgKFRYL1JYIHBpbnMgc3dhcCwgVGltZU91dCwKKyAgICAgICAgYXV0by1yZXRyeSBjb3VudGVyLC4uLikgaW4gdGhlIGhzbWFydGNhcmQgQWR2YW5jZWRJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBGSUZPIG1vZGUgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBSWC9UWCBGSUZPIHRocmVzaG9sZCBwcm9ncmFtbWluZy4KKworICAgICAgICAtQC0gV2hlbiBTTUFSVENBUkQgb3BlcmF0ZXMgaW4gRklGTyBtb2RlLCBGSUZPIG1vZGUgbXVzdCBiZSBlbmFibGVkIHByaW9yCisgICAgICAgICAgICBzdGFydGluZyBSWC9UWCB0cmFuc2ZlcnMuIEFsc28gUlgvVFggRklGTyB0aHJlc2hvbGRzIG11c3QgYmUKKyAgICAgICAgICAgIGNvbmZpZ3VyZWQgcHJpb3Igc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4IFNNQVJUQ0FSREV4CisgICogQGJyaWVmIFNNQVJUQ0FSRCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFVBUlQgUlggRklGTyBkZXB0aCAqLworI2RlZmluZSBSWF9GSUZPX0RFUFRIIDhVCisKKy8qIFVBUlQgVFggRklGTyBkZXB0aCAqLworI2RlZmluZSBUWF9GSUZPX0RFUFRIIDhVCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSREV4X1NldE5iRGF0YVRvUHJvY2VzcyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyAgU01BUlRDQVJEIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBTTUFSVENBUkQuCisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKCkgQVBJIGFsbG93cyB0byBjb25maWd1cmUgdGhlIEJsb2NrIExlbmd0aCBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfVGltZU91dF9Db25maWcoKSBBUEkgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfRW5hYmxlUmVjZWl2ZXJUaW1lT3V0KCkgQVBJIGVuYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoKSBBUEkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFVwZGF0ZSBvbiB0aGUgZmx5IHRoZSBTTUFSVENBUkQgYmxvY2sgbGVuZ3RoIGluIFJUT1IgcmVnaXN0ZXIuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtIEJsb2NrTGVuZ3RoIFNNQVJUQ0FSRCBibG9jayBsZW5ndGggKDgtYml0IGxvbmcgYXQgbW9zdCkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NNQVJUQ0FSREV4X0Jsb2NrTGVuZ3RoX0NvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCBCbG9ja0xlbmd0aCkKK3sKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgVVNBUlRfUlRPUl9CTEVOLCAoKHVpbnQzMl90KUJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpKTsKK30KKworLyoqIEBicmllZiBVcGRhdGUgb24gdGhlIGZseSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBSVE9SIHJlZ2lzdGVyLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSBUaW1lT3V0VmFsdWUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBudW1iZXIgb2YgYmF1ZCBibG9ja3MuIFRoZSB0aW1lb3V0CisgICogICAgICAgICAgICAgICAgICAgICB2YWx1ZSBtdXN0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gMHgwRkZGRkZGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUFSVENBUkRFeF9UaW1lT3V0X0NvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGltZU91dFZhbHVlKQoreworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1RJTUVPVVRfVkFMVUUoaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWUpKTsKKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVPdXRWYWx1ZSk7Cit9CisKKy8qKiBAYnJpZWYgRW5hYmxlIHRoZSBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgICAgLyogU2V0IHRoZSBVU0FSVCBSVE9FTiBiaXQgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKiBAYnJpZWYgRGlzYWJsZSB0aGUgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZS4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9EaXNhYmxlUmVjZWl2ZXJUaW1lT3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDbGVhciB0aGUgVVNBUlQgUlRPRU4gYml0ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBQZXJpcGhlcmFsIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBTTUFSVENBUkQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgRklGTyBtb2RlIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zLgorCisgICAgKCMpIFRYL1JYIEZpZm9zIENhbGxiYWNrczoKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBSWCBGaWZvIGZ1bGwgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJERXhfUnhGaWZvRnVsbENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSREV4X1J4Rmlmb0Z1bGxDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIFRYIEZpZm8gZW1wdHkgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBFeHRlbmRlZCBQZXJpcGhlcmFsIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgU01BUlRDQVJEIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFNNQVJUQ0FSRC4KKyAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9FbmFibGVGaWZvTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9EaXNhYmxlRmlmb01vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIEZJRk8gbW9kZQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X1NldFR4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBUWCBGSUZPIHRocmVzaG9sZAorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X1NldFJ4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBSWCBGSUZPIHRocmVzaG9sZAorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEZJRk8gbW9kZS4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBTTUFSVENBUkQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZUZpZm9Nb2RlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgU01BUlRDQVJEIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBTTUFSVENBUkQgKi8KKyAgX19IQUxfU01BUlRDQVJEX0RJU0FCTEUoaHNtYXJ0Y2FyZCk7CisKKyAgLyogRW5hYmxlIEZJRk8gbW9kZSAqLworICBTRVRfQklUKHRtcGNyMSwgVVNBUlRfQ1IxX0ZJRk9FTik7CisgIGhzbWFydGNhcmQtPkZpZm9Nb2RlID0gU01BUlRDQVJEX0ZJRk9NT0RFX0VOQUJMRTsKKworICAvKiBSZXN0b3JlIFNNQVJUQ0FSRCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBTTUFSVENBUkRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZJRk8gbW9kZS4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBTTUFSVENBUkQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVGaWZvTW9kZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShoc21hcnRjYXJkLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFNNQVJUQ0FSRCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgU01BUlRDQVJEICovCisgIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKGhzbWFydGNhcmQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgQ0xFQVJfQklUKHRtcGNyMSwgVVNBUlRfQ1IxX0ZJRk9FTik7CisgIGhzbWFydGNhcmQtPkZpZm9Nb2RlID0gU01BUlRDQVJEX0ZJRk9NT0RFX0RJU0FCTEU7CisKKyAgLyogUmVzdG9yZSBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBoc21hcnRjYXJkICAgICAgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBUWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV80CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfN184CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfU2V0VHhGaWZvVGhyZXNob2xkKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEKFRocmVzaG9sZCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFNNQVJUQ0FSRCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgU01BUlRDQVJEICovCisgIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKGhzbWFydGNhcmQpOworCisgIC8qIFVwZGF0ZSBUWCB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHLCBUaHJlc2hvbGQpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBTTUFSVENBUkRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHNtYXJ0Y2FyZCk7CisKKyAgLyogUmVzdG9yZSBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSwgdG1wY3IxKTsKKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBoc21hcnRjYXJkICAgICAgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBSWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV80CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfN184CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfU2V0UnhGaWZvVGhyZXNob2xkKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEKFRocmVzaG9sZCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFNNQVJUQ0FSRCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgU01BUlRDQVJEICovCisgIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKGhzbWFydGNhcmQpOworCisgIC8qIFVwZGF0ZSBSWCB0aHJlc2hvbGQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHLCBUaHJlc2hvbGQpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBTTUFSVENBUkRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHNtYXJ0Y2FyZCk7CisKKyAgLyogUmVzdG9yZSBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSwgdG1wY3IxKTsKKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUHJpdmF0ZV9GdW5jdGlvbnMgIFNNQVJUQ0FSRCBFeHRlbmRlZCBwcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgaW4gUlgvVFggSVNSLgorICAqIEBub3RlIFRoZSBSWCBGSUZPIGRlcHRoIGFuZCB0aGUgVFggRklGTyBkZXB0aCBpcyBleHRyYWN0ZWQgZnJvbQorICAqICAgICAgIHRoZSBVU0FSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBTTUFSVENBUkQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJERXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50OF90IHJ4X2ZpZm9fZGVwdGg7CisgIHVpbnQ4X3QgdHhfZmlmb19kZXB0aDsKKyAgdWludDhfdCByeF9maWZvX3RocmVzaG9sZDsKKyAgdWludDhfdCB0eF9maWZvX3RocmVzaG9sZDsKKyAgLyogMiAwVS8xVSBhZGRlZCBmb3IgTUlTUkFDMjAxMi1SdWxlLTE4LjFfYiBhbmQgTUlTUkFDMjAxMi1SdWxlLTE4LjFfZCAqLworICB1aW50OF90IG51bWVyYXRvcltdICAgPSB7MVUsIDFVLCAxVSwgM1UsIDdVLCAxVSwgMFUsIDBVfTsKKyAgdWludDhfdCBkZW5vbWluYXRvcltdID0gezhVLCA0VSwgMlUsIDRVLCA4VSwgMVUsIDFVLCAxVX07CisKKyAgaWYgKGhzbWFydGNhcmQtPkZpZm9Nb2RlID09IFNNQVJUQ0FSRF9GSUZPTU9ERV9ESVNBQkxFKQorICB7CisgICAgaHNtYXJ0Y2FyZC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgICBoc21hcnRjYXJkLT5OYlJ4RGF0YVRvUHJvY2VzcyA9IDFVOworICB9CisgIGVsc2UKKyAgeworICAgIHJ4X2ZpZm9fZGVwdGggPSBSWF9GSUZPX0RFUFRIOworICAgIHR4X2ZpZm9fZGVwdGggPSBUWF9GSUZPX0RFUFRIOworICAgIHJ4X2ZpZm9fdGhyZXNob2xkID0gKHVpbnQ4X3QpKFJFQURfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHKSA+PiBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworICAgIHR4X2ZpZm9fdGhyZXNob2xkID0gKHVpbnQ4X3QpKFJFQURfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHKSA+PiBVU0FSVF9DUjNfVFhGVENGR19Qb3MpOworICAgIGhzbWFydGNhcmQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdCl0eF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3R4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbdHhfZmlmb190aHJlc2hvbGRdOworICAgIGhzbWFydGNhcmQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdClyeF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3J4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbcnhfZmlmb190aHJlc2hvbGRdOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9zbWJ1cy5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfc21idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFkYzkzCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfc21idXMuYwpAQCAtMCwwICsxLDI2NzMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3NtYnVzLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNNQlVTIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IEJ1cyAoU01CdXMpIHBlcmlwaGVyYWwsCisgICogICAgICAgICAgYmFzZWQgb24gSTJDIHByaW5jaXBsZXMgb2Ygb3BlcmF0aW9uIDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgU01CVVMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBTTUJVU19IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlOgorICAgICAgICBTTUJVU19IYW5kbGVUeXBlRGVmICBoc21idXM7CisKKyAgICAoIylJbml0aWFsaXplIHRoZSBTTUJVUyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgQHJlZiBIQUxfU01CVVNfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIFNNQlVTeCBpbnRlcmZhY2UgY2xvY2sKKyAgICAgICAgKCMjKSBTTUJVUyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTTUJVUyBHUElPcworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIFNNQlVTIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIG9wZW4tZHJhaW4KKyAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNNQlVTeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBTTUJVUyBJUlEgQ2hhbm5lbAorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgQ29tbXVuaWNhdGlvbiBDbG9jayBUaW1pbmcsIEJ1cyBUaW1lb3V0LCBPd24gQWRkcmVzczEsIE1hc3RlciBBZGRyZXNzaW5nIG1vZGUsCisgICAgICAgIER1YWwgQWRkcmVzc2luZyBtb2RlLCBPd24gQWRkcmVzczIsIE93biBBZGRyZXNzMiBNYXNrLCBHZW5lcmFsIGNhbGwsIE5vc3RyZXRjaCBtb2RlLAorICAgICAgICBQZXJpcGhlcmFsIG1vZGUgYW5kIFBhY2tldCBFcnJvciBDaGVjayBtb2RlIGluIHRoZSBoc21idXMgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU01CVVMgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKSBBUEk6CisgICAgICAgICgrKykgVGhlc2UgQVBJJ3MgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEByZWYgSEFMX1NNQlVTX01zcEluaXQoJmhzbWJ1cykgQVBJLgorCisgICAgKCMpIFRvIGNoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24sIHVzZSB0aGUgZnVuY3Rpb24gQHJlZiBIQUxfU01CVVNfSXNEZXZpY2VSZWFkeSgpCisKKyAgICAoIykgRm9yIFNNQlVTIElPIG9wZXJhdGlvbnMsIG9ubHkgb25lIG1vZGUgb2Ygb3BlcmF0aW9ucyBpcyBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyCisKKyAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFRyYW5zbWl0IGluIG1hc3Rlci9ob3N0IFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKCkKKyAgICAgICgrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgQWJvcnQgYSBtYXN0ZXIvaG9zdCBTTUJVUyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfU01CVVNfTWFzdGVyX0Fib3J0X0lUKCkKKyAgICAgICgrKykgVGhlIGFzc29jaWF0ZWQgcHJldmlvdXMgdHJhbnNmZXIgY2FsbGJhY2sgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYWJvcnQgcHJvY2VzcworICAgICAgKCsrKSBtZWFuIEByZWYgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHRyYW5zbWl0CisgICAgICAoKyspIG1lYW4gQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpbiBjYXNlIG9mIHByZXZpb3VzIHN0YXRlIHdhcyBtYXN0ZXIgcmVjZWl2ZQorICAgICAgKCspIEVuYWJsZS9kaXNhYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIGluIHNsYXZlL2RldmljZSBvciBob3N0L3NsYXZlIFNNQlVTIG1vZGUKKyAgICAgICAgICAgdXNpbmcgQHJlZiBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKCkgQHJlZiBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAoKyspIFdoZW4gYWRkcmVzcyBzbGF2ZS9kZXZpY2UgU01CVVMgbWF0Y2gsIEByZWYgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIHRvIGNoZWNrIHRoZSBBZGRyZXNzIE1hdGNoIENvZGUgYW5kIHRoZSB0cmFuc21pc3Npb24gZGlyZWN0aW9uIHJlcXVlc3QgYnkgbWFzdGVyL2hvc3QgKFdyaXRlL1JlYWQpLgorICAgICAgKCsrKSBBdCBMaXN0ZW4gbW9kZSBlbmQgQHJlZiBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAoKykgVHJhbnNtaXQgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoKQorICAgICAgKCsrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEByZWYgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9TTUJVU19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICgrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBTTUJVUyBhbGVydCBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX0VuYWJsZUFsZXJ0X0lUKCkgQHJlZiBIQUxfU01CVVNfRGlzYWJsZUFsZXJ0X0lUKCkKKyAgICAgICgrKykgV2hlbiBTTUJVUyBBbGVydCBpcyBnZW5lcmF0ZWQgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgICAgdG8gY2hlY2sgdGhlIEFsZXJ0IEVycm9yIENvZGUgdXNpbmcgZnVuY3Rpb24gQHJlZiBIQUxfU01CVVNfR2V0RXJyb3IoKQorICAgICAgKCspIEdldCBIQUwgc3RhdGUgbWFjaGluZSBvciBlcnJvciB2YWx1ZXMgdXNpbmcgQHJlZiBIQUxfU01CVVNfR2V0U3RhdGUoKSBvciBAcmVmIEhBTF9TTUJVU19HZXRFcnJvcigpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgICAgdG8gY2hlY2sgdGhlIEVycm9yIENvZGUgdXNpbmcgZnVuY3Rpb24gQHJlZiBIQUxfU01CVVNfR2V0RXJyb3IoKQorCisgICAgICoqKiBTTUJVUyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIFNNQlVTIEhBTCBkcml2ZXIuCisKKyAgICAgICgrKSBAcmVmIF9fSEFMX1NNQlVTX0VOQUJMRTogICAgICBFbmFibGUgdGhlIFNNQlVTIHBlcmlwaGVyYWwKKyAgICAgICgrKSBAcmVmIF9fSEFMX1NNQlVTX0RJU0FCTEU6ICAgICBEaXNhYmxlIHRoZSBTTUJVUyBwZXJpcGhlcmFsCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19HRVRfRkxBRzogICAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNQlVTIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfQ0xFQVJfRkxBRzogIENsZWFyIHRoZSBzcGVjaWZpZWQgU01CVVMgcGVuZGluZyBmbGFnCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19FTkFCTEVfSVQ6ICAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgaW50ZXJydXB0CisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19ESVNBQkxFX0lUOiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdAorCisgICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBvciBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckFkZHJDYWxsYmFjaygpCisgICAgIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKyAgICBbLi5dCisgICAgIEZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBbLi5dCisgICAgIEZvciBzcGVjaWZpYyBjYWxsYmFjayBBZGRyQ2FsbGJhY2sgdXNlIGRlZGljYXRlZCByZWdpc3RlciBjYWxsYmFja3MgOiBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckFkZHJDYWxsYmFjay4KKyAgICBbLi5dCisgICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICBAcmVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBNYXN0ZXJUeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIFNsYXZlVHhDcGx0Q2FsbGJhY2sgIDogY2FsbGJhY2sgZm9yIFNsYXZlIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIFNsYXZlUnhDcGx0Q2FsbGJhY2sgIDogY2FsbGJhY2sgZm9yIFNsYXZlIHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIExpc3RlbkNwbHRDYWxsYmFjayAgIDogY2FsbGJhY2sgZm9yIGVuZCBvZiBsaXN0ZW4gbW9kZS4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICBbLi5dCisgICAgIEZvciBjYWxsYmFjayBBZGRyQ2FsbGJhY2sgdXNlIGRlZGljYXRlZCByZWdpc3RlciBjYWxsYmFja3MgOiBAcmVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQWRkckNhbGxiYWNrLgorICAgIFsuLl0KKyAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUCisgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfU01CVVNfSW5pdCgpLyBAcmVmIEhBTF9TTUJVU19EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfU01CVVNfSW5pdCgpLyBAcmVmIEhBTF9TTUJVU19EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICBbLi5dCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICBpbiBAcmVmIEhBTF9JMkNfU1RBVEVfUkVBRFkgb3IgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9TTUJVU19EZUluaXQoKQorICAgICBvciBAcmVmIEhBTF9TTUJVU19Jbml0KCkgZnVuY3Rpb24uCisgICAgWy4uXQorICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgICAgIFsuLl0KKyAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgU01CVVMgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVMgU01CVVMKKyAgKiBAYnJpZWYgU01CVVMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19Qcml2YXRlX0RlZmluZSBTTUJVUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFRJTUlOR19DTEVBUl9NQVNLICAgKDB4RjBGRkZGRkZVTCkgICAgIC8qITwgU01CVVMgVElNSU5HIGNsZWFyIHJlZ2lzdGVyIE1hc2sgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfQUREUiAgICAoMTAwMDBVKSAgICAgICAgICAgLyohPCAxMCBzICAqLworI2RlZmluZSBIQUxfVElNRU9VVF9CVVNZICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX0RJUiAgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfUlhORSAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9TVE9QRiAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1RDICAgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfVENSICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9UWElTICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIE1BWF9OQllURV9TSVpFICAgICAgMjU1VQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX1ByaXZhdGVfRnVuY3Rpb25zIFNNQlVTIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQpOworCitzdGF0aWMgdm9pZCBTTUJVU19FbmFibGVfSVJRKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgdm9pZCBTTUJVU19EaXNhYmxlX0lSUShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEludGVycnVwdFJlcXVlc3QpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX01hc3Rlcl9JU1Ioc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBTdGF0dXNGbGFncyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfU2xhdmVfSVNSKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpOworCitzdGF0aWMgdm9pZCBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCitzdGF0aWMgdm9pZCBTTUJVU19JVEVycm9ySGFuZGxlcihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworCitzdGF0aWMgdm9pZCBTTUJVU19UcmFuc2ZlckNvbmZpZyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsICB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnMgU01CVVMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQKKyAgICAgICAgICBkZWluaXRpYWxpemUgdGhlIFNNQlVTeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfU01CVVNfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLLCBHUElPLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NNQlVTX0luaXQoKSB0byBjb25maWd1cmUgdGhlIHNlbGVjdGVkIGRldmljZSB3aXRoCisgICAgICAgICAgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb246CisgICAgICAgICgrKykgQ2xvY2sgVGltaW5nCisgICAgICAgICgrKykgQnVzIFRpbWVvdXQKKyAgICAgICAgKCsrKSBBbmFsb2cgRmlsZXIgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDEKKyAgICAgICAgKCsrKSBBZGRyZXNzaW5nIG1vZGUgKE1hc3RlciwgU2xhdmUpCisgICAgICAgICgrKykgRHVhbCBBZGRyZXNzaW5nIG1vZGUKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMiBNYXNrCisgICAgICAgICgrKykgR2VuZXJhbCBjYWxsIG1vZGUKKyAgICAgICAgKCsrKSBOb3N0cmV0Y2ggbW9kZQorICAgICAgICAoKyspIFBhY2tldCBFcnJvciBDaGVjayBtb2RlCisgICAgICAgICgrKykgUGVyaXBoZXJhbCBtb2RlCisKKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TTUJVU19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgU01CVVN4IHBlcmlwaGVyYWwuCisKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSBBbmFsb2cvRGlnaXRhbCBmaWx0ZXJzIHdpdGggSEFMX1NNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcigpIGFuZAorICAgICAgICAgIEhBTF9TTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKCkuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU01CVVMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIFNNQlVTX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0luaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBDaGVjayB0aGUgU01CVVMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhzbWJ1cyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTExfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQU5BTE9HX0ZJTFRFUihoc21idXMtPkluaXQuQW5hbG9nRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19PV05fQUREUkVTUzEoaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MxKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BRERSRVNTSU5HX01PREUoaHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19EVUFMX0FERFJFU1MoaHNtYnVzLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfT1dOX0FERFJFU1MyKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMikpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfT1dOX0FERFJFU1MyX01BU0soaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyTWFza3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0dFTkVSQUxfQ0FMTChoc21idXMtPkluaXQuR2VuZXJhbENhbGxNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19OT19TVFJFVENIKGhzbWJ1cy0+SW5pdC5Ob1N0cmV0Y2hNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19QRUMoaHNtYnVzLT5Jbml0LlBhY2tldEVycm9yQ2hlY2tNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19QRVJJUEhFUkFMX01PREUoaHNtYnVzLT5Jbml0LlBlcmlwaGVyYWxNb2RlKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhzbWJ1cy0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclR4Q3BsdENhbGxiYWNrICovCisgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoc21idXMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgID0gSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBTbGF2ZVR4Q3BsdENhbGxiYWNrICAqLworICAgIGhzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayAgPSBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlUnhDcGx0Q2FsbGJhY2sgICovCisgICAgaHNtYnVzLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgICA9IEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgTGlzdGVuQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoc21idXMtPkVycm9yQ2FsbGJhY2sgICAgICAgID0gSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgIGhzbWJ1cy0+QWRkckNhbGxiYWNrICAgICAgICAgPSBIQUxfU01CVVNfQWRkckNhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFkZHJDYWxsYmFjayAgICAgICAgICovCisKKyAgICBpZiAoaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUJVU19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMgKi8KKyAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIEhBTF9TTUJVU19Nc3BJbml0KGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NNQlVTX0RJU0FCTEUoaHNtYnVzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IFRJTUlOR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBGcmVxdWVuY3kgcmFuZ2UgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNSU5HUiA9IGhzbWJ1cy0+SW5pdC5UaW1pbmcgJiBUSU1JTkdfQ0xFQVJfTUFTSzsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IFRJTUVPVVRSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogQnVzIFRpbWVvdXQgICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPlRJTUVPVVRSICY9IH5JMkNfVElNRU9VVFJfVElNT1VURU47CisgIGhzbWJ1cy0+SW5zdGFuY2UtPlRJTUVPVVRSICY9IH5JMkNfVElNRU9VVFJfVEVYVEVOOworICBoc21idXMtPkluc3RhbmNlLT5USU1FT1VUUiA9IGhzbWJ1cy0+SW5pdC5TTUJ1c1RpbWVvdXQ7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBPd24gQWRkcmVzczEgYW5kIGFjayBvd24gYWRkcmVzczEgbW9kZSAqLworICBoc21idXMtPkluc3RhbmNlLT5PQVIxICY9IH5JMkNfT0FSMV9PQTFFTjsKKworICBpZiAoaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MxICE9IDBVTCkKKyAgeworICAgIGlmIChoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gU01CVVNfQUREUkVTU0lOR01PREVfN0JJVCkKKyAgICB7CisgICAgICBoc21idXMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MxKTsKKyAgICB9CisgICAgZWxzZSAvKiBTTUJVU19BRERSRVNTSU5HTU9ERV8xMEJJVCAqLworICAgIHsKKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgPSAoSTJDX09BUjFfT0ExRU4gfCBJMkNfT0FSMV9PQTFNT0RFIHwgaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MxKTsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IEFkZHJlc3NpbmcgTWFzdGVyIG1vZGUgKi8KKyAgaWYgKGhzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgeworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiA9IChJMkNfQ1IyX0FERDEwKTsKKyAgfQorICAvKiBFbmFibGUgdGhlIEFVVE9FTkQgYnkgZGVmYXVsdCwgYW5kIGVuYWJsZSBOQUNLIChzaG91bGQgYmUgZGlzYWJsZSBvbmx5IGR1cmluZyBTbGF2ZSBwcm9jZXNzKSAqLworICAvKiBBVVRPRU5EIGFuZCBOQUNLIGJpdCB3aWxsIGJlIG1hbmFnZSBkdXJpbmcgVHJhbnNmZXIgcHJvY2VzcyAqLworICBoc21idXMtPkluc3RhbmNlLT5DUjIgfD0gKEkyQ19DUjJfQVVUT0VORCB8IEkyQ19DUjJfTkFDSyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBPQVIyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBEdWFsIG1vZGUgYW5kIE93biBBZGRyZXNzMiAqLworICBoc21idXMtPkluc3RhbmNlLT5PQVIyID0gKGhzbWJ1cy0+SW5pdC5EdWFsQWRkcmVzc01vZGUgfCBoc21idXMtPkluaXQuT3duQWRkcmVzczIgfCAoaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyTWFza3MgPDwgOFUpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01CVVN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IEdlbmVyYWxjYWxsIGFuZCBOb1N0cmV0Y2ggbW9kZSAqLworICBoc21idXMtPkluc3RhbmNlLT5DUjEgPSAoaHNtYnVzLT5Jbml0LkdlbmVyYWxDYWxsTW9kZSB8IGhzbWJ1cy0+SW5pdC5Ob1N0cmV0Y2hNb2RlIHwgaHNtYnVzLT5Jbml0LlBhY2tldEVycm9yQ2hlY2tNb2RlIHwgaHNtYnVzLT5Jbml0LlBlcmlwaGVyYWxNb2RlIHwgaHNtYnVzLT5Jbml0LkFuYWxvZ0ZpbHRlcik7CisKKyAgLyogRW5hYmxlIFNsYXZlIEJ5dGUgQ29udHJvbCBvbmx5IGluIGNhc2Ugb2YgUGFja2V0IEVycm9yIENoZWNrIGlzIGVuYWJsZWQgYW5kIFNNQlVTIFBlcmlwaGVyYWwgaXMgc2V0IGluIFNsYXZlIG1vZGUgKi8KKyAgaWYgKChoc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUgPT0gU01CVVNfUEVDX0VOQUJMRSkKKyAgICAgICYmICgoaHNtYnVzLT5Jbml0LlBlcmlwaGVyYWxNb2RlID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19TTEFWRSkgfHwgKGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkVfQVJQKSkpCisgIHsKKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9TQkM7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU01CVVNfRU5BQkxFKGhzbWJ1cyk7CisKKyAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKyAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBTTUJVUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRGVJbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogQ2hlY2sgdGhlIFNNQlVTIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc21idXMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUxMX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgU01CVVMgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgaHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIEhBTF9TTUJVU19Nc3BEZUluaXQoaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9ICBIQUxfU01CVVNfU1RBVEVfUkVTRVQ7CisgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBTTUJVUyBNU1AuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19Nc3BJbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgU01CVVMgTVNQLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTXNwRGVJbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBBbmFsb2cgbm9pc2UgZmlsdGVyLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBBbmFsb2dGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Db25maWdBbmFsb2dGaWx0ZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTExfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQU5BTE9HX0ZJTFRFUihBbmFsb2dGaWx0ZXIpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgICAvKiBSZXNldCBBTk9GRiBiaXQgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX0FORk9GRik7CisKKyAgICAvKiBTZXQgYW5hbG9nIGZpbHRlciBiaXQqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBBbmFsb2dGaWx0ZXI7CisKKyAgICBfX0hBTF9TTUJVU19FTkFCTEUoaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBEaWdpdGFsIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBDb2VmZmljaWVudCBvZiBkaWdpdGFsIG5vaXNlIGZpbHRlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MEYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnRGlnaXRhbEZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUxMX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0RJR0lUQUxfRklMVEVSKERpZ2l0YWxGaWx0ZXIpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfQlVTWTsKKworICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLworICAgIHRtcHJlZyA9IGhzbWJ1cy0+SW5zdGFuY2UtPkNSMTsKKworICAgIC8qIFJlc2V0IEkyQyBETkYgYml0cyBbMTE6OF0gKi8KKyAgICB0bXByZWcgJj0gfihJMkNfQ1IxX0RORik7CisKKyAgICAvKiBTZXQgSTJDeCBETkYgY29lZmZpY2llbnQgKi8KKyAgICB0bXByZWcgfD0gRGlnaXRhbEZpbHRlciA8PCBJMkNfQ1IxX0RORl9Qb3M7CisKKyAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxID0gdG1wcmVnOworCisgICAgX19IQUxfU01CVVNfRU5BQkxFKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgU01CVVMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19MSVNURU5fQ09NUExFVEVfQ0JfSUQgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19SZWdpc3RlckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBTTUJVU19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChIQUxfU01CVVNfU1RBVEVfUkVBRFkgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPlNsYXZlUnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19MSVNURU5fQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPkxpc3RlbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFU0VUID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFNNQlVTIENhbGxiYWNrCisgICogICAgICAgICBTTUJVUyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBIQUxfU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFQURZID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclJ4Q3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+U2xhdmVUeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlVHhDcGx0Q2FsbGJhY2sgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlUnhDcGx0Q2FsbGJhY2sgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19MSVNURU5fQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPkxpc3RlbkNwbHRDYWxsYmFjayA9IEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBMaXN0ZW5DcGx0Q2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc21idXMtPkVycm9yQ2FsbGJhY2sgPSBIQUxfU01CVVNfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfU01CVVNfU1RBVEVfUkVTRVQgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwRGVJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgdGhlIFNsYXZlIEFkZHJlc3MgTWF0Y2ggU01CVVMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfU01CVVNfQWRkckNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQWRkcmVzcyBNYXRjaCBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgcFNNQlVTX0FkZHJDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFQURZID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBoc21idXMtPkFkZHJDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFNsYXZlIEFkZHJlc3MgTWF0Y2ggU01CVVMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEluZm8gUmVhZHkgU01CVVMgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfU01CVVNfQWRkckNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfVW5SZWdpc3RlckFkZHJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKEhBTF9TTUJVU19TVEFURV9SRUFEWSA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgaHNtYnVzLT5BZGRyQ2FsbGJhY2sgPSBIQUxfU01CVVNfQWRkckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBZGRyQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNNQlVTIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBmdW5jdGlvbiB0byBjaGVjayBpZiBkZXZpY2UgaXMgcmVhZHkgZm9yIHVzYWdlIGlzIDoKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfSXNEZXZpY2VSZWFkeSgpCisKKyAgICAoIykgVGhlcmUgaXMgb25seSBvbmUgbW9kZSBvZiB0cmFuc2ZlcjoKKyAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMuCisgICAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIHN0YXJ0dXAuCisgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgIGRlZGljYXRlZCBTTUJVUyBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZS4KKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19TbGF2ZV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQoKSBvciBhbGlhcyBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0VuYWJsZUFsZXJ0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRGlzYWJsZUFsZXJ0X0lUKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbi1CbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFg7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYnVzLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKworICAgIC8qIEluIGNhc2Ugb2YgUXVpY2sgY29tbWFuZCwgcmVtb3ZlIGF1dG9lbmQgbW9kZSAqLworICAgIC8qIE1hbmFnZSB0aGUgc3RvcCBnZW5lcmF0aW9uIGJ5IHNvZnR3YXJlICovCisgICAgaWYgKGhzbWJ1cy0+cEJ1ZmZQdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJPcHRpb25zICY9IH5TTUJVU19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgaWYgKFNpemUgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgc2l6ZSA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKChoc21idXMtPlhmZXJTaXplIDwgaHNtYnVzLT5YZmVyQ291bnQpICYmIChoc21idXMtPlhmZXJTaXplID09IE1BWF9OQllURV9TSVpFKSkKKyAgICB7CisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpLCBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0cmFuc2ZlciBkaXJlY3Rpb24gbm90IGNoYW5nZSwgZG8gbm90IGdlbmVyYXRlIFJlc3RhcnQgQ29uZGl0aW9uICovCisgICAgICAvKiBNZWFuIFByZXZpb3VzIHN0YXRlIGlzIHNhbWUgYXMgY3VycmVudCBzdGF0ZSAqLworCisgICAgICAvKiBTdG9yZSBjdXJyZW50IHZvbGF0aWxlIFhmZXJPcHRpb25zLCBtaXNyYSBydWxlICovCisgICAgICB0bXAgPSBoc21idXMtPlhmZXJPcHRpb25zOworCisgICAgICBpZiAoKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpICYmIChJU19TTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QodG1wKSA9PSAwKSkKKyAgICAgIHsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgfQorICAgICAgLyogRWxzZSB0cmFuc2ZlciBkaXJlY3Rpb24gY2hhbmdlLCBzbyBnZW5lcmF0ZSBSZXN0YXJ0IHdpdGggbmV3IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICAgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgICAgICAvKiBIYW5kbGUgVHJhbnNmZXIgKi8KKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSk7CisgICAgICB9CisKKyAgICAgIC8qIElmIFBFQyBtb2RlIGlzIGVuYWJsZSwgc2l6ZSB0byB0cmFuc21pdCBtYW5hZ2UgYnkgU1cgcGFydCBzaG91bGQgYmUgU2l6ZS0xIGJ5dGUsIGNvcnJlc3BvbmRpbmcgdG8gUEVDIGJ5dGUgKi8KKyAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgaWYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlg7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogSW4gY2FzZSBvZiBRdWljayBjb21tYW5kLCByZW1vdmUgYXV0b2VuZCBtb2RlICovCisgICAgLyogTWFuYWdlIHRoZSBzdG9wIGdlbmVyYXRpb24gYnkgc29mdHdhcmUgKi8KKyAgICBpZiAoaHNtYnVzLT5wQnVmZlB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgJj0gflNNQlVTX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPCBoc21idXMtPlhmZXJDb3VudCkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgU01CVVNfUkVMT0FEX01PREUgIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpLCBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisKKyAgICAgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgWGZlck9wdGlvbnMsIE1pc3JhIHJ1bGUgKi8KKyAgICAgIHRtcCA9IGhzbWJ1cy0+WGZlck9wdGlvbnM7CisKKyAgICAgIGlmICgoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkgJiYgKElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVCh0bXApID09IDApKQorICAgICAgeworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICAvKiBFbHNlIHRyYW5zZmVyIGRpcmVjdGlvbiBjaGFuZ2UsIHNvIGdlbmVyYXRlIFJlc3RhcnQgd2l0aCBuZXcgdHJhbnNmZXIgZGlyZWN0aW9uICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgICBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoc21idXMpOworCisgICAgICAgIC8qIEhhbmRsZSBUcmFuc2ZlciAqLworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIFNNQlVTX0VuYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IGEgbWFzdGVyL2hvc3QgU01CVVMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0LgorICAqIEBub3RlICAgVGhpcyBhYm9ydCBjYW4gYmUgY2FsbGVkIG9ubHkgaWYgc3RhdGUgaXMgcmVhZHkKKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9BYm9ydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MpCit7CisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgLyogS2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBwcmV2aW91cyAqLworICAgIC8qIHRvIHBlcmZvcm0gYXMgd2VsbCB0aGUgY2FsbCBvZiB0aGUgY29ycmVzcG9uZGluZyBlbmQgb2YgdHJhbnNmZXIgY2FsbGJhY2sgKi8KKyAgICBpZiAoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYOworICAgIH0KKyAgICBlbHNlIGlmIChoc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcm9uZyB1c2FnZSBvZiBhYm9ydCBmdW5jdGlvbiAqLworICAgICAgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBvbmx5IGluIGNhc2Ugb2YgYWJvcnQgbW9uaXRvcmVkIGJ5IG1hc3RlciBkZXZpY2UgKi8KKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIDEgdG8gZ2VuZXJhdGUgYSBkdW1teSByZWFkIG9uIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBTZXQgQVVUT0VORCBtb2RlLCB0aGlzIHdpbGwgZ2VuZXJhdGUgYSBOQUNLIHRoZW4gU1RPUCBjb25kaXRpb24gdG8gYWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNmZXIgKi8KKyAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsIDEsIFNNQlVTX0FVVE9FTkRfTU9ERSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworICAgIH0KKyAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVUwpKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIgfCBTTUJVU19JVF9UWCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSAoSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFggfCBIQUxfU01CVVNfU1RBVEVfTElTVEVOKTsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IFNCQyBiaXQgdG8gbWFuYWdlIEFja25vd2xlZGdlIGF0IGVhY2ggYml0ICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfU0JDOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgIGlmIChTaXplID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIHNpemUgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA8IGhzbWJ1cy0+WGZlckNvdW50KSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSBNQVhfTkJZVEVfU0laRSkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBTTUJVU19SRUxPQURfTU9ERSB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBOQllURSB0byB0cmFuc21pdCAqLworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgYWZ0ZXIgcHJlcGFyZSB0aGUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIC8qIFRoaXMgYWN0aW9uIHdpbGwgZ2VuZXJhdGUgYW4gYWNrbm93bGVkZ2UgdG8gdGhlIEhPU1QgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRERSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIFJFbmFibGUgQUREUiBpbnRlcnJ1cHQgKi8KKyAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFggfCBTTUJVU19JVF9BRERSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9SZWNlaXZlX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFVMKSkKKyAgICB7CisgICAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSIHwgU01CVVNfSVRfUlgpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gKEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYIHwgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTik7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCBTQkMgYml0IHRvIG1hbmFnZSBBY2tub3dsZWRnZSBhdCBlYWNoIGJpdCAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1NCQzsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYnVzLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKworICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICAvKiBTZXQgTkJZVEUgdG8gcmVjZWl2ZSAqLworICAgIC8qIElmIFhmZXJTaXplIGVxdWFsICIxIiwgb3IgWGZlclNpemUgZXF1YWwgIjIiIHdpdGggUEVDIHJlcXVlc3RlZCAobWVhbiAxIGRhdGEgYnl0ZSArIDEgUEVDIGJ5dGUgKi8KKyAgICAvKiBubyBuZWVkIHRvIHNldCBSRUxPQUQgYml0IG1vZGUsIGEgQUNLIHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW4gdGhhdCBjYXNlICovCisgICAgLyogZWxzZSBuZWVkIHRvIHNldCBSRUxPQUQgYml0IG1vZGUgdG8gZ2VuZXJhdGUgYW4gYXV0b21hdGljIEFDSyBhdCBlYWNoIGJ5dGUgUmVjZWl2ZWQgKi8KKyAgICAvKiBUaGlzIFJFTE9BRCBiaXQgd2lsbCBiZSByZXNldCBmb3IgbGFzdCBCWVRFIHRvIGJlIHJlY2VpdmUgaW4gU01CVVNfU2xhdmVfSVNSICovCisgICAgaWYgKCgoU01CVVNfR0VUX1BFQ19NT0RFKGhzbWJ1cykgIT0gMFVMKSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSAyVSkpIHx8IChoc21idXMtPlhmZXJTaXplID09IDFVKSkKKyAgICB7CisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsIDEsIGhzbWJ1cy0+WGZlck9wdGlvbnMgfCBTTUJVU19SRUxPQURfTU9ERSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgYWZ0ZXIgcHJlcGFyZSB0aGUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIC8qIFRoaXMgYWN0aW9uIHdpbGwgZ2VuZXJhdGUgYW4gYWNrbm93bGVkZ2UgdG8gdGhlIEhPU1QgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRERSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIE5vdGUgOiBUaGUgU01CVVMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIC8qIFJFbmFibGUgQUREUiBpbnRlcnJ1cHQgKi8KKyAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlggfCBTTUJVU19JVF9BRERSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9MSVNURU47CisKKyAgLyogRW5hYmxlIHRoZSBBZGRyZXNzIE1hdGNoIGludGVycnVwdCAqLworICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIERpc2FibGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBvbmx5IGlmIGEgdHJhbnNmZXIgaXMgbm90IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBBZGRyZXNzIE1hdGNoIGludGVycnVwdCAqLworICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUik7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgU01CVVMgYWxlcnQgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTeCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0VuYWJsZUFsZXJ0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogRW5hYmxlIFNNQnVzIGFsZXJ0ICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX0FMRVJURU47CisKKyAgLyogQ2xlYXIgQUxFUlQgZmxhZyAqLworICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BTEVSVCk7CisKKyAgLyogRW5hYmxlIEFsZXJ0IEludGVycnVwdCAqLworICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUxFUlQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFNNQlVTIGFsZXJ0IG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVU3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EaXNhYmxlQWxlcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBFbmFibGUgU01CdXMgYWxlcnQgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX0FMRVJURU47CisKKyAgLyogRGlzYWJsZSBBbGVydCBJbnRlcnJ1cHQgKi8KKyAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BTEVSVCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBUcmlhbHMgTnVtYmVyIG9mIHRyaWFscworICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfSXNEZXZpY2VSZWFkeShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQzMl90IFRyaWFscywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIF9fSU8gdWludDMyX3QgU01CVVNfVHJpYWxzID0gMFVMOworCisgIEZsYWdTdGF0dXMgdG1wMTsKKyAgRmxhZ1N0YXR1cyB0bXAyOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQlVTWSkgIT0gUkVTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICBkbworICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIFN0YXJ0ICovCisgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgPSBTTUJVU19HRU5FUkFURV9TVEFSVChoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUsIERldkFkZHJlc3MpOworCisgICAgICAvKiBObyBuZWVkIHRvIENoZWNrIFRDIGZsYWcsIHdpdGggQVVUT0VORCBtb2RlIHRoZSBzdG9wIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkICovCisgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0IG9yIGEgTkFDSyBmbGFnIGlzIHNldCovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICB0bXAxID0gX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKyAgICAgIHRtcDIgPSBfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworCisgICAgICB3aGlsZSAoKHRtcDEgPT0gUkVTRVQpICYmICh0bXAyID09IFJFU0VUKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEZXZpY2UgaXMgcmVhZHkgKi8KKyAgICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBTTUJVUyBlcnJvciBjb2RlICovCisgICAgICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSEFMVElNRU9VVDsKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcDEgPSBfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgICB0bXAyID0gX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIE5BQ0tGIGZsYWcgaGFzIG5vdCBiZWVuIHNldCAqLworICAgICAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRikgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKworICAgICAgICAvKiBEZXZpY2UgaXMgcmVhZHkgKi8KKyAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcsIGF1dG8gZ2VuZXJhdGVkIHdpdGggYXV0b2VuZCovCisgICAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgdHJpYWxzIGhhcyBiZWVuIHJlYWNoZWQgKi8KKyAgICAgIGlmIChTTUJVU19UcmlhbHMgPT0gVHJpYWxzKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBTdG9wICovCisgICAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgfQorCisgICAgICAvKiBJbmNyZW1lbnQgVHJpYWxzICovCisgICAgICBTTUJVU19UcmlhbHMrKzsKKyAgICB9CisgICAgd2hpbGUgKFNNQlVTX1RyaWFscyA8IFRyaWFscyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgLyogVXBkYXRlIFNNQlVTIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSEFMVElNRU9VVDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0lSUV9IYW5kbGVyX2FuZF9DYWxsYmFja3MgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUJVUyBldmVudCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01CVVNfRVZfSVJRSGFuZGxlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFVzZSBhIGxvY2FsIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBjdXJyZW50IElTUiBmbGFncyAqLworICAvKiBUaGlzIGFjdGlvbiB3aWxsIGF2b2lkIGEgd3JvbmcgdHJlYXRtZW50IGR1ZSB0byBJU1IgZmxhZ3MgY2hhbmdlIGR1cmluZyBpbnRlcnJ1cHQgaGFuZGxlciAqLworICB1aW50MzJfdCB0bXBpc3J2YWx1ZSA9IFJFQURfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IHRtcGNyMXZhbHVlID0gUkVBRF9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBTTUJVUyBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCAoU01CVVNfSVRfVENJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1RYSSkpICE9IFJFU0VUKSAmJiAoKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVFhJUykgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpKSkKKyAgeworICAgIC8qIFNsYXZlIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgeworICAgICAgKHZvaWQpU01CVVNfU2xhdmVfSVNSKGhzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICAvKiBNYXN0ZXIgbW9kZSBzZWxlY3RlZCAqLworICAgIGVsc2UgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgKHZvaWQpU01CVVNfTWFzdGVyX0lTUihoc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKworICAvKiBTTUJVUyBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgKFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9SWEkpKSAhPSBSRVNFVCkgJiYgKChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1JYTkUpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UQ1IpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UQykgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKSkpCisgIHsKKyAgICAvKiBTbGF2ZSBtb2RlIHNlbGVjdGVkICovCisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKQorICAgIHsKKyAgICAgICh2b2lkKVNNQlVTX1NsYXZlX0lTUihoc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgICAgLyogTWFzdGVyIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBlbHNlIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgICh2b2lkKVNNQlVTX01hc3Rlcl9JU1IoaHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisKKyAgLyogU01CVVMgaW4gbW9kZSBMaXN0ZW5lciBPbmx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBTTUJVU19JVF9BRERSSSkgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIFNNQlVTX0lUX1NUT1BJKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgU01CVVNfSVRfTkFDS0kpICE9IFJFU0VUKSkgJiYgKChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FERFIpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpKQorICB7CisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAodm9pZClTTUJVU19TbGF2ZV9JU1IoaHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTIGVycm9yIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUJVU19FUl9JUlFIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgU01CVVNfSVRFcnJvckhhbmRsZXIoaHNtYnVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKiBAYnJpZWYgIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBUcmFuc2ZlckRpcmVjdGlvbiBNYXN0ZXIgcmVxdWVzdCBUcmFuc2ZlciBEaXJlY3Rpb24gKFdyaXRlL1JlYWQpCisgICogQHBhcmFtICBBZGRyTWF0Y2hDb2RlIEFkZHJlc3MgTWF0Y2ggQ29kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX0FkZHJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisgIFVOVVNFRChUcmFuc2ZlckRpcmVjdGlvbik7CisgIFVOVVNFRChBZGRyTWF0Y2hDb2RlKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01CVVMgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbAorICAgIGFuZCB0aGUgZGF0YSBmbG93LgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU01CVVMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK3VpbnQzMl90IEhBTF9TTUJVU19HZXRTdGF0ZShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFJldHVybiBTTUJVUyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhzbWJ1cy0+U3RhdGU7Cit9CisKKy8qKgorKiBAYnJpZWYgIFJldHVybiB0aGUgU01CVVMgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyogQHJldHZhbCBTTUJVUyBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX1NNQlVTX0dldEVycm9yKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgcmV0dXJuIGhzbWJ1cy0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVNfUHJpdmF0ZV9GdW5jdGlvbnMgU01CVVMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIE1hc3RlciBNb2RlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBTdGF0dXNGbGFncyBWYWx1ZSBvZiBJbnRlcnJ1cHQgRmxhZ3MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfTWFzdGVyX0lTUihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IFN0YXR1c0ZsYWdzKQoreworICB1aW50MTZfdCBEZXZBZGRyZXNzOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAvKiBTZXQgY29ycmVzcG9uZGluZyBFcnJvciBDb2RlICovCisgICAgLyogTm8gbmVlZCB0byBnZW5lcmF0ZSBTVE9QLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQUNLRjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIENhbGwgdGhlIEVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICBIQUxfU01CVVNfRXJyb3JDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBhbmQgdHJlYXQgZXJyb3JzIGlmIGVycm9ycyBvY2N1cnMgZHVyaW5nIFNUT1AgcHJvY2VzcyAqLworICAgIFNNQlVTX0lURXJyb3JIYW5kbGVyKGhzbWJ1cyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworCisgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKworICAgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgICBTTUJVU19SRVNFVF9DUjIoaHNtYnVzKTsKKworICAgICAgLyogRmx1c2ggcmVtYWluaW5nIGRhdGEgaW4gRmlmbyByZWdpc3RlciBpbiBjYXNlIG9mIGVycm9yIG9jY3VycyBiZWZvcmUgVFhFbXB0eSAqLworICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogUkVlbmFibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgICAgIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1JYTkUpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAgICpoc21idXMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWJ1cy0+SW5zdGFuY2UtPlJYRFIpOworCisgICAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAgICAgaWYgKChoc21idXMtPlhmZXJTaXplID4gMFUpKQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworCisgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKworICAgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgICBTTUJVU19SRVNFVF9DUjIoaHNtYnVzKTsKKworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgKmhzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAvKiBJbmNyZW1lbnQgU2l6ZSBjb3VudGVyICovCisgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPlRYRFIgPSAqaHNtYnVzLT5wQnVmZlB0cjsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgIC8qIEluY3JlbWVudCBTaXplIGNvdW50ZXIgKi8KKyAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgRGV2QWRkcmVzcyA9ICh1aW50MTZfdCkoaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9TQUREKTsKKworICAgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgTUFYX05CWVRFX1NJWkUsIChTTUJVU19SRUxPQURfTU9ERSB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSksIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IGhzbWJ1cy0+WGZlckNvdW50OworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIGhzbWJ1cy0+WGZlck9wdGlvbnMsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgIC8qIElmIFBFQyBtb2RlIGlzIGVuYWJsZSwgc2l6ZSB0byB0cmFuc21pdCBzaG91bGQgYmUgU2l6ZS0xIGJ5dGUsIGNvcnJlc3BvbmRpbmcgdG8gUEVDIGJ5dGUgKi8KKyAgICAgICAgLyogUEVDIGJ5dGUgaXMgYXV0b21hdGljYWxseSBzZW50IGJ5IEhXIGJsb2NrLCBubyBuZWVkIHRvIG1hbmFnZSBpdCBpbiBUcmFuc21pdCBwcm9jZXNzICovCisgICAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSAwVUwpCisgICAgICAgIHsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpICYmIChoc21idXMtPlhmZXJTaXplID09IDBVKSkKKyAgICB7CisgICAgICAvKiBDYWxsIFR4Q3BsdENhbGxiYWNrKCkgaWYgbm8gc3RvcCBtb2RlIGlzIHNldCAqLworICAgICAgaWYgKFNNQlVTX0dFVF9TVE9QX01PREUoaHNtYnVzKSAhPSBTTUJVU19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICAgICAgeworICAgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19UQykgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogU3BlY2lmaWMgdXNlIGNhc2UgZm9yIFF1aWNrIGNvbW1hbmQgKi8KKyAgICAgIGlmIChoc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIGEgU3RvcCBjb21tYW5kICovCisgICAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisgICAgICB9CisgICAgICAvKiBDYWxsIFR4Q3BsdENhbGxiYWNrKCkgaWYgbm8gc3RvcCBtb2RlIGlzIHNldCAqLworICAgICAgZWxzZSBpZiAoU01CVVNfR0VUX1NUT1BfTU9ERShoc21idXMpICE9IFNNQlVTX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogTm8gR2VuZXJhdGUgU3RvcCwgdG8gcGVybWl0IHJlc3RhcnQgbW9kZSAqLworICAgICAgICAvKiBUaGUgc3RvcCB3aWxsIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiB0cmFuc2Zlciwgd2hlbiBTTUJVU19BVVRPRU5EX01PREUgZW5hYmxlICovCisKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgICAgICB7CisgICAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisgICAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIFN0YXR1c0ZsYWdzIFZhbHVlIG9mIEludGVycnVwdCBGbGFncy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19TbGF2ZV9JU1Ioc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBTdGF0dXNGbGFncykKK3sKKyAgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbjsKKyAgdWludDE2X3QgU2xhdmVBZGRyQ29kZTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgdGhhdCBTTUJVUyB0cmFuc2ZlciBmaW5pc2hlZCAqLworICAgIC8qIGlmIHllcywgbm9ybWFsIHVzZWNhc2UsIGEgTkFDSyBpcyBzZW50IGJ5IHRoZSBIT1NUIHdoZW4gVHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKyAgICAvKiBNZWFuIFhmZXJDb3VudCA9PSAwKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogaWYgbm8sIGVycm9yIHVzZWNhc2UsIGEgTm9uLUFja25vd2xlZGdlIG9mIGxhc3QgRGF0YSBpcyBnZW5lcmF0ZWQgYnkgdGhlIEhPU1QqLworICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAgIC8qIFNldCBIQUwgU3RhdGUgdG8gIklkbGUiIFN0YXRlLCBtZWFuIHRvIExJU1RFTiBzdGF0ZSAqLworICAgICAgLyogU28gcmVzZXQgU2xhdmUgQnVzeSBzdGF0ZSAqLworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpOworICAgICAgaHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCk7CisKKyAgICAgIC8qIERpc2FibGUgUlgvVFggSW50ZXJydXB0cywga2VlcCBvbmx5IEFERFIgSW50ZXJydXB0ICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYIHwgU01CVVNfSVRfVFgpOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BQ0tGOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc21idXMtPkVycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfU01CVVNfRXJyb3JDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfQUREUikgIT0gUkVTRVQpCisgIHsKKyAgICBUcmFuc2ZlckRpcmVjdGlvbiA9ICh1aW50OF90KShTTUJVU19HRVRfRElSKGhzbWJ1cykpOworICAgIFNsYXZlQWRkckNvZGUgPSAodWludDE2X3QpKFNNQlVTX0dFVF9BRERSX01BVENIKGhzbWJ1cykpOworCisgICAgLyogRGlzYWJsZSBBRERSIGludGVycnVwdCB0byBwcmV2ZW50IG11bHRpcGxlIEFERFJJbnRlcnJ1cHQqLworICAgIC8qIE90aGVyIEFERFJJbnRlcnJ1cHQgd2lsbCBiZSB0cmVhdCBpbiBuZXh0IExpc3RlbiB1c2VjYXNlICovCisgICAgX19IQUxfU01CVVNfRElTQUJMRV9JVChoc21idXMsIFNNQlVTX0lUX0FERFJJKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzbWJ1cy0+QWRkckNhbGxiYWNrKGhzbWJ1cywgVHJhbnNmZXJEaXJlY3Rpb24sIFNsYXZlQWRkckNvZGUpOworI2Vsc2UKKyAgICBIQUxfU01CVVNfQWRkckNhbGxiYWNrKGhzbWJ1cywgVHJhbnNmZXJEaXJlY3Rpb24sIFNsYXZlQWRkckNvZGUpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZSBpZiAoKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpKQorICB7CisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKQorICAgIHsKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICpoc21idXMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWJ1cy0+SW5zdGFuY2UtPlJYRFIpOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKworICAgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDFVKQorICAgICAgeworICAgICAgICAvKiBSZWNlaXZlIGxhc3QgQnl0ZSwgY2FuIGJlIFBFQyBieXRlIGluIGNhc2Ugb2YgUEVDIEJZVEUgZW5hYmxlZCAqLworICAgICAgICAvKiBvciBvbmx5IHRoZSBsYXN0IEJ5dGUgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgLyogU28gcmVzZXQgdGhlIFJFTE9BRCBiaXQgbW9kZSAqLworICAgICAgICBoc21idXMtPlhmZXJPcHRpb25zICY9IH5TTUJVU19SRUxPQURfTU9ERTsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAxLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIExhc3QgQnl0ZSBpcyByZWNlaXZlZCwgZGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCk7CisKKyAgICAgICAgLyogUmVtb3ZlIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYLCBrZWVwIG9ubHkgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTiAqLworICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICBoc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBoc21idXMtPlNsYXZlUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICAgIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IFJlbG9hZCBmb3IgbmV4dCBCeXRlcyAqLworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsIDEsIFNNQlVTX1JFTE9BRF9NT0RFICB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKworICAgICAgICAvKiBBY2sgbGFzdCBCeXRlIFJlYWQgKi8KKyAgICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKQorICAgIHsKKyAgICAgIGlmICgoaHNtYnVzLT5YZmVyQ291bnQgIT0gMFUpICYmIChoc21idXMtPlhmZXJTaXplID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIDAsIE1BWF9OQllURV9TSVpFLCAoU01CVVNfUkVMT0FEX01PREUgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSkpLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplID0gaHNtYnVzLT5YZmVyQ291bnQ7CisgICAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgICAgIC8qIElmIFBFQyBtb2RlIGlzIGVuYWJsZSwgc2l6ZSB0byB0cmFuc21pdCBzaG91bGQgYmUgU2l6ZS0xIGJ5dGUsIGNvcnJlc3BvbmRpbmcgdG8gUEVDIGJ5dGUgKi8KKyAgICAgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgICAgICBpZiAoU01CVVNfR0VUX1BFQ19NT0RFKGhzbWJ1cykgIT0gMFVMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfVFhJUykgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgb25seSBpZiBYZmVyQ291bnQgbm90IHJlYWNoICIwIiAqLworICAgIC8qIEEgVFhJUyBmbGFnIGNhbiBiZSBzZXQsIGR1cmluZyBTVE9QIHRyZWF0bWVudCAgICAgICovCisgICAgLyogQ2hlY2sgaWYgYWxsIERhdGEgaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB0aGlzIGxhc3Qgd3JpdGUgaW4gVFhEUiBpcyBub3Qgc2VudCwgY29ycmVzcG9uZCB0byBhIGR1bW15IFRYSVMgZXZlbnQgKi8KKyAgICBpZiAoaHNtYnVzLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPlRYRFIgPSAqaHNtYnVzLT5wQnVmZlB0cjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgfQorCisgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgLyogUmVtb3ZlIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYLCBrZWVwIG9ubHkgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTiAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9UWCk7CisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgaHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzbWJ1cy0+U2xhdmVUeENwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogQ2hlY2sgaWYgU1RPUEYgaXMgc2V0ICovCisgIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkKKyAgeworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogU3RvcmUgTGFzdCByZWNlaXZlIGRhdGEgaWYgYW55ICovCisgICAgICBpZiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1JYTkUpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAgICpoc21idXMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWJ1cy0+SW5zdGFuY2UtPlJYRFIpOworCisgICAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAgICAgaWYgKChoc21idXMtPlhmZXJTaXplID4gMFUpKQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBSWCBhbmQgVFggSW50ZXJydXB0cyAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCB8IFNNQlVTX0lUX1RYKTsKKworICAgICAgLyogRGlzYWJsZSBBRERSIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSKTsKKworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIFNNQlVTX1JFU0VUX0NSMihoc21idXMpOworCisgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKworICAgICAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRERSKTsKKworICAgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IDA7CisgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjaywgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgTGlzdGVuIHVzZWNhc2UgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGVuYWJsaW5nIG9mIEludGVycnVwdHMuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIEludGVycnVwdFJlcXVlc3QgVmFsdWUgb2YgQHJlZiBTTUJVU19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIHZvaWQgU01CVVNfRW5hYmxlX0lSUShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEludGVycnVwdFJlcXVlc3QpCit7CisgIHVpbnQzMl90IHRtcGlzciA9IDBVTDsKKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9BTEVSVCkgPT0gU01CVVNfSVRfQUxFUlQpCisgIHsKKyAgICAvKiBFbmFibGUgRVJSIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUREUikgPT0gU01CVVNfSVRfQUREUikKKyAgeworICAgIC8qIEVuYWJsZSBBRERSLCBTVE9QIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9BRERSSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9FUlJJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfVFgpID09IFNNQlVTX0lUX1RYKQorICB7CisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFJYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSSB8IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9UWEk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9SWCkgPT0gU01CVVNfSVRfUlgpCisgIHsKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJIHwgU01CVVNfSVRfVENJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1JYSTsKKyAgfQorCisgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCB0aGUgcmlzayBvZiBTTUJVUyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgKi8KKyAgLyogYWxsIGludGVycnVwdHMgcmVxdWVzdGVkIGRvbmUgKi8KKyAgX19IQUxfU01CVVNfRU5BQkxFX0lUKGhzbWJ1cywgdG1waXNyKTsKK30KKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBkaXNhYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19EaXNhYmxlX0lSUShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEludGVycnVwdFJlcXVlc3QpCit7CisgIHVpbnQzMl90IHRtcGlzciA9IDBVTDsKKyAgdWludDMyX3QgdG1wc3RhdGUgPSBoc21idXMtPlN0YXRlOworCisgIGlmICgodG1wc3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKSAmJiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9BTEVSVCkgPT0gU01CVVNfSVRfQUxFUlQpKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9UWCkgPT0gU01CVVNfSVRfVFgpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDLCBTVE9QLCBOQUNLIGFuZCBUWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1RYSTsKKworICAgIGlmICgoU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaHNtYnVzKSA9PSAwVUwpCisgICAgICAgICYmICgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJOworICAgIH0KKworICAgIGlmICgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgU1RPUCBhbmQgTkFDSyBpbnRlcnJ1cHQgKi8KKyAgICAgIHRtcGlzciB8PSBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJOworICAgIH0KKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX1JYKSA9PSBTTUJVU19JVF9SWCkKKyAgeworICAgIC8qIERpc2FibGUgVEMsIFNUT1AsIE5BQ0sgYW5kIFJYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfVENJIHwgU01CVVNfSVRfUlhJOworCisgICAgaWYgKChTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChoc21idXMpID09IDBVTCkKKyAgICAgICAgJiYgKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9TTUJVU19TVEFURV9MSVNURU4pKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgICAgfQorCisgICAgaWYgKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBTVE9QIGFuZCBOQUNLIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0k7CisgICAgfQorICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUREUikgPT0gU01CVVNfSVRfQUREUikKKyAgeworICAgIC8qIERpc2FibGUgQUREUiwgU1RPUCBhbmQgTkFDSyBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfQUREUkkgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJOworCisgICAgaWYgKFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKGhzbWJ1cykgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCBhIGJyZWFraW5nIHNpdHVhdGlvbiBsaWtlIGF0ICJ0IiB0aW1lICovCisgIC8qIGFsbCBkaXNhYmxlIGludGVycnVwdHMgcmVxdWVzdCBhcmUgbm90IGRvbmUgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRV9JVChoc21idXMsIHRtcGlzcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU01CVVMgaW50ZXJydXB0cyBlcnJvciBoYW5kbGVyLgorICAqIEBwYXJhbSAgaHNtYnVzIFNNQlVTIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQlVTX0lURXJyb3JIYW5kbGVyKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgdWludDMyX3QgaXRmbGFncyAgID0gUkVBRF9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgaXRzb3VyY2VzID0gUkVBRF9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgdG1wc3RhdGU7CisgIHVpbnQzMl90IHRtcGVycm9yOworCisgIC8qIFNNQlVTIEJ1cyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfQkVSUikgPT0gU01CVVNfRkxBR19CRVJSKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0JFUlI7CisKKyAgICAvKiBDbGVhciBCRVJSIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19CRVJSKTsKKyAgfQorCisgIC8qIFNNQlVTIE92ZXItUnVuL1VuZGVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX09WUikgPT0gU01CVVNfRkxBR19PVlIpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfT1ZSOworCisgICAgLyogQ2xlYXIgT1ZSIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19PVlIpOworICB9CisKKyAgLyogU01CVVMgQXJiaXRyYXRpb24gTG9zcyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfQVJMTykgPT0gU01CVVNfRkxBR19BUkxPKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0FSTE87CisKKyAgICAvKiBDbGVhciBBUkxPIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BUkxPKTsKKyAgfQorCisgIC8qIFNNQlVTIFRpbWVvdXQgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX1RJTUVPVVQpID09IFNNQlVTX0ZMQUdfVElNRU9VVCkgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9CVVNUSU1FT1VUOworCisgICAgLyogQ2xlYXIgVElNRU9VVCBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfVElNRU9VVCk7CisgIH0KKworICAvKiBTTUJVUyBBbGVydCBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19BTEVSVCkgPT0gU01CVVNfRkxBR19BTEVSVCkgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BTEVSVDsKKworICAgIC8qIENsZWFyIEFMRVJUIGZsYWcgKi8KKyAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BTEVSVCk7CisgIH0KKworICAvKiBTTUJVUyBQYWNrZXQgRXJyb3IgQ2hlY2sgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19QRUNFUlIpID09IFNNQlVTX0ZMQUdfUEVDRVJSKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX1BFQ0VSUjsKKworICAgIC8qIENsZWFyIFBFQyBlcnJvciBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfUEVDRVJSKTsKKyAgfQorCisgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaHNtYnVzLT5TdGF0ZSwgbWlzcmEgcnVsZSAqLworICB0bXBlcnJvciA9IGhzbWJ1cy0+RXJyb3JDb2RlOworCisgIC8qIENhbGwgdGhlIEVycm9yIENhbGxiYWNrIGluIGNhc2Ugb2YgRXJyb3IgZGV0ZWN0ZWQgKi8KKyAgaWYgKCh0bXBlcnJvciAhPSBIQUxfU01CVVNfRVJST1JfTk9ORSkgJiYgKHRtcGVycm9yICE9IEhBTF9TTUJVU19FUlJPUl9BQ0tGKSkKKyAgeworICAgIC8qIERvIG5vdCBSZXNldCB0aGUgSEFMIHN0YXRlIGluIGNhc2Ugb2YgQUxFUlQgZXJyb3IgKi8KKyAgICBpZiAoKHRtcGVycm9yICYgSEFMX1NNQlVTX0VSUk9SX0FMRVJUKSAhPSBIQUxfU01CVVNfRVJST1JfQUxFUlQpCisgICAgeworICAgICAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBoc21idXMtPlN0YXRlLCBtaXNyYSBydWxlICovCisgICAgICB0bXBzdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisKKyAgICAgIGlmICgoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKQorICAgICAgICAgIHx8ICgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkgPT0gSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpKQorICAgICAgeworICAgICAgICAvKiBSZXNldCBvbmx5IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1hYICovCisgICAgICAgIC8qIGtlZXAgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTiBpZiBzZXQgKi8KKyAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc21idXMtPkVycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFNNQlVTIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgVGhlIG5ldyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoRmxhZ1N0YXR1cykoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBGbGFnKSkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVTCkpCisgICAgICB7CisgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogVXBkYXRlIFNNQlVTIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0hBTFRJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNNQlVTeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBTTUJVUyBoYW5kbGUuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIHNwZWNpZmllcyB0aGUgc2xhdmUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgU2l6ZSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9ncmFtbWVkLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LgorICAqIEBwYXJhbSAgTW9kZSBOZXcgc3RhdGUgb2YgdGhlIFNNQlVTIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX1JFTE9BRF9NT0RFIEVuYWJsZSBSZWxvYWQgbW9kZS4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0FVVE9FTkRfTU9ERSBFbmFibGUgQXV0b21hdGljIGVuZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfU09GVEVORF9NT0RFIEVuYWJsZSBTb2Z0d2FyZSBlbmQgbW9kZSBhbmQgUmVsb2FkIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19TRU5EUEVDX01PREUgRW5hYmxlIFBhY2tldCBFcnJvciBDYWxjdWxhdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUmVxdWVzdCBOZXcgc3RhdGUgb2YgdGhlIFNNQlVTIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX05PX1NUQVJUU1RPUCBEb24ndCBHZW5lcmF0ZSBzdG9wIGFuZCBzdGFydCBjb25kaXRpb24uCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19HRU5FUkFURV9TVE9QIEdlbmVyYXRlIHN0b3AgY29uZGl0aW9uIChTaXplIHNob3VsZCBiZSBzZXQgdG8gMCkuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19UcmFuc2ZlckNvbmZpZyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsICB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TTUJVU19BTExfSU5TVEFOQ0UoaHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfTU9ERShNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19UUkFOU0ZFUl9SRVFVRVNUKFJlcXVlc3QpKTsKKworICAvKiB1cGRhdGUgQ1IyIHJlZ2lzdGVyICovCisgIE1PRElGWV9SRUcoaHNtYnVzLT5JbnN0YW5jZS0+Q1IyLCAoKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX0FVVE9FTkQgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVUwgLSBJMkNfQ1IyX1JEX1dSTl9Qb3MpKSkgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9TVE9QICB8IEkyQ19DUjJfUEVDQllURSkpLCBcCisgICAgICAgICAgICAgKHVpbnQzMl90KSgoKHVpbnQzMl90KURldkFkZHJlc3MgJiBJMkNfQ1IyX1NBREQpIHwgKCgodWludDMyX3QpU2l6ZSA8PCBJMkNfQ1IyX05CWVRFU19Qb3MpICYgSTJDX0NSMl9OQllURVMpIHwgKHVpbnQzMl90KU1vZGUgfCAodWludDMyX3QpUmVxdWVzdCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgU01CVVN4IE9USEVSX3h4eCBYZmVyT3B0aW9ucyB0byBmdW5jdGlvbm5hbCBYZmVyT3B0aW9ucy4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBTTUJVUyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQyAgICovCisgIC8qIGl0IHJlcXVlc3QgaW1wbGljaXRseSB0byBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19GSVJTVF9GUkFNRSAgICAgICAgICAgICAgICAgICovCisgIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9GUkFNRTsKKyAgfQorICAvKiBlbHNlIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDICovCisgIC8qIGl0IHJlcXVlc3QgaW1wbGljaXRseSB0byBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uICAgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX0ZJUlNUX0ZSQU1FIHwgU01CVVNfU0VORFBFQ19NT0RFICAqLworICBlbHNlIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDKQorICB7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFNNQlVTX0ZJUlNUX0ZSQU1FIHwgU01CVVNfU0VORFBFQ19NT0RFOworICB9CisgIC8qIGVsc2UgaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICovCisgIC8qIGl0IHJlcXVlc3QgaW1wbGljaXRseSB0byBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uICAgICAgICAgICAgICovCisgIC8qIHRoZW4gZ2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbiBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyICAgICAgICAgICAgICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUMgICAgICAgICAgICAgICovCisgIGVsc2UgaWYgKGhzbWJ1cy0+WGZlck9wdGlvbnMgPT0gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfTk9fUEVDKQorICB7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQzsKKyAgfQorICAvKiBlbHNlIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICovCisgIC8qIGl0IHJlcXVlc3QgaW1wbGljaXRseSB0byBnZW5lcmF0ZSBhIHJlc3RhcnQgY29uZGl0aW9uICAgICAgICAgICAgICAgKi8KKyAgLyogdGhlbiBnZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIgICAgICAgICAgICAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgICAgICAgICAgICovCisgIGVsc2UgaWYgKGhzbWJ1cy0+WGZlck9wdGlvbnMgPT0gU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMpCisgIHsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUM7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfc3BpLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ0Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfc3BpLmMKQEAgLTAsMCArMSw0MjczIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF9zcGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1BJIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgU1BJIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIERlY2xhcmUgYSBTUElfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgICBTUElfSGFuZGxlVHlwZURlZiAgaHNwaTsKKworICAgICAgKCMpSW5pdGlhbGl6ZSB0aGUgU1BJIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfU1BJX01zcEluaXQoKSBBUEk6CisgICAgICAgICAgKCMjKSBFbmFibGUgdGhlIFNQSXggaW50ZXJmYWNlIGNsb2NrCisgICAgICAgICAgKCMjKSBTUEkgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTUEkgR1BJT3MKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFNQSSBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdXNoLXB1bGwKKyAgICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTUEl4IGludGVycnVwdCBwcmlvcml0eQorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU1BJIElSUSBoYW5kbGUKKyAgICAgICAgICAoIyMpIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcworICAgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgU3RyZWFtL0NoYW5uZWwKKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGNsb2NrCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIGhhbmRsZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4IG9yIFJ4IFN0cmVhbS9DaGFubmVsCisgICAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgaGRtYV90eChvciBfcngpICBoYW5kbGUgdG8gdGhlIGhzcGkgRE1BIFR4IG9yIFJ4IGhhbmRsZQorICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeCBvciBSeCBTdHJlYW0vQ2hhbm5lbAorCisgICAgICAoIykgUHJvZ3JhbSB0aGUgTW9kZSwgQmlkaXJlY3Rpb25hbE1vZGUgLCBEYXRhIHNpemUsIEJhdWRyYXRlIFByZXNjYWxlciwgTlNTCisgICAgICAgICAgbWFuYWdlbWVudCwgQ2xvY2sgcG9sYXJpdHkgYW5kIHBoYXNlLCBGaXJzdEJpdCBhbmQgQ1JDIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGhzcGkgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAgICgjKSBJbml0aWFsaXplIHRoZSBTUEkgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9TUElfSW5pdCgpIEFQSToKKyAgICAgICAgICAoKyspIFRoaXMgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1NQSV9Nc3BJbml0KCkgQVBJLgorICAgICBbLi5dCisgICAgICAgQ2lyY3VsYXIgbW9kZSByZXN0cmljdGlvbjoKKyAgICAgICgjKSBUaGUgRE1BIGNpcmN1bGFyIG1vZGUgY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgU1BJIGlzIGNvbmZpZ3VyZWQgaW4gdGhlc2UgbW9kZXM6CisgICAgICAgICAgKCMjKSBNYXN0ZXIgMkxpbmVzIFJ4T25seQorICAgICAgICAgICgjIykgTWFzdGVyIDFMaW5lIFJ4CisgICAgICAoIykgVGhlIENSQyBmZWF0dXJlIGlzIG5vdCBtYW5hZ2VkIHdoZW4gdGhlIERNQSBjaXJjdWxhciBtb2RlIGlzIGVuYWJsZWQKKyAgICAgICgjKSBXaGVuIHRoZSBTUEkgRE1BIFBhdXNlL1N0b3AgZmVhdHVyZXMgYXJlIHVzZWQsIHdlIG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgQVBJcworICAgICAgICAgIHRoZSBIQUxfU1BJX0RNQVBhdXNlKCkvIEhBTF9TUElfRE1BU3RvcCgpIG9ubHkgdW5kZXIgdGhlIFNQSSBjYWxsYmFja3MKKyAgICAgWy4uXQorICAgICAgIE1hc3RlciBSZWNlaXZlIG1vZGUgcmVzdHJpY3Rpb246CisgICAgICAoIykgSW4gTWFzdGVyIHVuaWRpcmVjdGlvbmFsIHJlY2VpdmUtb25seSBtb2RlIChNU1RSID0xLCBCSURJTU9ERT0wLCBSWE9OTFk9MSkgb3IKKyAgICAgICAgICBiaWRpcmVjdGlvbmFsIHJlY2VpdmUgbW9kZSAoTVNUUj0xLCBCSURJTU9ERT0xLCBCSURJT0U9MCksIHRvIGVuc3VyZSB0aGF0IHRoZSBTUEkKKyAgICAgICAgICBkb2VzIG5vdCBpbml0aWF0ZSBhIG5ldyB0cmFuc2ZlciB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBoYXMgdG8gYmUgcmVzcGVjdGVkOgorICAgICAgICAgICgjIykgSEFMX1NQSV9EZUluaXQoKQorICAgICAgICAgICgjIykgSEFMX1NQSV9Jbml0KCkKKyAgICAgWy4uXQorICAgICAgIENhbGxiYWNrIHJlZ2lzdHJhdGlvbjoKKworICAgICAgKCMpIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxVQorICAgICAgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgICAgICAgICAgVXNlIEZ1bmN0aW9ucyBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgICAgICAgICBGdW5jdGlvbiBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4UnhDcGx0Q2FsbGJhY2sgICAgICA6IFNQSSBUeFJ4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBUeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICA6IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFR4UnhIYWxmQ3BsdENhbGxiYWNrICA6IFNQSSBUeFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogU1BJIEVycm9yIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgIDogU1BJIEFib3J0IGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogU1BJIE1zcCBJbml0IGNhbGxiYWNrCisgICAgICAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgIDogU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgICAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKworCisgICAgICAoIykgVXNlIGZ1bmN0aW9uIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICAgICAgIEhBTF9TUElfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeFJ4Q3BsdENhbGxiYWNrICAgICAgOiBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeFJ4SGFsZkNwbHRDYWxsYmFjayAgOiBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IFNQSSBFcnJvciBjYWxsYmFjaworICAgICAgICAgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICA6IFNQSSBBYm9ydCBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICA6IFNQSSBNc3AgSW5pdCBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrCisKKyAgICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSEFMX1NQSV9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9TUElfU1RBVEVfUkVTRVQKKyAgICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgICAgZXhhbXBsZXMgSEFMX1NQSV9NYXN0ZXJUeENwbHRDYWxsYmFjaygpLCBIQUxfU1BJX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBIQUxfU1BJX0luaXQoKS8gSEFMX1NQSV9EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEhBTF9TUElfSW5pdCgpLyBIQUxfU1BJX0RlSW5pdCgpCisgICAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisKKyAgICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9TUElfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgICBpbiBIQUxfU1BJX1NUQVRFX1JFQURZIG9yIEhBTF9TUElfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgICAgdXNpbmcgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgSEFMX1NQSV9EZUluaXQoKQorICAgICAgIG9yIEhBTF9TUElfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgICAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfUFBQX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICAgICBbLi5dCisgICAgICAgVXNpbmcgdGhlIEhBTCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVhY2ggYWxsIHN1cHBvcnRlZCBTUEkgZnJlcXVlbmN5IHdpdGggdGhlIGRpZmZlcmVudCBTUEkgTW9kZXMsCisgICAgICAgdGhlIGZvbGxvd2luZyB0YWJsZSByZXN1bWUgdGhlIG1heCBTUEkgZnJlcXVlbmN5IHJlYWNoZWQgd2l0aCBkYXRhIHNpemUgOGJpdHMvMTZiaXRzLAorICAgICAgICAgYWNjb3JkaW5nIHRvIGZyZXF1ZW5jeSBvZiB0aGUgQVBCeCBQZXJpcGhlcmFsIENsb2NrIChmUENMSykgdXNlZCBieSB0aGUgU1BJIGluc3RhbmNlLgorCisgIEBlbmR2ZXJiYXRpbQorCisgIEFkZGl0aW9uYWwgdGFibGUgOgorCisgICAgICAgRGF0YVNpemUgPSBTUElfREFUQVNJWkVfOEJJVDoKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8IDJMaW5lcyBGdWxsZHVwbGV4ICAgfCAgICAgMkxpbmVzIFJ4T25seSAgICB8ICAgICAgICAgMUxpbmUgICAgICAgIHwKKyAgICAgICB8IFByb2Nlc3MgfCBUcmFuZmVydCBtb2RlICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICBNYXN0ZXIgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwKKyAgICAgICB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzQgIHwgRnBjbGsvOCAgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIC8gICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzQgIHwgRnBjbGsvMTYgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8ICAgIFIgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFggICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiAgfCBGcGNsay84ICB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFIgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgfCBGcGNsay84ICAgfCBGcGNsay84ICB8IEZwY2xrLzggICB8IEZwY2xrLzQgIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzQgIHwgRnBjbGsvMiAgfCBGcGNsay8yICAgfCBGcGNsay8xNiB8IEZwY2xrLzIgICB8IEZwY2xrLzE2IHwKKyAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzggIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNCAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzE2ICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzggICB8IEZwY2xrLzE2IHwKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgICAgIERhdGFTaXplID0gU1BJX0RBVEFTSVpFXzE2QklUOgorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgMkxpbmVzIEZ1bGxkdXBsZXggICB8ICAgICAyTGluZXMgUnhPbmx5ICAgIHwgICAgICAgICAxTGluZSAgICAgICAgfAorICAgICAgIHwgUHJvY2VzcyB8IFRyYW5mZXJ0IG1vZGUgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgIE1hc3RlciAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfAorICAgICAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAorICAgICAgIHwgICAgVCAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgLyAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvNCAgfCBGcGNsay8xNiB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHwgICAgUiAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgWCAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgIE5BICAgICB8ICAgIE5BICAgIHwgICAgTkEgICAgIHwgICBOQSAgICAgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvNCAgfCBGcGNsay84ICB8IEZwY2xrLzE2ICB8IEZwY2xrLzggIHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgUiAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwgRnBjbGsvOCAgIHwgRnBjbGsvNCAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvNCAgfCBGcGNsay8yICB8IEZwY2xrLzIgICB8IEZwY2xrLzE2IHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfAorICAgICAgIHw9PT09PT09PT18PT09PT09PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fAorICAgICAgIHwgICAgICAgICB8ICAgICBQb2xsaW5nICAgIHwgRnBjbGsvOCAgfCBGcGNsay8yICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgVCAgICB8ICAgICBJbnRlcnJ1cHQgIHwgRnBjbGsvMiAgfCBGcGNsay80ICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfAorICAgICAgIHwgICAgWCAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICAgICAgIHwgICAgICAgICB8ICAgICAgIERNQSAgICAgIHwgRnBjbGsvMiAgfCBGcGNsay8yICB8ICAgICBOQSAgICB8ICAgIE5BICAgIHwgRnBjbGsvOCAgIHwgRnBjbGsvMTYgfAorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgIEBub3RlIFRoZSBtYXggU1BJIGZyZXF1ZW5jeSBkZXBlbmQgb24gU1BJIGRhdGEgc2l6ZSAoNGJpdHMsIDViaXRzLC4uLiwgOGJpdHMsLi4uMTViaXRzLCAxNmJpdHMpLAorICAgICAgICAgICAgIFNQSSBtb2RlKDIgTGluZXMgZnVsbGR1cGxleCwgMiBsaW5lcyBSeE9ubHksIDEgbGluZSBUWC9SWCkgYW5kIFByb2Nlc3MgbW9kZSAoUG9sbGluZywgSVQsIERNQSkuCisgICAgICAgQG5vdGUKKyAgICAgICAgICAgICgjKSBUWC9SWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKCksIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKCkgYW5kIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQSgpCisgICAgICAgICAgICAoIykgUlggcHJvY2Vzc2VzIGFyZSBIQUxfU1BJX1JlY2VpdmUoKSwgSEFMX1NQSV9SZWNlaXZlX0lUKCkgYW5kIEhBTF9TUElfUmVjZWl2ZV9ETUEoKQorICAgICAgICAgICAgKCMpIFRYIHByb2Nlc3NlcyBhcmUgSEFMX1NQSV9UcmFuc21pdCgpLCBIQUxfU1BJX1RyYW5zbWl0X0lUKCkgYW5kIEhBTF9TUElfVHJhbnNtaXRfRE1BKCkKKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSSBTUEkKKyAgKiBAYnJpZWYgU1BJIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfU1BJX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9Db25zdGFudHMgU1BJIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0RFRkFVTFRfVElNRU9VVCAxMDBVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucyBTUEkgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50MzJfdCBGaWZvLCB1aW50MzJfdCBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworc3RhdGljIHZvaWQgU1BJX0Fib3J0UnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeFR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Nsb3NlVHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucyBTUEkgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgICAgZGUtaW5pdGlhbGl6ZSB0aGUgU1BJeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IGltcGxlbWVudCBIQUxfU1BJX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgRE1BLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NQSV9Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBzZWxlY3RlZCBkZXZpY2Ugd2l0aAorICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOgorICAgICAgICAoKyspIE1vZGUKKyAgICAgICAgKCsrKSBEaXJlY3Rpb24KKyAgICAgICAgKCsrKSBEYXRhIFNpemUKKyAgICAgICAgKCsrKSBDbG9jayBQb2xhcml0eSBhbmQgUGhhc2UKKyAgICAgICAgKCsrKSBOU1MgTWFuYWdlbWVudAorICAgICAgICAoKyspIEJhdWRSYXRlIFByZXNjYWxlcgorICAgICAgICAoKyspIEZpcnN0Qml0CisgICAgICAgICgrKykgVElNb2RlCisgICAgICAgICgrKykgQ1JDIENhbGN1bGF0aW9uCisgICAgICAgICgrKykgQ1JDIFBvbHlub21pYWwgaWYgQ1JDIGVuYWJsZWQKKyAgICAgICAgKCsrKSBDUkMgTGVuZ3RoLCB1c2VkIG9ubHkgd2l0aCBEYXRhOCBhbmQgRGF0YTE2CisgICAgICAgICgrKykgRklGTyByZWNlcHRpb24gdGhyZXNob2xkCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU1BJX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBTUEl4IHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBTUElfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9Jbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICB1aW50MzJfdCBmcnh0aDsKKworICAvKiBDaGVjayB0aGUgU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc3BpID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoaHNwaS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9NT0RFKGhzcGktPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTihoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RBVEFTSVpFKGhzcGktPkluaXQuRGF0YVNpemUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1MoaHNwaS0+SW5pdC5OU1MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9OU1NQKGhzcGktPkluaXQuTlNTUE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0ZJUlNUX0JJVChoc3BpLT5Jbml0LkZpcnN0Qml0KSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfVElNT0RFKGhzcGktPkluaXQuVElNb2RlKSk7CisgIGlmIChoc3BpLT5Jbml0LlRJTW9kZSA9PSBTUElfVElNT0RFX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NQT0woaHNwaS0+SW5pdC5DTEtQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1BIQShoc3BpLT5Jbml0LkNMS1BoYXNlKSk7CisgIH0KKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX0NBTENVTEFUSU9OKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24pKTsKKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX1BPTFlOT01JQUwoaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUkNfTEVOR1RIKGhzcGktPkluaXQuQ1JDTGVuZ3RoKSk7CisgIH0KKyNlbHNlCisgIGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhzcGktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qIEluaXQgdGhlIFNQSSBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrICAgICAgID0gSEFMX1NQSV9UeENwbHRDYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICBoc3BpLT5SeENwbHRDYWxsYmFjayAgICAgICA9IEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayAgICAgPSBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAqLworICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayAgID0gSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgICA9IEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeFJ4SGFsZkNwbHRDYWxsYmFjayAqLworICAgIGhzcGktPkVycm9yQ2FsbGJhY2sgICAgICAgID0gSEFMX1NQSV9FcnJvckNhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayAgICA9IEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisKKyAgICBpZiAoaHNwaS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIEhBTF9TUElfTXNwSW5pdChoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNQSSBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEFsaWduIGJ5IGRlZmF1bHQgdGhlIHJzIGZpZm8gdGhyZXNob2xkIG9uIHRoZSBkYXRhIHNpemUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGZyeHRoID0gU1BJX1JYRklGT19USFJFU0hPTERfSEY7CisgIH0KKyAgZWxzZQorICB7CisgICAgZnJ4dGggPSBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRjsKKyAgfQorCisgIC8qIENSQyBjYWxjdWxhdGlvbiBpcyB2YWxpZCBvbmx5IGZvciAxNkJpdCBhbmQgOCBCaXQgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplICE9IFNQSV9EQVRBU0laRV8xNkJJVCkgJiYgKGhzcGktPkluaXQuRGF0YVNpemUgIT0gU1BJX0RBVEFTSVpFXzhCSVQpKQorICB7CisgICAgLyogQ1JDIG11c3QgYmUgZGlzYWJsZWQgKi8KKyAgICBoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7CisgIH0KKworICAvKiBBbGlnbiB0aGUgQ1JDIExlbmd0aCBvbiB0aGUgZGF0YSBzaXplICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRSkKKyAgeworICAgIC8qIENSQyBMZW5ndGggYWxpZ25lZCBvbiB0aGUgZGF0YSBzaXplIDogdmFsdWUgc2V0IGJ5IGRlZmF1bHQgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICAgIHsKKyAgICAgIGhzcGktPkluaXQuQ1JDTGVuZ3RoID0gU1BJX0NSQ19MRU5HVEhfMTZCSVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9IFNQSV9DUkNfTEVOR1RIXzhCSVQ7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSMSAmIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSA6IFNQSSBNb2RlLCBDb21tdW5pY2F0aW9uIE1vZGUsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgTlNTIG1hbmFnZW1lbnQsCisgIENvbW11bmljYXRpb24gc3BlZWQsIEZpcnN0IGJpdCBhbmQgQ1JDIGNhbGN1bGF0aW9uIHN0YXRlICovCisgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IxLCAoaHNwaS0+SW5pdC5Nb2RlIHwgaHNwaS0+SW5pdC5EaXJlY3Rpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGktPkluaXQuQ0xLUG9sYXJpdHkgfCBoc3BpLT5Jbml0LkNMS1BoYXNlIHwgKGhzcGktPkluaXQuTlNTICYgU1BJX0NSMV9TU00pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5Jbml0LkJhdWRSYXRlUHJlc2NhbGVyIHwgaHNwaS0+SW5pdC5GaXJzdEJpdCAgfCBoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uKSk7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDb25maWd1cmUgOiBDUkMgTGVuZ3RoICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkKKyAgeworICAgIGhzcGktPkluc3RhbmNlLT5DUjEgfD0gU1BJX0NSMV9DUkNMOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDb25maWd1cmUgOiBOU1MgbWFuYWdlbWVudCwgVEkgTW9kZSwgTlNTIFB1bHNlLCBEYXRhIHNpemUgYW5kIFJ4IEZpZm8gdGhyZXNob2xkICovCisgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoKChoc3BpLT5Jbml0Lk5TUyA+PiAxNlUpICYgU1BJX0NSMl9TU09FKSB8IGhzcGktPkluaXQuVElNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5Jbml0Lk5TU1BNb2RlIHwgaHNwaS0+SW5pdC5EYXRhU2l6ZSkgfCBmcnh0aCk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSQ1BPTFkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgOiBDUkMgUG9seW5vbWlhbCAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgV1JJVEVfUkVHKGhzcGktPkluc3RhbmNlLT5DUkNQUiwgaHNwaS0+SW5pdC5DUkNQb2x5bm9taWFsKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyNpZiBkZWZpbmVkKFNQSV9JMlNDRkdSX0kyU01PRCkKKyAgLyogQWN0aXZhdGUgdGhlIFNQSSBtb2RlIChNYWtlIHN1cmUgdGhhdCBJMlNNT0QgYml0IGluIEkyU0NGR1IgcmVnaXN0ZXIgaXMgcmVzZXQpICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EKTsKKyNlbmRpZiAvKiBTUElfSTJTQ0ZHUl9JMlNNT0QgKi8KKworICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPlN0YXRlICAgICA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZS1Jbml0aWFsaXplIHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBDaGVjayB0aGUgU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc3BpID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgU1BJIEluc3RhbmNlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0FMTF9JTlNUQU5DRShoc3BpLT5JbnN0YW5jZSkpOworCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNQSSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhzcGktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgSEFMX1NQSV9Nc3BEZUluaXQoaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNQSSBNU1AuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX01zcEluaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX01zcEluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSB0aGUgU1BJIE1TUC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfTXNwRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9Nc3BEZUluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgU1BJIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNwaSBQb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU1BJX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgfD0gSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChIQUxfU1BJX1NUQVRFX1JFQURZID09IGhzcGktPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX0FCT1JUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NQSV9TVEFURV9SRVNFVCA9PSBoc3BpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBTUEkgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFNQSSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzcGkgUG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoSEFMX1NQSV9TVEFURV9SRUFEWSA9PSBoc3BpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5SeENwbHRDYWxsYmFjayA9IEhBTF9TUElfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrID0gSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4UnhDcGx0Q2FsbGJhY2sgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFR4UnhIYWxmQ3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrID0gSEFMX1NQSV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfQUJPUlRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayA9IEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwRGVJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TUElfU1RBVEVfUkVTRVQgPT0gaHNwaS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU1BJCisgICAgZGF0YSB0cmFuc2ZlcnMuCisKKyAgICBbLi5dIFRoZSBTUEkgc3VwcG9ydHMgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlIDoKKworICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSXMgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgU1BJIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorICAgICAgICAgICAgVGhlIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NQSV9SeENwbHRDYWxsYmFjaygpIGFuZCBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgICBUaGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBBUElzIHByb3ZpZGVkIGZvciB0aGVzZSAyIHRyYW5zZmVyIG1vZGVzIChCbG9ja2luZyBtb2RlIG9yIE5vbiBibG9ja2luZyBtb2RlIHVzaW5nIGVpdGhlciBJbnRlcnJ1cHQgb3IgRE1BKQorICAgICAgICBleGlzdCBmb3IgMUxpbmUgKHNpbXBsZXgpIGFuZCAyTGluZXMgKGZ1bGwgZHVwbGV4KSBtb2Rlcy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgdWludDE2X3QgaW5pdGlhbF9UeFhmZXJDb3VudDsKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FU19PUl8xTElORShoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIGluaXRpYWxfVHhYZmVyQ291bnQgPSBTaXplOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlJ4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1RYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaW5pdGlhbF9UeFhmZXJDb3VudCA9PSAweDAxVSkpCisgICAgeworICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgfQorICAgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgICB3aGlsZSAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBUcmFuc21pdCBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkKKyAgICB7CisgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovCisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArKzsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpCisgICAgICB7CisgICAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKQorICAgICAgICB7CisgICAgICAgICAgLyogd3JpdGUgb24gdGhlIGRhdGEgcmVnaXN0ZXIgaW4gcGFja2luZyBtb2RlICovCisgICAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUikgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gIFRpbWVvdXQpICYmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdCByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKworZXJyb3I6CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgICAvKiBDYWxsIHRyYW5zbWl0LXJlY2VpdmUgZnVuY3Rpb24gdG8gc2VuZCBEdW1teSBkYXRhIG9uIFR4IGxpbmUgYW5kIGdlbmVyYXRlIGNsb2NrIG9uIENMSyBsaW5lICovCisgICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSwgVGltZW91dCk7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKU5VTEw7CisgIGhzcGktPlR4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgICAgLyogdGhpcyBpcyBkb25lIHRvIGhhbmRsZSB0aGUgQ1JDTkVYVCBiZWZvcmUgdGhlIGxhdGVzdCBkYXRhICovCisgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogU2V0IHRoZSBSeCBGaWZvIHRocmVzaG9sZCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb246IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgLyogVHJhbnNmZXIgbG9vcCAqLworICAgIHdoaWxlIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBSWE5FIGZsYWcgKi8KKyAgICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpCisgICAgICB7CisgICAgICAgIC8qIHJlYWQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgICAgICAgKCogKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gIFRpbWVvdXQpICYmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFRyYW5zZmVyIGxvb3AgKi8KKyAgICB3aGlsZSAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgUlhORSBmbGFnICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKQorICAgICAgeworICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBIYW5kbGUgdGhlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIC8qIGZyZWV6ZSB0aGUgQ1JDIGJlZm9yZSB0aGUgbGF0ZXN0IGRhdGEgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisKKyAgICAvKiBSZWFkIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIHRoZSBsYXRlc3QgZGF0YSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgKi8KKyAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZWNlaXZlIGxhc3QgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgICAgeworICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgfQorICAgIC8qIFJlY2VpdmUgbGFzdCBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgKCoodWludDhfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIH0KKworICAgIC8qIFdhaXQgdGhlIENSQyBkYXRhICovCisgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZWFkIENSQyB0byBGbHVzaCBEUiBhbmQgUlhORSBmbGFnICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzE2QklUKQorICAgIHsKKyAgICAgIC8qIFJlYWQgMTZiaXQgQ1JDICovCisgICAgICBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCA4Yml0IENSQyAqLworICAgICAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorICAgICAgeworICAgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgYWdhaW4gaW4gY2FzZSBvZiAxNmJpdCBDUkMgaW4gOGJpdCBEYXRhIG1vZGUgKi8KKyAgICAgICAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUcmFuc2FjdGlvbihoc3BpLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKworZXJyb3IgOgorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIHRyYW5zbWlzc2lvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIHJlY2VwdGlvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IGFuZCByZWNlaXZlZAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90ICAgICAgICAgICAgIGluaXRpYWxfVHhYZmVyQ291bnQ7CisgIHVpbnQxNl90ICAgICAgICAgICAgIGluaXRpYWxfUnhYZmVyQ291bnQ7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRpY2tzdGFydDsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIHVpbnQzMl90ICAgICAgICAgICAgIHNwaV9jcjE7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHNwaV9jcjI7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBWYXJpYWJsZSB1c2VkIHRvIGFsdGVybmF0ZSBSeCBhbmQgVHggZHVyaW5nIHRyYW5zZmVyICovCisgIHVpbnQzMl90ICAgICAgICAgICAgIHR4YWxsb3dlZCA9IDFVOworICBIQUxfU3RhdHVzVHlwZURlZiAgICBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVMoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEluaXQgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworICB0bXBfc3RhdGUgICAgICAgICAgID0gaHNwaS0+U3RhdGU7CisgIHRtcF9tb2RlICAgICAgICAgICAgPSBoc3BpLT5Jbml0Lk1vZGU7CisgIGluaXRpYWxfVHhYZmVyQ291bnQgPSBTaXplOworICBpbml0aWFsX1J4WGZlckNvdW50ID0gU2l6ZTsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIHNwaV9jcjEgICAgICAgICAgICAgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IxKTsKKyAgc3BpX2NyMiAgICAgICAgICAgICA9IFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5DUjIpOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaWYgKCEoKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmICh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopcFJ4RGF0YTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPlR4WGZlclNpemUgID0gU2l6ZTsKKworICAvKkluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogU2V0IHRoZSBSeCBGaWZvIHRocmVzaG9sZCAqLworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgfHwgKGluaXRpYWxfUnhYZmVyQ291bnQgPiAxVSkpCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaW5pdGlhbF9UeFhmZXJDb3VudCA9PSAweDAxVSkpCisgICAgeworICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgfQorICAgIHdoaWxlICgoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIFRYRSBmbGFnICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19UWEUpKSAmJiAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgJiYgKHR4YWxsb3dlZCA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgcmVjZXB0aW9uIChSeCkuIFR4IG5vdCBhbGxvd2VkICovCisgICAgICAgIHR4YWxsb3dlZCA9IDBVOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSAmJiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBOU1MgU29mdCB0byByZWNlaXZlZCBjb3JyZWN0bHkgdGhlIENSQyBvbiBzbGF2ZSBtb2RlIHdpdGggTlNTIHB1bHNlIGFjdGl2YXRlZCAqLworICAgICAgICAgIGlmICgoUkVBRF9CSVQoc3BpX2NyMSwgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYgKFJFQURfQklUKHNwaV9jcjIsIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1NNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgUlhORSBmbGFnICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkgJiYgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKQorICAgICAgeworICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSBUcmFuc21pc3Npb24gKFR4KS4gVHggaXMgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKQorICAgICAgeworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorICAgIHdoaWxlICgoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgfHwgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIFRYRSBmbGFnICovCisgICAgICBpZiAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19UWEUpKSAmJiAoaHNwaS0+VHhYZmVyQ291bnQgPiAwVSkgJiYgKHR4YWxsb3dlZCA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+IDFVKQorICAgICAgICB7CisgICAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSByZWNlcHRpb24gKFJ4KS4gVHggbm90IGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMFU7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICAgIGlmICgoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IE5TUyBTb2Z0IHRvIHJlY2VpdmVkIGNvcnJlY3RseSB0aGUgQ1JDIG9uIHNsYXZlIG1vZGUgd2l0aCBOU1MgcHVsc2UgYWN0aXZhdGVkICovCisgICAgICAgICAgaWYgKChSRUFEX0JJVChzcGlfY3IxLCBTUElfQ1IxX01TVFIpID09IDBVKSAmJiAoUkVBRF9CSVQoc3BpX2NyMiwgU1BJX0NSMl9OU1NQKSA9PSBTUElfQ1IyX05TU1ApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TU00pOworICAgICAgICAgIH0KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgICAgfQorCisgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyByZXNldCAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpICYmIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpCisgICAgICAgIHsKKyAgICAgICAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KWhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgLT0gMlU7CisgICAgICAgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50IDw9IDFVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBiZWZvcmUgdG8gc3dpdGNoIG9uIDggYml0IGRhdGEgc2l6ZSAqLworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgICBoc3BpLT5wUnhCdWZmUHRyKys7CisgICAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICAvKiBOZXh0IERhdGEgaXMgYSBUcmFuc21pc3Npb24gKFR4KS4gVHggaXMgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVhZCBDUkMgZnJvbSBEUiB0byBjbG9zZSBDUkMgY2FsY3VsYXRpb24gcHJvY2VzcyAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBSZWFkIENSQyAqLworICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV8xNkJJVCkKKyAgICB7CisgICAgICAvKiBSZWFkIDE2Yml0IENSQyAqLworICAgICAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8KKyAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisKKyAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkKKyAgICAgIHsKKyAgICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDIGFnYWluIGluIGNhc2Ugb2YgMTZiaXQgQ1JDIGluIDhiaXQgRGF0YSBtb2RlICovCisgICAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgLyogQ2xlYXIgQ1JDIEZsYWcgKi8KKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICB9CisKK2Vycm9yIDoKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5SeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisKKyAgLyogU2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9UeElTUl8xNkJJVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9UeElTUl84QklUOworICB9CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfVFgoaHNwaSk7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBFbmFibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKSk7CisKKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKK2Vycm9yIDoKKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgICAvKiBDYWxsIHRyYW5zbWl0LXJlY2VpdmUgZnVuY3Rpb24gdG8gc2VuZCBEdW1teSBkYXRhIG9uIFR4IGxpbmUgYW5kIGdlbmVyYXRlIGNsb2NrIG9uIENMSyBsaW5lICovCisgICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKGhzcGksIHBEYXRhLCBwRGF0YSwgU2l6ZSk7CisgIH0KKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1JYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyAgLyogQ2hlY2sgdGhlIGRhdGEgc2l6ZSB0byBhZGFwdCBSeCB0aHJlc2hvbGQgYW5kIHRoZSBzZXQgdGhlIGZ1bmN0aW9uIGZvciBJVCB0cmVhdG1lbnQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTYgYml0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV9SeElTUl8xNkJJVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDggYml0ICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfOEJJVDsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgaHNwaS0+Q1JDU2l6ZSA9IDFVOworICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKSkKKyAgICB7CisgICAgICBoc3BpLT5DUkNTaXplID0gMlU7CisgICAgfQorICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNwaS0+Q1JDU2l6ZSA9IDBVOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBFbmFibGUgVFhFIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIC8qIE5vdGUgOiBUaGUgU1BJIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBTUEkgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCitlcnJvciA6CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIHRyYW5zbWlzc2lvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIHJlY2VwdGlvbiBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IGFuZCByZWNlaXZlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmICAgIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgIHRtcF9zdGF0ZSAgICAgICAgICAgPSBoc3BpLT5TdGF0ZTsKKyAgdG1wX21vZGUgICAgICAgICAgICA9IGhzcGktPkluaXQuTW9kZTsKKworICBpZiAoISgodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfUkVBRFkpIHx8IFwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIFNldCB0aGUgZnVuY3Rpb24gZm9yIElUIHRyZWF0bWVudCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgaHNwaS0+UnhJU1IgICAgID0gU1BJXzJsaW5lc1J4SVNSXzE2QklUOworICAgIGhzcGktPlR4SVNSICAgICA9IFNQSV8ybGluZXNUeElTUl8xNkJJVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoc3BpLT5SeElTUiAgICAgPSBTUElfMmxpbmVzUnhJU1JfOEJJVDsKKyAgICBoc3BpLT5UeElTUiAgICAgPSBTUElfMmxpbmVzVHhJU1JfOEJJVDsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAxVTsKKyAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpCisgICAgeworICAgICAgaHNwaS0+Q1JDU2l6ZSA9IDJVOworICAgIH0KKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisgIGVsc2UKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAwVTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgaWYgcGFja2luZyBtb2RlIGlzIGVuYWJsZWQgYW5kIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiAyIGRhdGEgdG8gcmVjZWl2ZSAqLworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkgfHwgKFNpemUgPj0gMlUpKQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNiBiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOCBiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorCisgIC8qIEVuYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdF9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdHggZG1hIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXR4KSk7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPlN0YXRlICAgICAgID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYOworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFR4QnVmZlB0ciAgPSAodWludDhfdCAqKXBEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0OworCisgIC8qIFNldCB0aGUgU1BJIFR4RE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNQSV9ETUFUcmFuc21pdENwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAvKiBQYWNraW5nIG1vZGUgaXMgZW5hYmxlZCBvbmx5IGlmIHRoZSBETUEgc2V0dGluZyBpcyBIQUxXT1JEICovCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKGhzcGktPmhkbWF0eC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBldmVuL29kZCBvZiB0aGUgZGF0YSBzaXplICsgY3JjIGlmIGVuYWJsZWQgKi8KKyAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ICYgMHgxVSkgPT0gMFUpCisgICAgeworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gKGhzcGktPlR4WGZlckNvdW50ID4+IDFVKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAoaHNwaS0+VHhYZmVyQ291bnQgPj4gMVUpICsgMVU7CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIHRoZSBUeCBETUEgU3RyZWFtL0NoYW5uZWwgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWF0eCwgKHVpbnQzMl90KWhzcGktPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCBoc3BpLT5UeFhmZXJDb3VudCkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKK2Vycm9yIDoKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgTUFTVEVSIG1vZGUgYW5kIFNQSV9ESVJFQ1RJT05fMkxJTkVTIGRpcmVjdGlvbiwgaGRtYXR4IHNoYWxsIGJlIGRlZmluZWQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQG5vdGUgICBXaGVuIHRoZSBDUkMgZmVhdHVyZSBpcyBlbmFibGVkIHRoZSBwRGF0YSBMZW5ndGggbXVzdCBiZSBTaXplICsgMS4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBDaGVjayByeCBkbWEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsKKworICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIENoZWNrIHR4IGRtYSBoYW5kbGUgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXR4KSk7CisKKyAgICAvKiBDYWxsIHRyYW5zbWl0LXJlY2VpdmUgZnVuY3Rpb24gdG8gc2VuZCBEdW1teSBkYXRhIG9uIFR4IGxpbmUgYW5kIGdlbmVyYXRlIGNsb2NrIG9uIENMSyBsaW5lICovCisgICAgcmV0dXJuIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1JYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisKKyAgICBpZiAoaHNwaS0+aGRtYXJ4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpCisgICAgeworICAgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKworICAgICAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCAmIDB4MVUpID09IDB4MFUpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gaHNwaS0+UnhYZmVyQ291bnQgPj4gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IChoc3BpLT5SeFhmZXJDb3VudCA+PiAxVSkgKyAxVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBTZXQgdGhlIFNQSSBSeERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlJlY2VpdmVDcGx0OworCisgIC8qIFNldCB0aGUgU1BJIFJ4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTUElfRE1BUmVjZWl2ZUNwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNQSV9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIERNQSBBYm9ydENwbHRDYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFJ4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWFyeCwgKHVpbnQzMl90KSZoc3BpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloc3BpLT5wUnhCdWZmUHRyLCBoc3BpLT5SeFhmZXJDb3VudCkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgU1BJIEVycm9yIEludGVycnVwdCBCaXQgKi8KKyAgX19IQUxfU1BJX0VOQUJMRV9JVChoc3BpLCAoU1BJX0lUX0VSUikpOworCisgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKK2Vycm9yOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIENSQyBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlIHBSeERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmVfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90ICAgICAgICAgICAgIHRtcF9tb2RlOworICBIQUxfU1BJX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKKworICAvKiBDaGVjayByeCAmIHR4IGRtYSBoYW5kbGVzICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hcngpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdG1wX3N0YXRlICAgICAgICAgICA9IGhzcGktPlN0YXRlOworICB0bXBfbW9kZSAgICAgICAgICAgID0gaHNwaS0+SW5pdC5Nb2RlOworCisgIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwKKyAgICAgICAgKCh0bXBfbW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpKSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogRG9uJ3Qgb3ZlcndyaXRlIGluIGNhc2Ugb2YgSEFMX1NQSV9TVEFURV9CVVNZX1JYICovCisgIGlmIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWF9SWDsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwVHhEYXRhOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qIEluaXQgZmllbGQgbm90IHVzZWQgaW4gaGFuZGxlIHRvIHplcm8gKi8KKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogUmVzZXQgdGhlIHRocmVzaG9sZCBiaXQgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYIHwgU1BJX0NSMl9MRE1BUlgpOworCisgIC8qIFRoZSBwYWNraW5nIG1vZGUgbWFuYWdlbWVudCBpcyBlbmFibGVkIGJ5IHRoZSBETUEgc2V0dGluZ3MgYWNjb3JkaW5nIHRoZSBzcGkgZGF0YSBzaXplICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBTZXQgZmlmb3J4dGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisKKyAgICBpZiAoaHNwaS0+aGRtYXR4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpCisgICAgeworICAgICAgaWYgKChoc3BpLT5UeFhmZXJTaXplICYgMHgxVSkgPT0gMHgwVSkKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQgPSBoc3BpLT5UeFhmZXJDb3VudCA+PiAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gKGhzcGktPlR4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoc3BpLT5oZG1hcngtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkKKyAgICB7CisgICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2Yml0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ICYgMHgxVSkgPT0gMHgwVSkKKyAgICAgIHsKKyAgICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSBoc3BpLT5SeFhmZXJDb3VudCA+PiAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gKGhzcGktPlJ4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIHdlIGFyZSBpbiBSeCBvbmx5IG9yIGluIFJ4L1R4IE1vZGUgYW5kIGNvbmZpZ3VyZSB0aGUgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBTZXQgdGhlIFNQSSBSeCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzcGktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlJlY2VpdmVDcGx0OworICAgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayAgICAgPSBTUElfRE1BUmVjZWl2ZUNwbHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBTUEkgVHgvUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc3BpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0OworICAgIGhzcGktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayAgICAgPSBTUElfRE1BVHJhbnNtaXRSZWNlaXZlQ3BsdDsKKyAgfQorCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTUElfRE1BRXJyb3I7CisKKyAgLyogU2V0IHRoZSBETUEgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRW5hYmxlIHRoZSBSeCBETUEgU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hcngsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpaHNwaS0+cFJ4QnVmZlB0ciwgaHNwaS0+UnhYZmVyQ291bnQpKQorICB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIEVuYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogU2V0IHRoZSBTUEkgVHggRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrIGFzIE5VTEwgYmVjYXVzZSB0aGUgY29tbXVuaWNhdGlvbiBjbG9zaW5nCisgIGlzIHBlcmZvcm1lZCBpbiBETUEgcmVjZXB0aW9uIGNvbXBsZXRlIGNhbGxiYWNrICAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgaHNwaS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrICAgICA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgICAgPSBOVUxMOworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICAgID0gTlVMTDsKKworICAvKiBFbmFibGUgdGhlIFR4IERNQSBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX1N0YXJ0X0lUKGhzcGktPmhkbWF0eCwgKHVpbnQzMl90KWhzcGktPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCBoc3BpLT5UeFhmZXJDb3VudCkpCisgIHsKKyAgICAvKiBVcGRhdGUgU1BJIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorICAvKiBFbmFibGUgdGhlIFNQSSBFcnJvciBJbnRlcnJ1cHQgQml0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsKKworICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCitlcnJvciA6CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgKFR4IGFuZCBSeCksCisgICogICAgICAgICBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNQSSBJbnRlcnJ1cHRzIChkZXBlbmRpbmcgb2YgdHJhbnNmZXIgZGlyZWN0aW9uKQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZTsKKyAgX19JTyB1aW50MzJfdCBjb3VudCwgcmVzZXRjb3VudDsKKworICAvKiBJbml0aWFsaXplZCBsb2NhbCB2YXJpYWJsZSAgKi8KKyAgZXJyb3Jjb2RlID0gSEFMX09LOworICByZXNldGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisgIGNvdW50ID0gcmVzZXRjb3VudDsKKworICAvKiBDbGVhciBFUlJJRSBpbnRlcnJ1cHQgdG8gYXZvaWQgZXJyb3IgaW50ZXJydXB0cyBnZW5lcmF0aW9uIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfRVJSSUUpOworCisgIC8qIERpc2FibGUgVFhFSUUsIFJYTkVJRSBhbmQgRVJSSUUobW9kZSBmYXVsdCBldmVudCwgb3ZlcnJ1biBlcnJvciwgVEkgZnJhbWUgZXJyb3IpIGludGVycnVwdHMgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhFSUUpKQorICB7CisgICAgaHNwaS0+VHhJU1IgPSBTUElfQWJvcnRUeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkKKyAgeworICAgIGhzcGktPlJ4SVNSID0gU1BJX0Fib3J0UnhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKQorICB7CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgVHggU3RyZWFtL0NoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU1BJIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBBYm9ydCBETUEgVHggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWERNQUVOKSk7CisKKyAgICAgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgICAgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pKQorICB7CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgUnggU3RyZWFtL0NoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU1BJIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBBYm9ydCBETUEgUnggSGFuZGxlIGxpbmtlZCB0byBTUEkgUGVyaXBoZXJhbCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgICAgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYRE1BRU4pKTsKKyAgICB9CisgIH0KKyAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2hlY2sgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfQUJPUlQpCisgIHsKKyAgICAvKiByZXR1cm4gSEFMX0Vycm9yIGluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIH0KKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAvKiBSZXN0b3JlIGhzcGktPnN0YXRlIHRvIHJlYWR5ICovCisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIChUeCBhbmQgUngpLAorICAqICAgICAgICAgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTUEkgSW50ZXJydXB0cyAoZGVwZW5kaW5nIG9mIHRyYW5zZmVyIGRpcmVjdGlvbikKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfQWJvcnRfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZTsKKyAgdWludDMyX3QgYWJvcnRjcGx0IDsKKyAgX19JTyB1aW50MzJfdCBjb3VudCwgcmVzZXRjb3VudDsKKworICAvKiBJbml0aWFsaXplZCBsb2NhbCB2YXJpYWJsZSAgKi8KKyAgZXJyb3Jjb2RlID0gSEFMX09LOworICBhYm9ydGNwbHQgPSAxVTsKKyAgcmVzZXRjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworICBjb3VudCA9IHJlc2V0Y291bnQ7CisKKyAgLyogQ2xlYXIgRVJSSUUgaW50ZXJydXB0IHRvIGF2b2lkIGVycm9yIGludGVycnVwdHMgZ2VuZXJhdGlvbiBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0VSUklFKTsKKworICAvKiBDaGFuZ2UgUnggYW5kIFR4IElycSBIYW5kbGVyIHRvIERpc2FibGUgVFhFSUUsIFJYTkVJRSBhbmQgRVJSSUUgaW50ZXJydXB0cyAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWEVJRSkpCisgIHsKKyAgICBoc3BpLT5UeElTUiA9IFNQSV9BYm9ydFR4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbworICAgIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKQorICB7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfQWJvcnRSeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBTUEkgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkKKyAgICB7CisgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgICB7CisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pKQorICB7CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgVHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogQWJvcnQgRE1BIFR4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pKQorICB7CisgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgUnggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkgIT0gIEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDaGVjayBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICAgIHsKKyAgICAgIC8qIHJldHVybiBIQUxfRXJyb3IgaW4gY2FzZSBvZiBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgICB9CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgICAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUGF1c2UoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUmVzdW1lKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIEVuYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFTdG9wKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgU1BJIEFQSSB1bmRlciBjYWxsYmFja3MgSEFMX1NQSV9UeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soKSBvciBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soKToKKyAgICAgd2hlbiBjYWxsaW5nIEhBTF9ETUFfQWJvcnQoKSBBUEkgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkCisgICAgIGFuZCB0aGUgY29ycmVzcG9uZCBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQgSEFMX1NQSV9UeENwbHRDYWxsYmFjaygpIG9yIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soKSBvciBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soKQorICAgICAqLworCisgIC8qIEFib3J0IHRoZSBTUEkgRE1BIHR4IFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnQoaHNwaS0+aGRtYXR4KSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICAvKiBBYm9ydCB0aGUgU1BJIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWFyeCkpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4ICYgUnggcmVxdWVzdHMgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU1BJIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TUElfSVJRSGFuZGxlcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgdWludDMyX3QgaXRzb3VyY2UgPSBoc3BpLT5JbnN0YW5jZS0+Q1IyOworICB1aW50MzJfdCBpdGZsYWcgICA9IGhzcGktPkluc3RhbmNlLT5TUjsKKworICAvKiBTUEkgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX09WUikgPT0gUkVTRVQpICYmCisgICAgICAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKFNQSV9DSEVDS19JVF9TT1VSQ0UoaXRzb3VyY2UsIFNQSV9JVF9SWE5FKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoc3BpLT5SeElTUihoc3BpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTUEkgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX1RYRSkgIT0gUkVTRVQpICYmIChTUElfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBTUElfSVRfVFhFKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoc3BpLT5UeElTUihoc3BpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTUEkgaW4gRXJyb3IgVHJlYXRtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19NT0RGKSAhPSBSRVNFVCkgfHwgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSAhPSBSRVNFVCkgfHwgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfRlJFKSAhPSBSRVNFVCkpICYmIChTUElfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBTUElfSVRfRVJSKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBTUEkgT3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfT1ZSKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1RYKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9PVlIpOworICAgICAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTUEkgTW9kZSBGYXVsdCBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfTU9ERikgIT0gUkVTRVQpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfTU9ERik7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfTU9ERkZMQUcoaHNwaSk7CisgICAgfQorCisgICAgLyogU1BJIEZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX0ZSRSkgIT0gUkVTRVQpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRlJFKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworICAgIH0KKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FIHwgU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpOworCisgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIHJlcXVlc3RzIGlmIGVuYWJsZWQgKi8KKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaXRzb3VyY2UsIFNQSV9DUjJfVFhETUFFTikpIHx8IChIQUxfSVNfQklUX1NFVChpdHNvdXJjZSwgU1BJX0NSMl9SWERNQUVOKSkpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKSk7CisKKyAgICAgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgUnggY2hhbm5lbCAqLworICAgICAgICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFBYm9ydE9uRXJyb3I7CisgICAgICAgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWFyeCkpCisgICAgICAgICAgeworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBYm9ydCB0aGUgU1BJIERNQSBUeCBjaGFubmVsICovCisgICAgICAgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgU1BJIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU1BJX0RNQUFib3J0T25FcnJvcjsKKyAgICAgICAgICBpZiAoSEFMX09LICE9IEhBTF9ETUFfQWJvcnRfSVQoaHNwaS0+aGRtYXR4KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IGFuZCBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjaygpIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IGFuZCBSeCBIYWxmIFRyYW5zZmVyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soKSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTUEkgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX0Vycm9yQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCisgIC8qIE5PVEUgOiBUaGUgRXJyb3JDb2RlIHBhcmFtZXRlciBpbiB0aGUgaHNwaSBoYW5kbGUgaXMgdXBkYXRlZCBieSB0aGUgU1BJIHByb2Nlc3NlcworICAgICAgICAgICAgYW5kIHVzZXIgY2FuIHVzZSBIQUxfU1BJX0dldEVycm9yKCkgQVBJIHRvIGNoZWNrIHRoZSBsYXRlc3QgZXJyb3Igb2NjdXJyZWQKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU1BJIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBTUEkgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgU1BJLgorICAgICAoKykgSEFMX1NQSV9HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIFNQSSBwZXJpcGhlcmFsCisgICAgICgrKSBIQUxfU1BJX0dldEVycm9yKCkgY2hlY2sgaW4gcnVuLXRpbWUgRXJyb3JzIG9jY3VycmluZyBkdXJpbmcgY29tbXVuaWNhdGlvbgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBTUEkgc3RhdGUKKyAgKi8KK0hBTF9TUElfU3RhdGVUeXBlRGVmIEhBTF9TUElfR2V0U3RhdGUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJldHVybiBTUEkgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoc3BpLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNQSSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgU1BJIGVycm9yIGNvZGUgaW4gYml0bWFwIGZvcm1hdAorICAqLwordWludDMyX3QgSEFMX1NQSV9HZXRFcnJvcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmV0dXJuIFNQSSBFcnJvckNvZGUgKi8KKyAgcmV0dXJuIGhzcGktPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEBicmllZiAgIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gRE1BX0NDUl9DSVJDKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyAgICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisKKyAgICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICAgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIH0KKworICAgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGRhdGEgaXMgbm90IHJlYWQgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpCisgICAgeworICAgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgICAgfQorCisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIENhbGwgdXNlciBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlR4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERNQSBOb3JtYWwgTW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykKKyAgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENSQyBoYW5kbGluZyAqLworICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgKi8KKyAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgfQorICAgICAgLyogUmVhZCBDUkMgKi8KKyAgICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgMTZiaXQgQ1JDICovCisgICAgICAgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8KKyAgICAgICAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogUmVhZCA4Yml0IENSQyBhZ2FpbiBpbiBjYXNlIG9mIDE2Yml0IENSQyBpbiA4Yml0IERhdGEgbW9kZSAqLworICAgICAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4IGRpcmVjdGlvbiAyIGxpbmVzKSAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9GTEFHOworICAgIH0KKworICAgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIHRyYW5zbWl0IHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRE1BIE5vcm1hbCBNb2RlICovCisgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gRE1BX0NDUl9DSVJDKQorICB7CisgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ1JDIGhhbmRsaW5nICovCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPT0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF84QklUKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfUVVBUlRFUl9GVUxMLCBTUElfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLworICAgICAgICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9IQUxGX0ZVTEwsIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgQ1JDIHRvIEZsdXNoIERSIGFuZCBSWE5FIGZsYWcgKi8KKyAgICAgICAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBSeC9UeCBETUEgUmVxdWVzdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgICAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBDYWxsIHVzZXIgVHhSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBoYWxmIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBDYWxsIHVzZXIgVHggaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPlR4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgaGFsZiByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogQ2FsbCB1c2VyIFJ4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGhhbGYgdHJhbnNtaXQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0UmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIENhbGwgdXNlciBUeFJ4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeFJ4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIFN0b3AgdGhlIGRpc2FibGUgRE1BIHRyYW5zZmVyIG9uIFNQSSBzaWRlICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworCisgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCisgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgU3RyZWFtL0NoYW5uZWwgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIG5vIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLworICBoc3BpLT5TdGF0ZSAgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBEaXNhYmxlIFJ4IERNQSBSZXF1ZXN0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKGhzcGktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBTdHJlYW0vQ2hhbm5lbCBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2hlY2sgbm8gZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfQUJPUlQpCisgIHsKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIH0KKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIFNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKworICAvKiBSZXN0b3JlIGhzcGktPlN0YXRlIHRvIFJlYWR5ICovCisgIGhzcGktPlN0YXRlICA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IDgtYml0IGhhbmRsZXIgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlY2VpdmUgZGF0YSBpbiBwYWNraW5nIG1vZGUgKi8KKyAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID4gMVUpCisgIHsKKyAgICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KShoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICBoc3BpLT5SeFhmZXJDb3VudCAtPSAyVTsKKyAgICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMVUpCisgICAgeworICAgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4Yml0ICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICB9CisgIH0KKyAgLyogUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgKmhzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICBoc3BpLT5wUnhCdWZmUHRyKys7CisgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgfQorCisgIC8qIENoZWNrIGVuZCBvZiB0aGUgcmVjZXB0aW9uICovCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgICAgaHNwaS0+UnhJU1IgPSAgU1BJXzJsaW5lc1J4SVNSXzhCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJYTkUgIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWFkIDhiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnc2l0ZXIgKi8KKyAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICBoc3BpLT5DUkNTaXplLS07CisKKyAgLyogQ2hlY2sgZW5kIG9mIHRoZSByZWNlcHRpb24gKi8KKyAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworLyoqCisgICogQGJyaWVmICBUeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBUcmFuc21pdCBkYXRhIGluIHBhY2tpbmcgQml0IG1vZGUgKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID49IDJVKQorICB7CisgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgaHNwaS0+VHhYZmVyQ291bnQgLT0gMlU7CisgIH0KKyAgLyogVHJhbnNtaXQgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7CisgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgIH0KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworCisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmVjZWl2ZSBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBoc3BpLT5SeElTUiA9ICBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1JYTkUpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyAxNi1iaXQgcmVjZWl2ZSBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnc2l0ZXIgKi8KKyAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAvKiBEaXNhYmxlIFJYTkUgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsKKworICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIFR4IDE2LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNUeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IENSQyBOZXh0IEJpdCB0byBzZW5kIENSQyAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgLyogRGlzYWJsZSBUWEUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9UWEUpOworCisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyA4LWJpdCByZWNlaXZlIGluIEludGVycnVwdCBjb250ZXh0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIGhzcGktPkNSQ1NpemUtLTsKKworICBpZiAoaHNwaS0+Q1JDU2l6ZSA9PSAwVSkKKyAgeworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSByZWNlaXZlIDgtYml0IGluIEludGVycnVwdCBjb250ZXh0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICpoc3BpLT5wUnhCdWZmUHRyID0gKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIrKzsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGhzcGktPlJ4SVNSID0gIFNQSV9SeElTUl84QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIENSQyAxNi1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmVhZCAxNmJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgU1BJX0Nsb3NlUnhfSVNSKGhzcGkpOworfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSAxNi1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCkoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5SeFhmZXJDb3VudC0tOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICBpZiAoKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKSAmJiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVRDUkM7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgU1BJX0Nsb3NlUnhfSVNSKGhzcGkpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBkYXRhIDgtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7CisgIGhzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVR4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZGF0YSAxNi1iaXQgdHJhbnNtaXQgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5UeFhmZXJDb3VudC0tOworCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgU1BJX0Nsb3NlVHhfSVNSKGhzcGkpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNQSSBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIEZsYWcgU1BJIGZsYWcgdG8gY2hlY2sKKyAgKiBAcGFyYW0gIFN0YXRlIGZsYWcgc3RhdGUgdG8gY2hlY2sKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIEZsYWcpID8gU0VUIDogUkVTRVQpICE9IFN0YXRlKQorICB7CisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+PSBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFNQSSBhbmQgcmVzZXQgdGhlIENSQzogdGhlIENSQyB2YWx1ZSBzaG91bGQgYmUgY2xlYXJlZAorICAgICAgICBvbiBib3RoIG1hc3RlciBhbmQgc2xhdmUgc2lkZXMgaW4gb3JkZXIgdG8gcmVzeW5jaHJvbml6ZSB0aGUgbWFzdGVyCisgICAgICAgIGFuZCBzbGF2ZSBmb3IgdGhlaXIgcmVzcGVjdGl2ZSBDUkMgY2FsY3VsYXRpb24gKi8KKworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSBhbmQgRVJSIGludGVycnVwdHMgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgICAgICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgICAgICAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgICAgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICAgICAgeworICAgICAgICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgICAgICAgIH0KKworICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNQSSBGSUZPIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgRmlmbyBGaWZvIHRvIGNoZWNrCisgICogQHBhcmFtICBTdGF0ZSBGaWZvIHN0YXRlIHRvIGNoZWNrCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZpZm8sIHVpbnQzMl90IFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKChoc3BpLT5JbnN0YW5jZS0+U1IgJiBGaWZvKSAhPSBTdGF0ZSkKKyAgeworICAgIGlmICgoRmlmbyA9PSBTUElfU1JfRlJMVkwpICYmIChTdGF0ZSA9PSBTUElfRlJMVkxfRU1QVFkpKQorICAgIHsKKyAgICAgIC8qIFJlYWQgOGJpdCBDUkMgdG8gZmx1c2ggRGF0YSBSZWdpc3RlciAqLworICAgICAgUkVBRF9SRUcoKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUikpOworICAgIH0KKworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPj0gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgYW5kIHJlc2V0IHRoZSBDUkM6IHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGNsZWFyZWQKKyAgICAgICAgICAgb24gYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIGluIG9yZGVyIHRvIHJlc3luY2hyb25pemUgdGhlIG1hc3RlcgorICAgICAgICAgICBhbmQgc2xhdmUgZm9yIHRoZWlyIHJlc3BlY3RpdmUgQ1JDIGNhbGN1bGF0aW9uICovCisKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAgICAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgY2hlY2sgb2YgdGhlIFJYIHRyYW5zYWN0aW9uIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9FbmRSeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKQorICB7CisgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICB9CisKKyAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8KKyAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgeworICAgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgY2hlY2sgb2YgdGhlIFJYVFggb3IgVFggdHJhbnNhY3Rpb24gY29tcGxldGUuCisgICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUeFRyYW5zYWN0aW9uKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIC8qIENvbnRyb2wgaWYgdGhlIFRYIGZpZm8gaXMgZW1wdHkgKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZUTFZMLCBTUElfRlRMVkxfRU1QVFksIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogQ29udHJvbCB0aGUgQlNZIGZsYWcgKi8KKyAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogQ29udHJvbCBpZiB0aGUgUlggZmlmbyBpcyBlbXB0eSAqLworICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBSWFRYIHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikgIT0gUkVTRVQpCisgIHsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIGlmIChoc3BpLT5TdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX0JVU1lfUlgpCisgICAgICB7CisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgICBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIENhbGwgdXNlciBUeFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgUlggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VSeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIERpc2FibGUgUlhORSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSAhPSBSRVNFVCkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgVFggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQ2xvc2VUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBEaXNhYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCAoU1BJX0lUX1RYRSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICB9CisKKyAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGluIDIgTGluZXMgY29tbXVuaWNhdGlvbiBtb2RlIGJlY2F1c2UgcmVjZWl2ZWQgaXMgbm90IHJlYWQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorICB7CisgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICB7CisgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBhYm9ydCBhIFJ4IHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Fib3J0UnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50OworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgY291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKworICAvKiBEaXNhYmxlIFJYTkVJRSBpbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYTkVJRSkpOworCisgIC8qIENoZWNrIFJYTkVJRSBpcyBkaXNhYmxlZCAqLworICBkbworICB7CisgICAgaWYgKGNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9CisgIHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYTkVJRSkpOworCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIGFib3J0IGEgVHggb3IgUngvVHggdHJhbnNhY3Rpb24uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIF9fSU8gdWludDMyX3QgY291bnQ7CisKKyAgY291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKworICAvKiBEaXNhYmxlIFRYRUlFIGludGVycnVwdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfVFhFSUUpKTsKKworICAvKiBDaGVjayBUWEVJRSBpcyBkaXNhYmxlZCAqLworICBkbworICB7CisgICAgaWYgKGNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9CisgIHdoaWxlIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSk7CisKKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBDaGVjayBjYXNlIG9mIEZ1bGwtRHVwbGV4IE1vZGUgYW5kIGRpc2FibGUgZGlyZWN0bHkgUlhORUlFIGludGVycnVwdCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKQorICB7CisgICAgLyogRGlzYWJsZSBSWE5FSUUgaW50ZXJydXB0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1JYTkVJRSkpOworCisgICAgLyogQ2hlY2sgUlhORUlFIGlzIGRpc2FibGVkICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKTsKKworICAgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgIH0KKworICAgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgIH0KKyAgfQorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQUJPUlQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2hhbF9zcGlfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX3NwaV9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjRkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF9zcGlfZXguYwpAQCAtMCwwICsxLDExNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfc3BpX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFNQSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgU1BJIHBlcmlwaGVyYWwgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0aWVzIDoKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElFeCBTUElFeAorICAqIEBicmllZiBTUEkgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworI2lmZGVmIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSUV4X1ByaXZhdGVfQ29uc3RhbnRzIFNQSUV4IFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZJRk9fU0laRSAgICAgICA0VUwKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSUV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGV4dGVuZGVkIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIFNQSQorICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgKCMpIFJ4IGRhdGEgZmx1c2ggZnVuY3Rpb246CisgICAgICAgICgrKykgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBGbHVzaCB0aGUgUlggZmlmby4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSUV4X0ZsdXNoUnhGaWZvKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdWludDhfdCAgY291bnQgPSAwVTsKKyAgd2hpbGUgKChoc3BpLT5JbnN0YW5jZS0+U1IgJiBTUElfRkxBR19GUkxWTCkgIT0gIFNQSV9GUkxWTF9FTVBUWSkKKyAgeworICAgIGNvdW50Kys7CisgICAgdG1wcmVnID0gaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIFVOVVNFRCh0bXByZWcpOyAvKiBUbyBhdm9pZCBHQ0Mgd2FybmluZyAqLworICAgIGlmIChjb3VudCA9PSBTUElfRklGT19TSVpFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3RpbS5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwNTcwYgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX3RpbS5jCkBAIC0wLDAgKzEsNjkyNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfdGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUaW1lciAoVElNKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIFN0YXJ0CisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydCBJbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0CisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSAgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0CisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgU3RhcnQgRE1BCisgICogICAgICAgICAgICsgVElNIE9uZSBQdWxzZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVElNIE9uZSBQdWxzZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBJbml0aWFsaXphdGlvbgorICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBFbmNvZGVyIEludGVyZmFjZSBTdGFydCBJbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQgRE1BCisgICogICAgICAgICAgICsgQ29tbXV0YXRpb24gRXZlbnQgY29uZmlndXJhdGlvbiB3aXRoIEludGVycnVwdGlvbiBhbmQgRE1BCisgICogICAgICAgICAgICsgVElNIE9DUmVmIGNsZWFyIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gRXh0ZXJuYWwgQ2xvY2sgY29uZmlndXJhdGlvbgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNRVIgR2VuZXJpYyBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgVGltZXIgZmVhdHVyZXMgaW5jbHVkZToKKyAgICAgICAoIykgMTYtYml0IHVwLCBkb3duLCB1cC9kb3duIGF1dG8tcmVsb2FkIGNvdW50ZXIuCisgICAgICAgKCMpIDE2LWJpdCBwcm9ncmFtbWFibGUgcHJlc2NhbGVyIGFsbG93aW5nIGRpdmlkaW5nIChhbHNvIG9uIHRoZSBmbHkpIHRoZQorICAgICAgICAgICBjb3VudGVyIGNsb2NrIGZyZXF1ZW5jeSBlaXRoZXIgYnkgYW55IGZhY3RvciBiZXR3ZWVuIDEgYW5kIDY1NTM2LgorICAgICAgICgjKSBVcCB0byA0IGluZGVwZW5kZW50IGNoYW5uZWxzIGZvcjoKKyAgICAgICAgICAgKCsrKSBJbnB1dCBDYXB0dXJlCisgICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUKKyAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiAoRWRnZSBhbmQgQ2VudGVyLWFsaWduZWQgTW9kZSkKKyAgICAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQKKyAgICAgICAoIykgU3luY2hyb25pemF0aW9uIGNpcmN1aXQgdG8gY29udHJvbCB0aGUgdGltZXIgd2l0aCBleHRlcm5hbCBzaWduYWxzIGFuZCB0byBpbnRlcmNvbm5lY3QKKyAgICAgICAgICAgIHNldmVyYWwgdGltZXJzIHRvZ2V0aGVyLgorICAgICAgICgjKSBTdXBwb3J0cyBpbmNyZW1lbnRhbCBlbmNvZGVyIGZvciBwb3NpdGlvbmluZyBwdXJwb3NlcworCisgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucworICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBmZWF0dXJlOgorICAgICAgICAgICAoKyspIFRpbWUgQmFzZSA6IEhBTF9USU1fQmFzZV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBJbnB1dCBDYXB0dXJlIDogSEFMX1RJTV9JQ19Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1fT0NfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gOiBIQUxfVElNX1BXTV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQgOiBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoKQorICAgICAgICAgICAoKyspIEVuY29kZXIgbW9kZSBvdXRwdXQgOiBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCgpCisKKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIDoKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIFRJTSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1RJTXhfQ0xLX0VOQUJMRSgpOworICAgICAgICAoIyMpIFRJTSBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBUSU0gR1BJT3MgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKyAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFRJTSBwaW5zIGluIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKTsKKworICAgICAoIykgVGhlIGV4dGVybmFsIENsb2NrIGNhbiBiZSBjb25maWd1cmVkLCBpZiBuZWVkZWQgKHRoZSBkZWZhdWx0IGNsb2NrIGlzIHRoZQorICAgICAgICAgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlLCB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgIGFueSBzdGFydCBmdW5jdGlvbi4KKworICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlCisgICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb2YgdGhpcyBkcml2ZXI6CisgICAgICAgKCsrKSBIQUxfVElNX0Jhc2VfSW5pdDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhIHNpbXBsZSB0aW1lIGJhc2UKKyAgICAgICAoKyspIEhBTF9USU1fT0NfSW5pdCBhbmQgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvIGdlbmVyYXRlIGFuCisgICAgICAgICAgICBPdXRwdXQgQ29tcGFyZSBzaWduYWwuCisgICAgICAgKCsrKSBIQUxfVElNX1BXTV9Jbml0IGFuZCBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyIHRvIGdlbmVyYXRlIGEKKyAgICAgICAgICAgIFBXTSBzaWduYWwuCisgICAgICAgKCsrKSBIQUxfVElNX0lDX0luaXQgYW5kIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBtZWFzdXJlIGFuCisgICAgICAgICAgICBleHRlcm5hbCBzaWduYWwuCisgICAgICAgICAoKyspIEhBTF9USU1fT25lUHVsc2VfSW5pdCBhbmQgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsOiB0byB1c2UgdGhlIFRpbWVyCisgICAgICAgICAgICAgIGluIE9uZSBQdWxzZSBNb2RlLgorICAgICAgICgrKykgSEFMX1RJTV9FbmNvZGVyX0luaXQ6IHRvIHVzZSB0aGUgVGltZXIgRW5jb2RlciBJbnRlcmZhY2UuCisKKyAgICAgKCMpIEFjdGl2YXRlIHRoZSBUSU0gcGVyaXBoZXJhbCB1c2luZyBvbmUgb2YgdGhlIHN0YXJ0IGZ1bmN0aW9ucyBkZXBlbmRpbmcgZnJvbSB0aGUgZmVhdHVyZSB1c2VkOgorICAgICAgICAgICAoKyspIFRpbWUgQmFzZSA6IEhBTF9USU1fQmFzZV9TdGFydCgpLCBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKCksIEhBTF9USU1fQmFzZV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6ICBIQUxfVElNX0lDX1N0YXJ0KCksIEhBTF9USU1fSUNfU3RhcnRfRE1BKCksIEhBTF9USU1fSUNfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlIDogSEFMX1RJTV9PQ19TdGFydCgpLCBIQUxfVElNX09DX1N0YXJ0X0RNQSgpLCBIQUxfVElNX09DX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiA6IEhBTF9USU1fUFdNX1N0YXJ0KCksIEhBTF9USU1fUFdNX1N0YXJ0X0RNQSgpLCBIQUxfVElNX1BXTV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9TdGFydCgpLCBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX1N0YXJ0KCksIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoKSwgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKCkuCisKKyAgICAgKCMpIFRoZSBETUEgQnVyc3QgaXMgbWFuYWdlZCB3aXRoIHRoZSB0d28gZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydCgpCisgICAgICAgICBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydCgpCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgWy4uXQorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgorICBAcmVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgdGhlIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgWy4uXQorICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgd2VhayBmdW5jdGlvbi4KKyAgQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisKKyAgWy4uXQorICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBCYXNlX01zcEluaXRDYWxsYmFjayAgICAgICA6IFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBCYXNlX01zcERlSW5pdENhbGxiYWNrICAgICA6IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIElDX01zcEluaXRDYWxsYmFjayAgICAgICAgIDogVElNIElDIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBJQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICA6IFRJTSBJQyBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBPQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IFRJTSBPQyBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT0NfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgOiBUSU0gT0MgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gUFdNIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBQV01fTXNwRGVJbml0Q2FsbGJhY2sgICAgICA6IFRJTSBQV00gTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT25lUHVsc2VfTXNwSW5pdENhbGxiYWNrICAgOiBUSU0gT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBPbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA6IFRJTSBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgRW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgOiBUSU0gRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgRW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayAgOiBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBIYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIEhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgICAgICA6IFRJTSBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBQZXJpb2RFbGFwc2VkQ2FsbGJhY2sgICAgICA6IFRJTSBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjay4KKyAgICAoKykgUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgIDogVElNIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICAgICAgIDogVElNIFRyaWdnZXIgQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIElDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgIDogVElNIElucHV0IENhcHR1cmUgQ2FsbGJhY2suCisgICAgKCspIElDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgIDogVElNIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2suCisgICAgKCspIFBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgIDogVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjay4KKyAgICAoKykgUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrIDogVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICA6IFRJTSBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgOiBUSU0gQ29tbXV0YXRpb24gQ2FsbGJhY2suCisgICAgKCspIENvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayAgICAgICA6IFRJTSBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBCcmVha0NhbGxiYWNrICAgICAgICAgICAgICA6IFRJTSBCcmVhayBDYWxsYmFjay4KKyAgICAoKykgQnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIDogVElNIEJyZWFrMiBDYWxsYmFjay4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVElNX1NUQVRFX1JFU0VUCisgIGFsbCBpbnRlcnJ1cHQgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgIGV4YW1wbGVzIEByZWYgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soKSwgQHJlZiBIQUxfVElNX0Vycm9yQ2FsbGJhY2soKS4KKworICBbLi5dCisgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhaworICBmdW5jdGlvbmFsaXRpZXMgaW4gdGhlIEluaXQvRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwKKyAgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLiBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEluaXQvRGVJbml0CisgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICBbLi5dCisgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICBpbiBIQUxfVElNX1NUQVRFX1JFQURZIG9yIEhBTF9USU1fU1RBVEVfUkVTRVQgc3RhdGUsCisgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgdXNpbmcgQHJlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBEZUluaXQgb3IgSW5pdCBmdW5jdGlvbi4KKworICBbLi5dCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCisgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU0gVElNCisgICogQGJyaWVmIFRJTSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFRJTXhfT1IxX09DUkVGX0NMUiAweDAwMDAwMDAxVQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9PQzRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fT0M1X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DNl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9USTFfQ29uZmlnSW5wdXRTdGFnZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7CitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJNF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX0lUUnhfU2V0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MzJfdCBJbnB1dFRyaWdnZXJTb3VyY2UpOworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICogc1NsYXZlQ29uZmlnKTsKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVGltZSBCYXNlIGZ1bmN0aW9ucworICogIEBicmllZiAgICBUaW1lIEJhc2UgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBUaW1lIEJhc2UgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gYmFzZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIGJhc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEJhc2UuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRpbWUgQmFzZSBhbmQgZW5hYmxlIERNQSB0cmFuc2Zlci4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBCYXNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBUaW1lIGJhc2UgVW5pdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9CYXNlX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX0Jhc2VfSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZihodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgSEFMX1RJTV9CYXNlX01zcEluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCB0aGUgVGltZSBCYXNlIGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gQmFzZSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEJhc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fQmFzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBCYXNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX1VQREFURSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfVVBEQVRFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCApICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKyAgCisgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdDsKKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+QVJSLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9VUERBVEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9VUERBVEUpOworCisgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVGltZSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVGltZSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdGFydCB0aGUgVGltZSBPdXRwdXQgQ29tcGFyZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBPdXRwdXQgQ29tcGFyZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIE91dHB1dCBDb21wYXJlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSkKKyAgKiAgICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24KKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fT0NfRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fT0NfSW5pdCgpCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfSW5pdChUSU1fSGFuZGxlVHlwZURlZiogaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZihodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmKGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fT0NfTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX09DX01zcEluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIE91dHB1dCBDb21wYXJlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmKGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT0NfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgSEFMX1RJTV9PQ19Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09DX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09DX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBPdXRwdXQgQ29tcGFyZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTSBwZXJpcGhlcmFsCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCApICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKyAgCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMyxMZW5ndGgpIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgTGVuZ3RoKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBUaW1lIFBXTSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVGltZSBQV00gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lIFBXTSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBQV00uCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBQV00uCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIFBXTS4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBQV00uCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIFBXTSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVGltZSBQV00gYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICgrKSBTdGFydCB0aGUgVGltZSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgUFdNIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gVGltZSBCYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9QV01fRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fUFdNX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZihodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmKGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9QV01fTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgUFdNICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZihodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX1BXTV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gUFdNIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfSVQgKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigocERhdGEgPT0gTlVMTCApICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ2FwdHVyZS9Db21wYXJlIDMgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRpbWUgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVGltZSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBTdGFydCB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgKCspIFN0b3AgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICgrKSBTdGFydCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgVGltZSBiYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9JQ19EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9JQ19Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZihodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9JQ19Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBJbml0IHRoZSBiYXNlIHRpbWUgZm9yIHRoZSBpbnB1dCBjYXB0dXJlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZihodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fSUNfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIElucHV0IENhcHR1cmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0lDX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydCAoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfSVQgKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIElucHV0IENhcHR1cmUgbWVhc3VyZW1lbnQgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKChwRGF0YSA9PSBOVUxMICkgJiYgKExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSNCwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0ICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBUaW1lIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgVElNIE9uZSBQdWxzZS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT25lIFB1bHNlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBPbmUgUHVsc2UgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZSBUaW1lIEJhc2UgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCisgICogICAgICAgICByZXF1aXJlcyBhIHRpbWVyIHJlc2V0IHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlyZWN0aW9uCisgICogICAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqICAgICAgICAgRXg6IGNhbGwgQHJlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX09uZVB1bHNlX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPbmVQdWxzZU1vZGUgU2VsZWN0IHRoZSBPbmUgcHVsc2UgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9PUE1PREVfU0lOR0xFOiBPbmx5IG9uZSBwdWxzZSB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX09QTU9ERV9SRVBFVElUSVZFOiBSZXBldGl0aXZlIHB1bHNlcyB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT25lUHVsc2VNb2RlKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fTU9ERShPbmVQdWxzZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYoaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIE9uZSBQdWxzZSBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjEgJj0gflRJTV9DUjFfT1BNOworCisgIC8qIENvbmZpZ3VyZSB0aGUgT1BNIE1vZGUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMSB8PSBPbmVQdWxzZU1vZGU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZihodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gT25lIFB1bHNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChPdXRwdXRDaGFubmVsKTsKKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBhbmQgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMKKyAgICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kCisgICAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0CisgICAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGVuYWJsZWQgdG9nZXRoZXIKKworICAgIE5vIG5lZWQgdG8gZW5hYmxlIHRoZSBjb3VudGVyLCBpdCdzIGVuYWJsZWQgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZQorICAgICh0aGUgY291bnRlciBzdGFydHMgaW4gcmVzcG9uc2UgdG8gYSBzdGltdWx1cyBhbmQgZ2VuZXJhdGUgYSBwdWxzZSAqLworCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoT3V0cHV0Q2hhbm5lbCk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKQorICAgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBpbnB1dCBhbmQKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcgorCisgICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChPdXRwdXRDaGFubmVsKTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBUaW1lIEVuY29kZXIgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRpbWUgRW5jb2RlciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX0VuY29kZXJfSW5pdCgpCisgICogQG5vdGUgICBFbmNvZGVyIG1vZGUgYW5kIEV4dGVybmFsIGNsb2NrIG1vZGUgMiBhcmUgbm90IGNvbXBhdGlibGUgYW5kIG11c3Qgbm90IGJlIHNlbGVjdGVkIHRvZ2V0aGVyCisgICogICAgICAgICBFeDogQSBjYWxsIGZvciBAcmVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0IHdpbGwgZXJhc2UgdGhlIHNldHRpbmdzIG9mIEByZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZQorICAqICAgICAgICAgdXNpbmcgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyIGFuZCB2aWNlIHZlcnNhCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIEVuY29kZXIgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmKiBzQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX01PREUoc0NvbmZpZy0+RW5jb2Rlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19TRUxFQ1RJT04oc0NvbmZpZy0+SUMxU2VsZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMlNlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDMVBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUMyUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUMyRmlsdGVyKSk7CisKKyAgaWYoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZihodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogUmVzZXQgdGhlIFNNUyBhbmQgRUNFIGJpdHMgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gfihUSU1fU01DUl9TTVMgfCBUSU1fU01DUl9FQ0UpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgVGltZSBiYXNlIGluIHRoZSBFbmNvZGVyIE1vZGUgKi8KKyAgVElNX0Jhc2VfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmaHRpbS0+SW5pdCk7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IGh0aW0tPkluc3RhbmNlLT5DQ01SMTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7CisKKyAgLyogU2V0IHRoZSBlbmNvZGVyIE1vZGUgKi8KKyAgdG1wc21jciB8PSBzQ29uZmlnLT5FbmNvZGVyTW9kZTsKKworICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSAxIGFuZCB0aGUgQ2FwdHVyZSBDb21wYXJlIDIgYXMgaW5wdXQgKi8KKyAgdG1wY2NtcjEgJj0gfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9DQzJTKTsKKyAgdG1wY2NtcjEgfD0gKHNDb25maWctPklDMVNlbGVjdGlvbiB8IChzQ29uZmlnLT5JQzJTZWxlY3Rpb24gPDwgOFUpKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSAxIGFuZCB0aGUgQ2FwdHVyZSBDb21wYXJlIDIgcHJlc2NhbGVycyBhbmQgZmlsdGVycyAqLworICB0bXBjY21yMSAmPSB+KFRJTV9DQ01SMV9JQzFQU0MgfCBUSU1fQ0NNUjFfSUMyUFNDKTsKKyAgdG1wY2NtcjEgJj0gfihUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzJGKTsKKyAgdG1wY2NtcjEgfD0gc0NvbmZpZy0+SUMxUHJlc2NhbGVyIHwgKHNDb25maWctPklDMlByZXNjYWxlciA8PCA4VSk7CisgIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFGaWx0ZXIgPDwgNFUpIHwgKHNDb25maWctPklDMkZpbHRlciA8PCAxMlUpOworCisgIC8qIFNldCB0aGUgVEkxIGFuZCB0aGUgVEkyIFBvbGFyaXRpZXMgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzJQKTsKKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MyTlApOworICB0bXBjY2VyIHw9IHNDb25maWctPklDMVBvbGFyaXR5IHwgKHNDb25maWctPklDMlBvbGFyaXR5IDw8IDRVKTsKKworICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxID0gdG1wY2NtcjE7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ0VSID0gdG1wY2NlcjsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgaW50ZXJmYWNlCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYoaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGRlZmF1bHQgOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzIDEgYW5kIDIKKyAgICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGRlZmF1bHQgOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kL29yIDIgKi8KKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBkZWZhdWx0IDoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCisgIGlmKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMSkKKyAgeworICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgICAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICB9CisgIGVsc2UgaWYoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKyAgZWxzZQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhMSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMS4KKyAgKiBAcGFyYW0gIHBEYXRhMiBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMi4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGExLCB1aW50MzJfdCAqcERhdGEyLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoKChwRGF0YTEgPT0gTlVMTCkgfHwgKHBEYXRhMiA9PSBOVUxMKSApKSAmJiAoTGVuZ3RoID4gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90IClwRGF0YTEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworCisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCAodWludDMyX3QpcERhdGEyLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfQUxMOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscyAxIGFuZCAyCisgICAgKGluIHRoZSBFbmNvZGVySW50ZXJmYWNlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikgKi8KKyAgaWYoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgRE1BIFJlcXVlc3QgMSAqLworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgIH0KKyAgZWxzZSBpZihDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAqICBAYnJpZWYgICAgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJUlEgaGFuZGxlciBtYW5hZ2VtZW50ICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRpbWVyIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVElNIGludGVycnVwdHMgcmVxdWVzdHMuCisgICogQHBhcmFtICBodGltIFRJTSAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9USU1fSVJRSGFuZGxlcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2FwdHVyZSBjb21wYXJlIDEgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0MxKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICB7CisgICAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKworICAgICAgICAvKiBJbnB1dCBjYXB0dXJlIGV2ZW50ICovCisgICAgICAgIGlmKChodGltLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfQ0MxUykgIT0gMHgwMFUpCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDIgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMikgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0MyKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgaWYoKGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9DQzJTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDMgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMykgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0MzKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgaWYoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzNTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogQ2FwdHVyZSBjb21wYXJlIDQgZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDNCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ0M0KSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgaWYoKGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9DQzRTKSAhPSAweDAwVSkKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgLyogT3V0cHV0IGNvbXBhcmUgZXZlbnQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKKyAgICB9CisgIH0KKyAgLyogVElNIFVwZGF0ZSBldmVudCAqLworICBpZihfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVVBEQVRFKSAhPSBSRVNFVCkKKyAgeworICAgIGlmKF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKGh0aW0sIFRJTV9JVF9VUERBVEUpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfVVBEQVRFKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIFRJTSBCcmVhayBpbnB1dCBldmVudCAqLworICBpZihfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUspICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0JSRUFLKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5CcmVha0NhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gQnJlYWsyIGlucHV0IGV2ZW50ICovCisgIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUsyKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQlJFQUspICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0JSRUFLMik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+QnJlYWsyQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gVHJpZ2dlciBkZXRlY3Rpb24gZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX1RSSUdHRVIpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX1RSSUdHRVIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVChodGltLCBUSU1fSVRfVFJJR0dFUik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gY29tbXV0YXRpb24gZXZlbnQgKi8KKyAgaWYoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NPTSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQ09NKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0ZMQUdfQ09NKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSBUaGUgSW5wdXQgT3V0cHV0IGNoYW5uZWxzIGZvciBPQywgUFdNLCBJQyBvciBPbmUgUHVsc2UgbW9kZS4KKyAgICAgICgrKSBDb25maWd1cmUgRXh0ZXJuYWwgQ2xvY2sgc291cmNlLgorICAgICAgKCspIENvbmZpZ3VyZSBDb21wbGVtZW50YXJ5IGNoYW5uZWxzLCBicmVhayBmZWF0dXJlcyBhbmQgZGVhZCB0aW1lLgorICAgICAgKCspIENvbmZpZ3VyZSBNYXN0ZXIgYW5kIHRoZSBTbGF2ZSBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT0NfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIE91dHB1dCBDb21wYXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiogc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKHNDb25maWctPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAxIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMiBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDMgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCA0IGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0M0X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzU6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgNSBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DNV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF82OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDYgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzZfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9JQ19Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gSW5wdXQgQ2FwdHVyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9JQ19Jbml0VHlwZURlZiogc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDU2VsZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDRmlsdGVyKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8KKyAgICBUSU1fVEkxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKworICAgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQzsKKworICAgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPklDUHJlc2NhbGVyOworICB9CisgIGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMikKKyAgeworICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgIFRJTV9USTJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDOworCisgICAgLyogU2V0IHRoZSBJQzJQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKHNDb25maWctPklDUHJlc2NhbGVyIDw8IDhVKTsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzMpCisgIHsKKyAgICAvKiBUSTMgQ29uZmlndXJhdGlvbiAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICBUSU1fVEkzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDRmlsdGVyKTsKKworICAgIC8qIFJlc2V0IHRoZSBJQzNQU0MgQml0cyAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX0lDM1BTQzsKKworICAgIC8qIFNldCB0aGUgSUMzUFNDIHZhbHVlICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPklDUHJlc2NhbGVyOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFRJNCBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgIFRJTV9USTRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgLyogUmVzZXQgdGhlIElDNFBTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfSUM0UFNDOworCisgICAgLyogU2V0IHRoZSBJQzRQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gKHNDb25maWctPklDUHJlc2NhbGVyIDw8IDhVKTsKKyAgfQorCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIFBXTSAgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ19Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIFBXTSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYqIHNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1BXTV9NT0RFKHNDb25maWctPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKHNDb25maWctPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GQVNUX1NUQVRFKHNDb25maWctPk9DRmFzdE1vZGUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDEgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWwxICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMUZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPk9DRmFzdE1vZGU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAyIGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzJGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMyBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDMgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDQgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw0ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNEZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzU6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCA1IGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0M1X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsNSovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNVBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M2X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCA2IGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0M2X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsNiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzZQRTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgJj0gflRJTV9DQ01SM19PQzZGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlIDw8IDhVOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT25lIFB1bHNlIENoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBPbmUgUHVsc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIG91dHB1dCBjaGFubmVsIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEBwYXJhbSAgSW5wdXRDaGFubmVsIFRJTSBpbnB1dCBDaGFubmVsIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCAgVElNX09uZVB1bHNlX0luaXRUeXBlRGVmKiBzQ29uZmlnLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsLCAgdWludDMyX3QgSW5wdXRDaGFubmVsKQoreworICBUSU1fT0NfSW5pdFR5cGVEZWYgdGVtcDE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fQ0hBTk5FTFMoT3V0cHV0Q2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09QTV9DSEFOTkVMUyhJbnB1dENoYW5uZWwpKTsKKworICBpZihPdXRwdXRDaGFubmVsICE9IElucHV0Q2hhbm5lbCkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodGltKTsKKworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgICAgLyogRXh0cmFjdCB0aGUgT3V0cHV0IGNvbXBhcmUgY29uZmlndXJhdGlvbiBmcm9tIHNDb25maWcgc3RydWN0dXJlICovCisgICAgdGVtcDEuT0NNb2RlID0gc0NvbmZpZy0+T0NNb2RlOworICAgIHRlbXAxLlB1bHNlID0gc0NvbmZpZy0+UHVsc2U7CisgICAgdGVtcDEuT0NQb2xhcml0eSA9IHNDb25maWctPk9DUG9sYXJpdHk7CisgICAgdGVtcDEuT0NOUG9sYXJpdHkgPSBzQ29uZmlnLT5PQ05Qb2xhcml0eTsKKyAgICB0ZW1wMS5PQ0lkbGVTdGF0ZSA9IHNDb25maWctPk9DSWRsZVN0YXRlOworICAgIHRlbXAxLk9DTklkbGVTdGF0ZSA9IHNDb25maWctPk9DTklkbGVTdGF0ZTsKKworICAgIHN3aXRjaCAoT3V0cHV0Q2hhbm5lbCkKKyAgICB7CisgICAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZ0ZW1wMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCAmdGVtcDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoSW5wdXRDaGFubmVsKQorICAgIHsKKyAgICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICBUSU1fVEkxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sIHNDb25maWctPklDRmlsdGVyKTsKKworICAgICAgICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMxUFNDOworCisgICAgICAgIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzb3VyY2UgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkxRlAxOworCisgICAgICAgIC8qIFNlbGVjdCB0aGUgU2xhdmUgTW9kZSAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1RSSUdHRVI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAgIFRJTV9USTJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgICAgIC8qIFJlc2V0IHRoZSBJQzJQU0MgQml0cyAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzJQU0M7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7CisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTJGUDI7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTEFWRU1PREVfVFJJR0dFUjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IHRvIHRyYW5zZmVyIERhdGEgZnJvbSB0aGUgbWVtb3J5IHRvIHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdEJhc2VBZGRyZXNzIFRJTSBCYXNlIGFkZHJlc3MgZnJvbSB3aGVyZSB0aGUgRE1BICB3aWxsIHN0YXJ0IHRoZSBEYXRhIHdyaXRlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMyAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNSAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNiAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYxICAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQUYyICAKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfVElTRUwKKyAgKiBAcGFyYW0gIEJ1cnN0UmVxdWVzdFNyYyBUSU0gRE1BIFJlcXVlc3Qgc291cmNlcworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogVElNIENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogVElNIENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DT006IFRJTSBDb21tdXRhdGlvbiBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQorICAqIEBwYXJhbSAgQnVyc3RCdWZmZXIgVGhlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgQnVyc3RMZW5ndGggRE1BIEJ1cnN0IGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZQorICAqICAgICAgICAgYmV0d2VlbjogVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiBhbmQgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gQnVyc3RMZW5ndGggaXMgZXF1YWwgdG8gRE1BIGRhdGEgdHJhbnNmZXIgbGVuZ3RoLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIEJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQkFTRShCdXJzdEJhc2VBZGRyZXNzKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoQnVyc3RCdWZmZXIgPT0gTlVMTCApICYmIChCdXJzdExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorICBzd2l0Y2goQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NPTToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21tdXRhdGlvbiBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSAgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIHRyaWdnZXIgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogY29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+RENSID0gKEJ1cnN0QmFzZUFkZHJlc3MgfCBCdXJzdExlbmd0aCk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gRE1BIFJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRE1BIEJ1cnN0IG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzIHRvIGRpc2FibGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworCisgIC8qIEFib3J0IHRoZSBETUEgdHJhbnNmZXIgKGF0IGxlYXN0IGRpc2FibGUgdGhlIERNQSBjaGFubmVsKSAqLworICBzd2l0Y2goQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICBzdGF0dXMgPSAgSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDNDoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ09NOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChIQUxfT0sgPT0gc3RhdHVzKQorICB7CisgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgdG8gdHJhbnNmZXIgRGF0YSBmcm9tIHRoZSBUSU0gcGVyaXBoZXJhbCB0byB0aGUgbWVtb3J5CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgIHdpbGwgc3RhcnQgdGhlIERhdGEgcmVhZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TTUNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0RJRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRUdSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDRVIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ05UCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1BTQworICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BUlIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUkNSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IzCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQkRUUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9PUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjMgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjYgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMSAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMiAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1RJU0VMCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UKKyAgKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUKKyAgKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kIFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIEJ1cnN0TGVuZ3RoIGlzIGVxdWFsIHRvIERNQSBkYXRhIHRyYW5zZmVyIGxlbmd0aC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BQlVSU1RfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQkFTRShCdXJzdEJhc2VBZGRyZXNzKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoQnVyc3RCdWZmZXIgPT0gTlVMTCApICYmIChCdXJzdExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfSAgCisgIHN3aXRjaChCdXJzdFJlcXVlc3RTcmMpCisgIHsKKyAgICBjYXNlIFRJTV9ETUFfVVBEQVRFOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gIFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlL2NvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gIFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSAgVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ09NOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbW11dGF0aW9uIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9ICBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfVFJJR0dFUjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSB0cmlnZ2VyIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQVRyaWdnZXJDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VySGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVFJJR0dFUl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBjb25maWd1cmUgdGhlIERNQSBCdXJzdCBNb2RlICovCisgIGh0aW0tPkluc3RhbmNlLT5EQ1IgPSAoQnVyc3RCYXNlQWRkcmVzcyB8IEJ1cnN0TGVuZ3RoKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBETUEgUmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBCdXJzdFJlcXVlc3RTcmMpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRE1BIGJ1cnN0IHJlYWRpbmcKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzIHRvIGRpc2FibGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworCisgIC8qIEFib3J0IHRoZSBETUEgdHJhbnNmZXIgKGF0IGxlYXN0IGRpc2FibGUgdGhlIERNQSBjaGFubmVsKSAqLworICBzd2l0Y2goQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DT006CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfVFJJR0dFUjoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKEhBTF9PSyA9PSBzdGF0dXMpCisgIHsKKyAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGV2ZW50CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEV2ZW50U291cmNlIHNwZWNpZmllcyB0aGUgZXZlbnQgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9VUERBVEU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DT006IFRpbWVyIENPTSBldmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX1RSSUdHRVI6IFRpbWVyIFRyaWdnZXIgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzogVGltZXIgQnJlYWsgZXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzI6IFRpbWVyIEJyZWFrMiBldmVudCBzb3VyY2UKKyAgKiBAbm90ZSAgIEJhc2ljIHRpbWVycyBjYW4gb25seSBnZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQuCisgICogQG5vdGUgICBUSU1fRVZFTlRTT1VSQ0VfQ09NIGlzIHJlbGV2YW50IG9ubHkgd2l0aCBhZHZhbmNlZCB0aW1lciBpbnN0YW5jZXMuCisgICogQG5vdGUgICBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsgYW5kIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIgYXJlIHJlbGV2YW50CisgICogICAgICAgICBvbmx5IGZvciB0aW1lciBpbnN0YW5jZXMgc3VwcG9ydGluZyBicmVhayBpbnB1dChzKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VWRU5UX1NPVVJDRShFdmVudFNvdXJjZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovCisgIGh0aW0tPkluc3RhbmNlLT5FR1IgPSBFdmVudFNvdXJjZTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBPQ1JlZiBjbGVhciBmZWF0dXJlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDbGVhcklucHV0Q29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdPQ3JlZkNsZWFyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqc0NsZWFySW5wdXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUklOUFVUX1NPVVJDRShzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFNvdXJjZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisgIAorICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICBzd2l0Y2ggKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKQorICB7CisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9OT05FOgorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBPQ1JFRiBjbGVhciBzZWxlY3Rpb24gYml0IGFuZCB0aGUgdGhlIEVUUiBCaXRzICovCisgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIChUSU1fU01DUl9PQ0NTIHwgVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCkpOworICAgICAgCisgICAgICAvKiBDbGVhciBUSU14X09SMV9PQ1JFRl9DTFIgKHJlc2V0IHZhbHVlKSAqLworICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5PUjEsIFRJTXhfT1IxX09DUkVGX0NMUik7CisgICAgICBicmVhazsKKyAgICB9CisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxOgorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBPQ1JFRiBjbGVhciBzZWxlY3Rpb24gYml0ICovCisgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIFRJTV9TTUNSX09DQ1MpOworCisgICAgICAvKiBPQ1JFRl9DTFJfSU5UIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgKi8KKyAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+T1IxLCBUSU14X09SMV9PQ1JFRl9DTFIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDI6CisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfT0NDUyk7CisKKyAgICAgIC8qIE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCAqLworICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+T1IxLCBUSU14X09SMV9PQ1JFRl9DTFIpOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisgICAgCisgICAgY2FzZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9FVFI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9QT0xBUklUWShzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfUFJFU0NBTEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0RmlsdGVyKSk7CisKKyAgICAgIC8qIFdoZW4gT0NSZWYgY2xlYXIgZmVhdHVyZSBpcyB1c2VkIHdpdGggRVRSIHNvdXJjZSwgRVRSIHByZXNjYWxlciBtdXN0IGJlIG9mZiAqLworICAgICAgaWYgKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UHJlc2NhbGVyICE9IFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjEpCisgICAgICB7CisgICAgICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgICAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRGaWx0ZXIpOworCisgICAgICAvKiBTZXQgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPlNNQ1IsIFRJTV9TTUNSX09DQ1MpOworICAgICAgCisgICAgICAvKiBDbGVhciBUSU14X09SMV9PQ1JFRl9DTFIgKHJlc2V0IHZhbHVlKSAqLworICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5PUjEsIFRJTXhfT1IxX09DUkVGX0NMUik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAxICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MxQ0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDEgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMSwgVElNX0NDTVIxX09DMUNFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDIgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjEsIFRJTV9DQ01SMV9PQzJDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMiAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MyQ0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICBpZihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMyAqLworICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DM0NFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCAzICovCisgICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjIsIFRJTV9DQ01SMl9PQzNDRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIGlmKHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U3RhdGUgIT0gKHVpbnQzMl90KURJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA0ICovCisgICAgICAgIFNFVF9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0M0Q0UpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDQgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMiwgVElNX0NDTVIyX09DNENFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzU6CisgICAgeworICAgICAgICBpZihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFN0YXRlICE9ICh1aW50MzJfdClESVNBQkxFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNSAqLworICAgICAgICBTRVRfQklUKGh0aW0tPkluc3RhbmNlLT5DQ01SMywgVElNX0NDTVIzX09DNUNFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBmb3IgQ2hhbm5lbCA1ICovCisgICAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjMsIFRJTV9DQ01SM19PQzVDRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fQ0hBTk5FTF82OgorICAgIHsKKyAgICAgICAgaWYoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjMsIFRJTV9DQ01SM19PQzZDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNiAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M2Q0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgICBDb25maWd1cmVzIHRoZSBjbG9jayBzb3VyY2UgdG8gYmUgdXNlZAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBzQ2xvY2tTb3VyY2VDb25maWcgcG9pbnRlciB0byBhIFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjbG9jayBzb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgKiBzQ2xvY2tTb3VyY2VDb25maWcpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpKTsKKworICAvKiBSZXNldCB0aGUgU01TLCBUUywgRUNFLCBFVFBTIGFuZCBFVFJGIGJpdHMgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCk7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICBzd2l0Y2ggKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpCisgIHsKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTDoKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMToKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBtb2RlIDEgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgRVRSIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisKKyAgICAgIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgYW5kIHRoZSBFVFJGIHRyaWdnZXIgKi8KKyAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKyAgICAgIHRtcHNtY3IgfD0gKFRJTV9TTEFWRU1PREVfRVhURVJOQUwxIHwgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKTsKKyAgICAgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTI6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQgbW9kZSAyIChFVFJGKSovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIEVUUiBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUFJFU0NBTEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBDbG9jayBzb3VyY2UgKi8KKyAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgLyogRW5hYmxlIHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NNQ1JfRUNFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKwkgIAorICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9USTI6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMSAoRVRSRikqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgVEkyIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgVElNX0lUUnhfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMUVEOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMUVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjA6CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMToKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIyOgorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjM6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGludGVybmFsIHRyaWdnZXIgaW5wdXQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBzaWduYWwgY29ubmVjdGVkIHRvIHRoZSBUSTEgaW5wdXQ6IGRpcmVjdCBmcm9tIENIMV9pbnB1dAorICAqICAgICAgICAgb3IgYSBYT1IgY29tYmluYXRpb24gYmV0d2VlbiBDSDFfaW5wdXQsIENIMl9pbnB1dCAmIENIM19pbnB1dAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgVEkxX1NlbGVjdGlvbiBJbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBjaGFubmVsIDEgaXMgY29ubmVjdGVkIHRvIHRoZQorICAqICAgICAgICAgb3V0cHV0IG9mIGEgWE9SIGdhdGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJMVNFTEVDVElPTl9DSDE6IFRoZSBUSU14X0NIMSBwaW4gaXMgY29ubmVjdGVkIHRvIFRJMSBpbnB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OOiBUaGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzCisgICogICAgICAgICAgICBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVEkxX1NlbGVjdGlvbikKK3sKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fWE9SX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVEkxU0VMRUNUSU9OKFRJMV9TZWxlY3Rpb24pKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IGh0aW0tPkluc3RhbmNlLT5DUjI7CisKKyAgLyogUmVzZXQgdGhlIFRJMSBzZWxlY3Rpb24gKi8KKyAgdG1wY3IyICY9IH5USU1fQ1IyX1RJMVM7CisKKyAgLyogU2V0IHRoZSBUSTEgc2VsZWN0aW9uICovCisgIHRtcGNyMiB8PSBUSTFfU2VsZWN0aW9uOworCisgIC8qIFdyaXRlIHRvIFRJTXhDUjIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZAorICAqICAgICAgICAgdGltZXIgaW5wdXQgb3IgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCkgYW5kIHRoZSBTbGF2ZSBtb2RlCisgICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm8oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX01PREUoc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgaWYoVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKGh0aW0sIHNTbGF2ZUNvbmZpZykgIT0gSEFMX09LKQorICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgX19IQUxfVU5MT0NLKGh0aW0pOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBEaXNhYmxlIFRyaWdnZXIgSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsKKworICAvKiBEaXNhYmxlIFRyaWdnZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVFJJR0dFUik7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlIGluIGludGVycnVwdCBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZAorICAqICAgICAgICAgdGltZXIgaW5wdXQgb3IgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCkgYW5kIHRoZSBTbGF2ZSBtb2RlCisgICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9fSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKiBzU2xhdmVDb25maWcpCisgICAgeworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfTU9ERShzU2xhdmVDb25maWctPlNsYXZlTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJfU0VMRUNUSU9OKHNTbGF2ZUNvbmZpZy0+SW5wdXRUcmlnZ2VyKSk7CisgIAorICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIGlmKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRW5hYmxlIFRyaWdnZXIgSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX1RSSUdHRVIpOworCisgIC8qIERpc2FibGUgVHJpZ2dlciBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9UUklHR0VSKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCB0aGUgY2FwdHVyZWQgdmFsdWUgZnJvbSBDYXB0dXJlIENvbXBhcmUgdW5pdAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIENhcHR1cmVkIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXByZWcgPSAwVTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAxIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgaHRpbS0+SW5zdGFuY2UtPkNDUjE7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAyIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1IyOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSAzIHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1IzOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIFJldHVybiB0aGUgY2FwdHVyZSA0IHZhbHVlICovCisgICAgICB0bXByZWcgPSAgIGh0aW0tPkluc3RhbmNlLT5DQ1I0OworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdG1wcmVnOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRJTSBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAoKykgVGltZXIgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sKKyAgICgrKSBUaW1lciBPdXRwdXQgQ29tcGFyZSBjYWxsYmFjaworICAgKCspIFRpbWVyIElucHV0IGNhcHR1cmUgY2FsbGJhY2sKKyAgICgrKSBUaW1lciBUcmlnZ2VyIGNhbGxiYWNrCisgICAoKykgVGltZXIgRXJyb3IgY2FsbGJhY2sKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQZXJpb2QgZWxhcHNlZCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUGVyaW9kIGVsYXBzZWQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBPQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5wdXQgQ2FwdHVyZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5wdXQgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUFdNIFB1bHNlIGZpbmlzaGVkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFBXTSBQdWxzZSBmaW5pc2hlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYWxsIFRyaWdnZXIgZGV0ZWN0aW9uIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYWxsIFRyaWdnZXIgZGV0ZWN0aW9uIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Vycm9yQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFRJTSBjYWxsYmFjayB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBodGltIHRpbSBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgSUMgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgT0MgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgT25lIFB1bHNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCBFbmNvZGVyIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgVHJpZ2dlciBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEIElucHV0IENhcHR1cmUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgSW5wdXQgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCBDb21tdXRhdGlvbiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JSRUFLX0NCX0lEIEJyZWFrIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUsyX0NCX0lEIEJyZWFrMiBDYWxsYmFjayBJRAorICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBUSU1fQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEIDoKKyAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEIDoKKyAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX0NBUFRVUkVfSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCA6CisgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayAgICAgID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIDoKKyAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FUlJPUl9DQl9JRCA6CisgICAgICBodGltLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgOgorICAgICAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fQlJFQUtfQ0JfSUQgOgorICAgICAgaHRpbS0+QnJlYWtDYWxsYmFjayAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQlJFQUsyX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+QnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBUSU0gY2FsbGJhY2sKKyAgKiAgICAgICAgIFRJTSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaHRpbSB0aW0gaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCBCYXNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgSUMgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgT0MgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgUFdNIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgT25lIFB1bHNlIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCBFbmNvZGVyIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCBFbmNvZGVyIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9DQl9JRCBQZXJpb2QgRWxhcHNlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgVHJpZ2dlciBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCBUcmlnZ2VyIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19DQVBUVVJFX0NCX0lEIElucHV0IENhcHR1cmUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgSW5wdXQgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEIFBXTSBQdWxzZSBGaW5pc2hlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9DQl9JRCBDb21tdXRhdGlvbiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JSRUFLX0NCX0lEIEJyZWFrIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUsyX0NCX0lEIEJyZWFrMiBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZihodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX0Jhc2VfTXNwSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICA9IEhBTF9USU1fQmFzZV9Nc3BEZUluaXQ7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX0lDX01zcEluaXQ7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9USU1fSUNfTXNwRGVJbml0OyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5PQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9PQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX09DX01zcERlSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfVElNX1BXTV9Nc3BJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgID0gSEFMX1RJTV9QV01fTXNwRGVJbml0OyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrICAgICA9IEhBTF9USU1fT25lUHVsc2VfTXNwSW5pdDsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrICAgPSBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdDsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0OyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayAgICA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrICAgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0OyAgICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdDsgICAgLyogTGVnYWN5IHdlYWsgSGFsbCBTZW5zb3IgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQgOgorICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrICAgICA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICA9IEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJpZ2dlciBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQgOgorICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgQ2FwdHVyZSBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgOgorICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgICAgICA9IEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgT0MgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEIDoKKyAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgICAgPSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FUlJPUl9DQl9JRCA6CisgICAgICBodGltLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgOgorICAgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb24gQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9DT01NVVRBVElPTl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+Q29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrICAgICAgID0gSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0JSRUFLX0NCX0lEIDoKKyAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2sgICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQnJlYWtDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJyZWFrIENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JSRUFLMl9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9IEhBTF9USU1FeF9CcmVhazJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhazIgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9USU1fQmFzZV9Nc3BJbml0OyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQmFzZSBNc3BJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5CYXNlX01zcERlSW5pdENhbGxiYWNrICAgICAgID0gSEFMX1RJTV9CYXNlX01zcERlSW5pdDsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fSUNfTXNwSW5pdDsgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUMgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9JQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX09DX01zcEluaXQ7ICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9USU1fT0NfTXNwRGVJbml0OyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IEhBTF9USU1fUFdNX01zcEluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgPSBIQUxfVElNX1BXTV9Nc3BEZUluaXQ7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0OyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0OyAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayAgICAgID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgID0gSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdDsgICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgICA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQ7ICAgICAgLyogTGVnYWN5IHdlYWsgSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0OyAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxMCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gQmFzZSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0Jhc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBPQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PQ19HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIFBXTSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9QV01fR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0lDX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gT25lIFB1bHNlIE1vZGUgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT1BNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gRW5jb2RlciBNb2RlIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0VuY29kZXJfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIGVycm9yIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiogaHRpbSA9ICggVElNX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgIGh0aW0tPkVycm9yQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX0Vycm9yQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBEZWxheSBQdWxzZSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BRGVsYXlQdWxzZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmKiBodGltID0gKCBUSU1fSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+UFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBDYXB0dXJlIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYqIGh0aW0gPSAoIFRJTV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgQ2FwdHVyZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX0lDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBQZXJpb2QgRWxhcHNlIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmKiBodGltID0gKCBUSU1fSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFBlcmlvZCBFbGFwc2UgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYqIGh0aW0gPSAoIFRJTV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKGh0aW0pOworICNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lIEJhc2UgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgU3RydWN0dXJlIFRJTSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworICB0bXBjcjEgPSBUSU14LT5DUjE7CisKKyAgLyogU2V0IFRJTSBUaW1lIEJhc2UgVW5pdCBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgdG1wY3IxICY9IH4oVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyk7CisgICAgdG1wY3IxIHw9IFN0cnVjdHVyZS0+Q291bnRlck1vZGU7CisgIH0KKworICBpZihJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZXQgdGhlIGNsb2NrIGRpdmlzaW9uICovCisgICAgdG1wY3IxICY9IH5USU1fQ1IxX0NLRDsKKyAgICB0bXBjcjEgfD0gKHVpbnQzMl90KVN0cnVjdHVyZS0+Q2xvY2tEaXZpc2lvbjsKKyAgfQorCisgIC8qIFNldCB0aGUgYXV0by1yZWxvYWQgcHJlbG9hZCAqLworICBNT0RJRllfUkVHKHRtcGNyMSwgVElNX0NSMV9BUlBFLCBTdHJ1Y3R1cmUtPkF1dG9SZWxvYWRQcmVsb2FkKTsKKworICBUSU14LT5DUjEgPSB0bXBjcjE7CisKKyAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovCisgIFRJTXgtPkFSUiA9ICh1aW50MzJfdClTdHJ1Y3R1cmUtPlBlcmlvZCA7CisKKyAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8KKyAgVElNeC0+UFNDID0gU3RydWN0dXJlLT5QcmVzY2FsZXI7CisKKyAgaWYgKElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLworICAgIFRJTXgtPlJDUiA9IFN0cnVjdHVyZS0+UmVwZXRpdGlvbkNvdW50ZXI7CisgIH0KKworICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIKKyAgICAgYW5kIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgKG9ubHkgZm9yIGFkdmFuY2VkIHRpbWVyKSB2YWx1ZSBpbW1lZGlhdGVseSAqLworICBUSU14LT5FR1IgPSBUSU1fRUdSX1VHOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDEgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fT0MxX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIxOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9PQzFNOworICB0bXBjY21yeCAmPSB+VElNX0NDTVIxX0NDMVM7CisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMVA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSBPQ19Db25maWctPk9DUG9sYXJpdHk7CisKKyAgaWYoSVNfVElNX0NDWE5fSU5TVEFOQ0UoVElNeCwgVElNX0NIQU5ORUxfMSkpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5IGxldmVsICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MxTlA7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLworICAgIHRtcGNjZXIgfD0gT0NfQ29uZmlnLT5PQ05Qb2xhcml0eTsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzFORTsKKyAgfQorCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgYW5kIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMxOworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMxTjsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IE9DX0NvbmZpZy0+T0NJZGxlU3RhdGU7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IxID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgMiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfT0MyTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9DQzJTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MyUDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgNFUpOworCisgIGlmKElTX1RJTV9DQ1hOX0lOU1RBTkNFKFRJTXgsIFRJTV9DSEFOTkVMXzIpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5IGxldmVsICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MyTlA7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLworICAgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkgPDwgNFUpOworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMk5FOworCisgIH0KKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMjsKKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMk47CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCAyVSk7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DTklkbGVTdGF0ZSA8PCAyVSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjIgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAzIGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDM0U7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0MzTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9DQzNTOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLworICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCA4VSk7CisKKyAgaWYoSVNfVElNX0NDWE5fSU5TVEFOQ0UoVElNeCwgVElNX0NIQU5ORUxfMykpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNOUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSA8PCA4VSk7CisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MzTkU7CisgIH0KKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTMzsKKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTM047CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA0VSk7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DTklkbGVTdGF0ZSA8PCA0VSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjMgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSA0IGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DNF9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDNEU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfT0M0TTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9DQzRTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0M0UDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICBpZihJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIElETEUgU3RhdGUgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfT0lTNDsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgNlUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgVElNeC0+Q0NNUjIgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1I0ID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNSBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzVfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgb3V0cHV0OiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M1RTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNU0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLworICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzVQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCAxNlUpOworCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzU7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA4VSk7CisgIH0KKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgVElNeC0+Q0NNUjMgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1I1ID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgb3V0cHV0OiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M2RTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNk0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzZQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCAyMFUpOworCisgIGlmKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzY7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCAxMFUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgVElNeC0+Q0NNUjMgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1I2ID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2xhdmUgVGltZXIgY29uZmlndXJhdGlvbiBmdW5jdGlvbgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBzU2xhdmVDb25maWcgU2xhdmUgdGltZXIgY29uZmlndXJhdGlvbgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICogc1NsYXZlQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisKKyAgLyogUmVzZXQgdGhlIFRyaWdnZXIgU2VsZWN0aW9uIEJpdHMgKi8KKyAgdG1wc21jciAmPSB+VElNX1NNQ1JfVFM7CisgIC8qIFNldCB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UgKi8KKyAgdG1wc21jciB8PSBzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcjsKKworICAvKiBSZXNldCB0aGUgc2xhdmUgbW9kZSBCaXRzICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX1NNUzsKKyAgLyogU2V0IHRoZSBzbGF2ZSBtb2RlICovCisgIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGU7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKyAKKyAgLyogQ29uZmlndXJlIHRoZSB0cmlnZ2VyIHByZXNjYWxlciwgZmlsdGVyLCBhbmQgcG9sYXJpdHkgKi8KKyAgc3dpdGNoIChzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikKKyAgeworICAgIGNhc2UgVElNX1RTX0VUUkY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBSRVNDQUxFUihzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUHJlc2NhbGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgY2FzZSBUSU1fVFNfVEkxRl9FRDoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUkZJTFRFUihzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpKTsKKyAgCisgICAgICBpZihzU2xhdmVDb25maWctPlNsYXZlTW9kZSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICAgICAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgICAgICB0bXBjY21yMSA9IGh0aW0tPkluc3RhbmNlLT5DQ01SMTsgICAgCisgICAgICAKKyAgICAgIC8qIFNldCB0aGUgZmlsdGVyICovCisgICAgICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7CisgICAgICB0bXBjY21yMSB8PSAoKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikgPDwgNFUpOworICAgICAgCisgICAgICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxID0gdG1wY2NtcjE7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NFUiA9IHRtcGNjZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGNhc2UgVElNX1RTX1RJMUZQMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgIAorICAgICAgLyogQ29uZmlndXJlIFRJMSBGaWx0ZXIgYW5kIFBvbGFyaXR5ICovCisgICAgICBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBjYXNlIFRJTV9UU19USTJGUDI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQT0xBUklUWShzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworICAKKyAgICAgIC8qIENvbmZpZ3VyZSBUSTIgRmlsdGVyIGFuZCBQb2xhcml0eSAqLworICAgICAgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgY2FzZSBUSU1fVFNfSVRSMDoKKyAgICBjYXNlIFRJTV9UU19JVFIxOgorICAgIGNhc2UgVElNX1RTX0lUUjI6CisgICAgY2FzZSBUSU1fVFNfSVRSMzoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkxIGFzIElucHV0LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMS4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEkyRlAxCisgICogICAgICAgKG9uIGNoYW5uZWwyIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIxIG11c3QgYmUKKyAgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgICovCit2b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgaWYoSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSAhPSBSRVNFVCkKKyAgeworICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgICB0bXBjY21yMSB8PSBUSU1fSUNTZWxlY3Rpb247CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wY2NtcjEgfD0gVElNX0NDTVIxX0NDMVNfMDsKKyAgfQorCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIxX0lDMUYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5ICYgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUG9sYXJpdHkgYW5kIEZpbHRlciBmb3IgVEkxLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7CisgIHRtcGNjbXIxIHw9IChUSU1fSUNGaWx0ZXIgPDwgNFUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gVElNX0lDUG9sYXJpdHk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTIgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQorICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLgorICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJMUZQMgorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMSBtdXN0IGJlCisgICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICAqLworc3RhdGljIHZvaWQgVElNX1RJMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9DQzJTOworICB0bXBjY21yMSB8PSAoVElNX0lDU2VsZWN0aW9uIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7CisgIHRtcGNjbXIxIHw9ICgoVElNX0lDRmlsdGVyIDw8IDEyVSkgJiBUSU1fQ0NNUjFfSUMyRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKSAmIChUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTIuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMyRjsKKyAgdG1wY2NtcjEgfD0gKFRJTV9JQ0ZpbHRlciA8PCAxMlUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTMgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQorICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzMuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUM0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLgorICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJM0ZQNAorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMiBtdXN0IGJlCisgICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICAqLworc3RhdGljIHZvaWQgVElNX1RJM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDM0U7CisgIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9DQzNTOworICB0bXBjY21yMiB8PSBUSU1fSUNTZWxlY3Rpb247CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzNGOworICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCA0VSkgJiBUSU1fQ0NNUjJfSUMzRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDhVKSAmIChUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJNCBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzMuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEk0RlAzCisgICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIyIG11c3QgYmUKKyAgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjI7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M0RTsKKyAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICB0bXBjY21yMiAmPSB+VElNX0NDTVIyX0NDNFM7CisgIHRtcGNjbXIyIHw9IChUSU1fSUNTZWxlY3Rpb24gPDwgOFUpOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfSUM0RjsKKyAgdG1wY2NtcjIgfD0gKChUSU1fSUNGaWx0ZXIgPDwgMTJVKSAmIFRJTV9DQ01SMl9JQzRGKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDNEUgQml0ICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApOworICB0bXBjY2VyIHw9ICgoVElNX0lDUG9sYXJpdHkgPDwgMTJVKSAmIChUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOworICBUSU14LT5DQ0VSID0gdG1wY2NlciA7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyU291cmNlIFRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIFRyaWdnZXIgMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3RvcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfVEkxRlAxOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTJGUDI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0VUUkY6IEV4dGVybmFsIFRyaWdnZXIgaW5wdXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBUSU14LT5TTUNSOworICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9UUzsKKyAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSBhbmQgdGhlIHNsYXZlIG1vZGUqLworICB0bXBzbWNyIHw9IChJbnB1dFRyaWdnZXJTb3VyY2UgfCBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSk7CisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBUSU14LT5TTUNSID0gdG1wc21jcjsKK30KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBFeHRlcm5hbCBUcmlnZ2VyIChFVFIpLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyIFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjE6IEVUUlAgUHJlc2NhbGVyIE9GRi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWNDogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjg6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgOC4KKyAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQb2xhcml0eSBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuCisgICogQHBhcmFtICBFeHRUUkdGaWx0ZXIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgdG1wc21jciA9IFRJTXgtPlNNQ1I7CisKKyAgLyogUmVzZXQgdGhlIEVUUiBCaXRzICovCisgIHRtcHNtY3IgJj0gfihUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwgVElNX1NNQ1JfRVRQKTsKKworICAvKiBTZXQgdGhlIFByZXNjYWxlciwgdGhlIEZpbHRlciB2YWx1ZSBhbmQgdGhlIFBvbGFyaXR5ICovCisgIHRtcHNtY3IgfD0gKHVpbnQzMl90KShUSU1fRXh0VFJHUHJlc2NhbGVyIHwgKFRJTV9FeHRUUkdQb2xhcml0eSB8IChFeHRUUkdGaWx0ZXIgPDwgOFUpKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEBwYXJhbSAgQ2hhbm5lbFN0YXRlIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4RSBiaXQgbmV3IHN0YXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeF9FTkFCTEUgb3IgVElNX0NDeF9ESVNBQkxFLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiogVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKworICB0bXAgPSBUSU1fQ0NFUl9DQzFFIDw8IChDaGFubmVsICYgMHgxRlUpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCisKKyAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gfnRtcDsKKworICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgfD0gKHVpbnQzMl90KShDaGFubmVsU3RhdGUgPDwgKENoYW5uZWwgJiAweDFGVSkpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCit9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcy4KKyAgKiBAcGFyYW0gIGh0aW0gcG9pbnRlciB0byBhIFRJTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFRJTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9SZXNldENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBSZXNldCB0aGUgVElNIGNhbGxiYWNrIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICA9IEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICAqLworICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgPSBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgICovCisgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXJDYWxsYmFjayAgICAgICAgICAgKi8KKyAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICAqLworICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2sgICAgICAgID0gSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBJQ19DYXB0dXJlQ2FsbGJhY2sgICAgICAgICovCisgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBJQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgICA9IEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgICAqLworICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrID0gSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICovCisgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBQV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgaHRpbS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9USU1fRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICAgICAgICovCisgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayAgICAgICA9IEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgaHRpbS0+QnJlYWtDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9USU1FeF9CcmVha0NhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQnJlYWtDYWxsYmFjayAgICAgICAgICAgICAqLworICBodGltLT5CcmVhazJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICovCit9CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3RpbV9leC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfdGltX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZTMxZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX3RpbV9leC5jCkBAIC0wLDAgKzEsMjM3OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfdGltX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUaW1lciBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFRpbWUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVGltZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUaW1lIENvbXBsZW1lbnRhcnkgc2lnbmFsIGJyZWFrIGFuZCBkZWFkIHRpbWUgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgTWFzdGVyIGFuZCBTbGF2ZSBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgQ29uZmlndXJhdGlvbiAoZm9yIGNoYW5uZWxzIDUgYW5kIDYpCisgICogICAgICAgICAgICsgVGltZSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGltZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcyBjb25maWd1cmF0aW9uCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU1FUiBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoZSBUaW1lciBFeHRlbmRlZCBmZWF0dXJlcyBpbmNsdWRlOgorICAgICgjKSBDb21wbGVtZW50YXJ5IG91dHB1dHMgd2l0aCBwcm9ncmFtbWFibGUgZGVhZC10aW1lIGZvciA6CisgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUKKyAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiAoRWRnZSBhbmQgQ2VudGVyLWFsaWduZWQgTW9kZSkKKyAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQKKyAgICAoIykgU3luY2hyb25pemF0aW9uIGNpcmN1aXQgdG8gY29udHJvbCB0aGUgdGltZXIgd2l0aCBleHRlcm5hbCBzaWduYWxzIGFuZCB0bworICAgICAgICBpbnRlcmNvbm5lY3Qgc2V2ZXJhbCB0aW1lcnMgdG9nZXRoZXIuCisgICAgKCMpIEJyZWFrIGlucHV0IHRvIHB1dCB0aGUgdGltZXIgb3V0cHV0IHNpZ25hbHMgaW4gcmVzZXQgc3RhdGUgb3IgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgKHF1YWRyYXR1cmUpIGVuY29kZXIgYW5kIGhhbGwtc2Vuc29yIGNpcmN1aXRyeSBmb3IKKyAgICAgICAgcG9zaXRpb25pbmcgcHVycG9zZXMKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToKKyAgICAgICAgICAgKCsrKSBIYWxsIFNlbnNvciBvdXRwdXQgOiBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KCkKKworICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfVElNeF9DTEtfRU5BQkxFKCk7CisgICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFRJTSBHUElPcyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFRJTSBwaW5zIGluIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKTsKKworICAgICAoIykgVGhlIGV4dGVybmFsIENsb2NrIGNhbiBiZSBjb25maWd1cmVkLCBpZiBuZWVkZWQgKHRoZSBkZWZhdWx0IGNsb2NrIGlzIHRoZQorICAgICAgICAgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlLCB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgIGFueSBzdGFydCBmdW5jdGlvbi4KKworICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlCisgICAgICAgICBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvZiB0aGlzIGRyaXZlcjoKKyAgICAgICAgICAoKyspIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoKSBhbmQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KCk6IHRvIHVzZSB0aGUKKyAgICAgICAgICAgICAgVGltZXIgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCB0aGUgY29tbXV0YXRpb24gZXZlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICBJbnRlcnJ1cHQgYW5kIERNQSByZXF1ZXN0IGlmIG5lZWRlZCAoTm90ZSB0aGF0IE9uZSBUaW1lciBpcyB1c2VkIHRvIGludGVyZmFjZQorICAgICAgICAgICAgIHdpdGggdGhlIEhhbGwgc2Vuc29yIEludGVyZmFjZSBhbmQgYW5vdGhlciBUaW1lciBzaG91bGQgYmUgdXNlZCB0byB1c2UKKyAgICAgICAgICAgICB0aGUgY29tbXV0YXRpb24gZXZlbnQpLgorCisgICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1FeF9PQ05fU3RhcnQoKSwgSEFMX1RJTUV4X09DTl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X09DX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBDb21wbGVtZW50YXJ5IFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTUV4X1BXTU5fU3RhcnQoKSwgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKCksIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBDb21wbGVtZW50YXJ5IE9uZS1wdWxzZSBtb2RlIG91dHB1dCA6IEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnQoKSwgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSGFsbCBTZW5zb3Igb3V0cHV0IDogSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoKSwgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfRE1BKCksIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0lUKCkuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXggVElNRXgKKyAgKiBAYnJpZWYgVElNIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX0NvbnN0YW50cyBUSU0gRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogVGltZW91dCBmb3IgYnJlYWsgaW5wdXQgcmVhcm0gKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRfUkVBUk1fVElNRU9VVCAgICA1VUwgLyogNSBtaWxsaXNlY29uZHMgKi8KKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBUSU1fQ0N4TkNoYW5uZWxDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENoYW5uZWxOU3RhdGUpOworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgVElNIEhBTCBTZW5zb3IuCisgICAgKCspIERlLWluaXRpYWxpemUgVElNIEhBTCBTZW5zb3IuCisgICAgKCspIFN0YXJ0IHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuCisgICAgKCspIFN0b3AgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZS4KKyAgICAoKykgU3RhcnQgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0b3AgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RvcCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2ZlcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIEhhbGwgU2Vuc29yIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSGFsbFNlbnNvcl9Jbml0VHlwZURlZiogc0NvbmZpZykKK3sKKyAgVElNX09DX0luaXRUeXBlRGVmIE9DX0NvbmZpZzsKKworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQzFQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUMxRmlsdGVyKSk7CisKKyAgaWYoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlZWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZihodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAxIGFzIElucHV0IENoYW5uZWwgdG8gaW50ZXJmYWNlIHdpdGggdGhlIHRocmVlIE91dHB1dHMgb2YgdGhlICBIYWxsIHNlbnNvciAqLworICBUSU1fVEkxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZy0+SUMxUG9sYXJpdHksIFRJTV9JQ1NFTEVDVElPTl9UUkMsIHNDb25maWctPklDMUZpbHRlcik7CisKKyAgLyogUmVzZXQgdGhlIElDMVBTQyBCaXRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQzsKKyAgLyogU2V0IHRoZSBJQzFQU0MgdmFsdWUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPklDMVByZXNjYWxlcjsKKworICAvKiBFbmFibGUgdGhlIEhhbGwgc2Vuc29yIGludGVyZmFjZSAoWE9SIGZ1bmN0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMpICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgfD0gVElNX0NSMl9USTFTOworCisgIC8qIFNlbGVjdCB0aGUgVElNX1RTX1RJMUZfRUQgc2lnbmFsIGFzIElucHV0IHRyaWdnZXIgZm9yIHRoZSBUSU0gKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fVFNfVEkxRl9FRDsKKworICAvKiBVc2UgdGhlIFRJTV9UU19USTFGX0VEIHNpZ25hbCB0byByZXNldCB0aGUgVElNIGNvdW50ZXIgZWFjaCBlZGdlIGRldGVjdGlvbiAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfU01TOworICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBUSU1fU0xBVkVNT0RFX1JFU0VUOworCisgIC8qIFByb2dyYW0gY2hhbm5lbCAyIGluIFBXTSAyIG1vZGUgd2l0aCB0aGUgZGVzaXJlZCBDb21tdXRhdGlvbl9EZWxheSovCisgIE9DX0NvbmZpZy5PQ0Zhc3RNb2RlID0gVElNX09DRkFTVF9ESVNBQkxFOworICBPQ19Db25maWcuT0NJZGxlU3RhdGUgPSBUSU1fT0NJRExFU1RBVEVfUkVTRVQ7CisgIE9DX0NvbmZpZy5PQ01vZGUgPSBUSU1fT0NNT0RFX1BXTTI7CisgIE9DX0NvbmZpZy5PQ05JZGxlU3RhdGUgPSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUOworICBPQ19Db25maWcuT0NOUG9sYXJpdHkgPSBUSU1fT0NOUE9MQVJJVFlfSElHSDsKKyAgT0NfQ29uZmlnLk9DUG9sYXJpdHkgPSBUSU1fT0NQT0xBUklUWV9ISUdIOworICBPQ19Db25maWcuUHVsc2UgPSBzQ29uZmlnLT5Db21tdXRhdGlvbl9EZWxheTsKKworICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJk9DX0NvbmZpZyk7CisKKyAgLyogU2VsZWN0IE9DMlJFRiBhcyB0cmlnZ2VyIG91dHB1dCBvbiBUUkdPOiB3cml0ZSB0aGUgTU1TIGJpdHMgaW4gdGhlIFRJTXhfQ1IyCisgICAgcmVnaXN0ZXIgdG8gMTAxICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgJj0gflRJTV9DUjJfTU1TOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9UUkdPX09DMlJFRjsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZT0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZihodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEhhbGwgU2Vuc29yIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworICAgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEhhbGwgU2Vuc29yIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisgICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBIYWxsIHNlbnNvciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSwgMiBhbmQgMworICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBldmVudCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIGV2ZW50ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICAgeworICAgICByZXR1cm4gSEFMX0JVU1k7CisgICB9CisgICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgIHsKKyAgICAgaWYoKCh1aW50MzJfdClwRGF0YSA9PSAwVSApICYmIChMZW5ndGggPiAwVSkpCisgICAgIHsKKyAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgICB9CisgICB9CisgICBlbHNlCisgICB7CisgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgIH0gIAorICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogU2V0IHRoZSBETUEgSW5wdXQgQ2FwdHVyZSAxIENhbGxiYWNrcyAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsIGZvciBDYXB0dXJlIDEqLworICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgMSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisKKyAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBldmVudCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworCisgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgICogICAgICAgICBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZQorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT0MgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7CisgIAorICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUKKyAgKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0IChvbmx5IGlmIG5vIG1vcmUgY2hhbm5lbCBpcyBhY3RpdmUpICovCisgIHRtcGNjZXIgPSBodGltLT5JbnN0YW5jZS0+Q0NFUjsKKyAgaWYgKCh0bXBjY2VyICYgKFRJTV9DQ0VSX0NDMU5FIHwgVElNX0NDRVJfQ0MyTkUgfCBUSU1fQ0NFUl9DQzNORSkpID09ICh1aW50MzJfdClSRVNFVCkKKyAgeworICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9CUkVBSyk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUKKyAgKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTSBwZXJpcGhlcmFsCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZigoKHVpbnQzMl90KXBEYXRhID09IDBVICkgJiYgKExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IzLExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZQorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgUFdNLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50LgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZ2VuZXJhdGlvbi4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRW5hYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlIG9uIHRoZQorICAqICAgICAgICAgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUIChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIEJyZWFrIGludGVycnVwdCAob25seSBpZiBubyBtb3JlIGNoYW5uZWwgaXMgYWN0aXZlKSAqLworICB0bXBjY2VyID0gaHRpbS0+SW5zdGFuY2UtPkNDRVI7CisgIGlmICgodG1wY2NlciAmIChUSU1fQ0NFUl9DQzFORSB8IFRJTV9DQ0VSX0NDMk5FIHwgVElNX0NDRVJfQ0MzTkUpKSA9PSAodWludDMyX3QpUkVTRVQpCisgIHsKKyAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQlJFQUspOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUKKyAgKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgb3V0cHV0CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0gcGVyaXBoZXJhbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBpZigoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmKCgodWludDMyX3QpcERhdGEgPT0gMFUgKSAmJiAoTGVuZ3RoID4gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGdlbmVyYXRpb24uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQorICB7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBPbmUgUHVsc2Ugb3V0cHV0ICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IGNoYW5uZWwuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBPbmUgUHVsc2Ugb3V0cHV0ICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUKKyAgKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBDb25maWd1cmUgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIGNhc2Ugb2YgdXNlIG9mIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2UuCisgICAgICAoKykgQ29uZmlndXJlIE91dHB1dCBjaGFubmVscyBmb3IgT0MgYW5kIFBXTSBtb2RlLgorCisgICAgICAoKykgQ29uZmlndXJlIENvbXBsZW1lbnRhcnkgY2hhbm5lbHMsIGJyZWFrIGZlYXR1cmVzIGFuZCBkZWFkIHRpbWUuCisgICAgICAoKykgQ29uZmlndXJlIE1hc3RlciBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRpbWVyIHJlbWFwcGluZyBjYXBhYmlsaXRpZXMuCisgICAgICAoKykgU2VsZWN0IHRpbWVyIGlucHV0IHNvdXJjZS4KKyAgICAgICgrKSBFbmFibGUgb3IgZGlzYWJsZSBjaGFubmVsIGdyb3VwaW5nLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNIGNvbW11dGF0aW9uIGV2ZW50IHNlcXVlbmNlLgorICAqIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB0byB1c2UgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIG9yZGVyIHRvCisgICogICAgICAgIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhdCBlYWNoIGNvbW11dGF0aW9uIGRldGVjdGlvbiBvbiB0aGUgVFJHSSBpbnB1dCBvZiB0aGUgVGltZXIsCisgICogICAgICAgIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgd2l0aCB0aGUgdXNlIG9mIGFub3RoZXIgVGltZXIoaW50ZXJmYWNlIFRpbWVyKQorICAqICAgICAgICBjb25maWd1cmVkIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSwgdGhpcyBpbnRlcmZhY2UgVGltZXIgd2lsbCBnZW5lcmF0ZSB0aGUKKyAgKiAgICAgICAgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQgdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUKKyAgKiAgICAgICAgdGhlIFRJMSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyIGRldGVjdCBhIGNvbW11dGF0aW9uIGF0IGl0cyBpbnB1dCBUSTEuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIElucHV0VHJpZ2dlciB0aGUgSW50ZXJuYWwgdHJpZ2dlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaW1lciBJbnRlcmZhY2luZyB3aXRoIHRoZSBIYWxsIHNlbnNvcgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCB0cmlnZ2VyIDAgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIHRyaWdnZXIgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgdHJpZ2dlciAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCB0cmlnZ2VyIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX05PTkU6IE5vIHRyaWdnZXIgaXMgbmVlZGVkCisgICogQHBhcmFtICBDb21tdXRhdGlvblNvdXJjZSB0aGUgQ29tbXV0YXRpb24gRXZlbnQgc291cmNlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1RSR0k6IENvbW11dGF0aW9uIHNvdXJjZSBpcyB0aGUgVFJHSSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkgc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oSW5wdXRUcmlnZ2VyKSk7CisKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpKQorICB7CisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DT00pOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZSB3aXRoIGludGVycnVwdC4KKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikKKyAgKiAgICAgICAgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlCisgICogICAgICAgIGNvbW11dGF0aW9uIGF0IGl0cyBUUkdPIG91dHB1dCAoY29ubmVjdGVkIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZAorICAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9UUkdJOiBDb21tdXRhdGlvbiBzb3VyY2UgaXMgdGhlIFRSR0kgb2YgdGhlIEludGVyZmFjZSBUaW1lcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fU09GVFdBUkU6ICBDb21tdXRhdGlvbiBzb3VyY2UgaXMgc2V0IGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBDT01HIGJpdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKElucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgSW5wdXQgdHJpZ2dlciAqLworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBJbnB1dFRyaWdnZXI7CisgIH0KKworICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSBwcmVsb2FkIGZlYXR1cmUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fQ1IyX0NDUEM7CisgIC8qIFNlbGVjdCB0aGUgQ29tbXV0YXRpb24gZXZlbnQgc291cmNlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgJj0gflRJTV9DUjJfQ0NVUzsKKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBDb21tdXRhdGlvblNvdXJjZTsKKworICAvKiBEaXNhYmxlIENvbW11dGF0aW9uIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7CisKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ09NKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZSB3aXRoIERNQS4KKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikKKyAgKiAgICAgICAgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlCisgICogICAgICAgIGNvbW11dGF0aW9uIGF0IGl0cyBUUkdPIG91dHB1dCAoY29ubmVjdGVkIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBub3RlICBUaGUgdXNlciBzaG91bGQgY29uZmlndXJlIHRoZSBETUEgaW4gaGlzIG93biBzb2Z0d2FyZSwgaW4gVGhpcyBmdW5jdGlvbiBvbmx5IHRoZSBDT01ERSBiaXQgaXMgc2V0CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIElucHV0VHJpZ2dlciB0aGUgSW50ZXJuYWwgdHJpZ2dlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaW1lciBJbnRlcmZhY2luZyB3aXRoIHRoZSBIYWxsIHNlbnNvcgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIwOiBJbnRlcm5hbCB0cmlnZ2VyIDAgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjE6IEludGVybmFsIHRyaWdnZXIgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgdHJpZ2dlciAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIzOiBJbnRlcm5hbCB0cmlnZ2VyIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX05PTkU6IE5vIHRyaWdnZXIgaXMgbmVlZGVkCisgICogQHBhcmFtICBDb21tdXRhdGlvblNvdXJjZSB0aGUgQ29tbXV0YXRpb24gRXZlbnQgc291cmNlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1RSR0k6IENvbW11dGF0aW9uIHNvdXJjZSBpcyB0aGUgVFJHSSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkgc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlRFUk5BTF9UUklHR0VSRVZFTlRfU0VMRUNUSU9OKElucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaWYgKChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjApIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjEpIHx8CisgICAgICAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIyKSB8fCAoSW5wdXRUcmlnZ2VyID09IFRJTV9UU19JVFIzKSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgSW5wdXQgdHJpZ2dlciAqLworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiB8PSBJbnB1dFRyaWdnZXI7CisgIH0KKworICAvKiBTZWxlY3QgdGhlIENhcHR1cmUgQ29tcGFyZSBwcmVsb2FkIGZlYXR1cmUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fQ1IyX0NDUEM7CisgIC8qIFNlbGVjdCB0aGUgQ29tbXV0YXRpb24gZXZlbnQgc291cmNlICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjIgJj0gflRJTV9DUjJfQ0NVUzsKKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBDb21tdXRhdGlvblNvdXJjZTsKKworICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIERNQSBSZXF1ZXN0ICovCisgIC8qIFNldCB0aGUgRE1BIENvbW11dGF0aW9uIENhbGxiYWNrICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQ7CisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdDsKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisKKyAgLyogRGlzYWJsZSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NPTSk7CisKKyAgLyogRW5hYmxlIHRoZSBDb21tdXRhdGlvbiBETUEgUmVxdWVzdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NPTSk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIG1hc3RlciBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgc01hc3RlckNvbmZpZyBwb2ludGVyIHRvIGEgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIG91dHB1dCAoVFJHTykgYW5kIHRoZSBNYXN0ZXIvU2xhdmUKKyAgKiAgICAgICAgIG1vZGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfTWFzdGVyQ29uZmlnU3luY2hyb25pemF0aW9uKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKiBzTWFzdGVyQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjcjI7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TWU5DSFJPX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVFJHT19TT1VSQ0Uoc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX01TTV9TVEFURShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJTbGF2ZU1vZGUpKTsKKworICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworICAKKyAgLyogQ2hhbmdlIHRoZSBoYW5kbGVyIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gaHRpbS0+SW5zdGFuY2UtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1I7CisKKyAgLyogSWYgdGhlIHRpbWVyIHN1cHBvcnRzIEFEQyBzeW5jaHJvbml6YXRpb24gdGhyb3VnaCBUUkdPMiwgc2V0IHRoZSBtYXN0ZXIgbW9kZSBzZWxlY3Rpb24gMiAqLworICBpZiAoSVNfVElNX1RSR08yX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUkdPMl9TT1VSQ0Uoc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjIpKTsKKworICAgIC8qIENsZWFyIHRoZSBNTVMyIGJpdHMgKi8KKyAgICB0bXBjcjIgJj0gflRJTV9DUjJfTU1TMjsKKyAgICAvKiBTZWxlY3QgdGhlIFRSR08yIHNvdXJjZSovCisgICAgdG1wY3IyIHw9IHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIyOworICB9CisKKyAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovCisgIHRtcGNyMiAmPSB+VElNX0NSMl9NTVM7CisgIC8qIFNlbGVjdCB0aGUgVFJHTyBzb3VyY2UgKi8KKyAgdG1wY3IyIHw9ICBzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyOworCisgIC8qIFJlc2V0IHRoZSBNU00gQml0ICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX01TTTsKKyAgLyogU2V0IG1hc3RlciBtb2RlICovCisgIHRtcHNtY3IgfD0gc01hc3RlckNvbmZpZy0+TWFzdGVyU2xhdmVNb2RlOworCisgIC8qIFVwZGF0ZSBUSU14IENSMiAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyID0gdG1wY3IyOworCisgIC8qIFVwZGF0ZSBUSU14IFNNQ1IgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworICAKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICAgQ29uZmlndXJlcyB0aGUgQnJlYWsgZmVhdHVyZSwgZGVhZCB0aW1lLCBMb2NrIGxldmVsLCBPU1NJL09TU1IgU3RhdGUKKyAgKiAgICAgICAgIGFuZCB0aGUgQU9FKGF1dG9tYXRpYyBvdXRwdXQgZW5hYmxlKS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgc0JyZWFrRGVhZFRpbWVDb25maWcgcG9pbnRlciB0byBhIFRJTV9Db25maWdCcmVha0RlYWRDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgQkRUUiBSZWdpc3RlciBjb25maWd1cmF0aW9uICBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKiBzQnJlYWtEZWFkVGltZUNvbmZpZykKK3sKKyAgLyogS2VlcCB0aGlzIHZhcmlhYmxlIGluaXRpYWxpemVkIHRvIDAgYXMgaXQgaXMgdXNlZCB0byBjb25maWd1cmUgQkRUUiByZWdpc3RlciAqLworICB1aW50MzJfdCB0bXBiZHRyID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU1JfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU0lfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MT0NLX0xFVkVMKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5Mb2NrTGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ERUFEVElNRShzQnJlYWtEZWFkVGltZUNvbmZpZy0+RGVhZFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfRklMVEVSKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha0ZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCkpOworCisgIC8qIENoZWNrIGlucHV0IHN0YXRlICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogU2V0IHRoZSBMb2NrIGxldmVsLCB0aGUgQnJlYWsgZW5hYmxlIEJpdCBhbmQgdGhlIFBvbGFyaXR5LCB0aGUgT1NTUiBTdGF0ZSwKKyAgICAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8KKworICAvKiBTZXQgdGhlIEJEVFIgYml0cyAqLworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0RURywgc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9MT0NLLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9PU1NJLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+T2ZmU3RhdGVJRExFTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTUiwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktFLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQU9FLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0YsIChzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIgPDwgVElNX0JEVFJfQktGX1BvcykpOworICAKKyAgaWYgKElTX1RJTV9BRFZBTkNFRF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfQUZNT0RFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha0FGTW9kZSkpOworICAgIAorICAgIC8qIFNldCBCUkVBSyBBRiBtb2RlICovCisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0JJRCwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrQUZNb2RlKTsKKyAgfQorICAKKyAgaWYgKElTX1RJTV9CS0lOMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX1NUQVRFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUsyX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfRklMVEVSKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJGaWx0ZXIpKTsKKworICAgIC8qIFNldCB0aGUgQlJFQUsyIGlucHV0IHJlbGF0ZWQgQkRUUiBiaXRzICovCisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJGLCAoc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMkZpbHRlciA8PCBUSU1fQkRUUl9CSzJGX1BvcykpOworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyRSwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMlN0YXRlKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMlAsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJQb2xhcml0eSk7CisKKyAgICBpZiAoSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBSzJfQUZNT0RFKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJBRk1vZGUpKTsKKyAgICAgIAorICAgICAgLyogU2V0IEJSRUFLMiBBRiBtb2RlICovCisgICAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkJJRCwgc0JyZWFrRGVhZFRpbWVDb25maWctPkJyZWFrMkFGTW9kZSk7CisgICAgfQorICB9CisKKyAgLyogU2V0IFRJTXhfQkRUUiAqLworICBodGltLT5JbnN0YW5jZS0+QkRUUiA9IHRtcGJkdHI7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgYnJlYWsgaW5wdXQgc291cmNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQnJlYWtJbnB1dCBCcmVhayBpbnB1dCB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUks6IFRpbWVyIGJyZWFrIGlucHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzI6IFRpbWVyIGJyZWFrIDIgaW5wdXQKKyAgKiBAcGFyYW0gIHNCcmVha0lucHV0Q29uZmlnIEJyZWFrIGlucHV0IHNvdXJjZSBjb25maWd1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZiAqc0JyZWFrSW5wdXRDb25maWcpCisKK3sKKyAgdWludDMyX3QgdG1wb3J4OworICB1aW50MzJfdCBia2luX2VuYWJsZV9tYXNrOworICB1aW50MzJfdCBia2luX3BvbGFyaXR5X21hc2s7CisgIHVpbnQzMl90IGJraW5fZW5hYmxlX2JpdHBvczsKKyAgdWludDMyX3QgYmtpbl9wb2xhcml0eV9iaXRwb3M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVQoQnJlYWtJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0Uoc0JyZWFrSW5wdXRDb25maWctPlNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfU1RBVEUoc0JyZWFrSW5wdXRDb25maWctPkVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFkoc0JyZWFrSW5wdXRDb25maWctPlBvbGFyaXR5KSk7CisKKyAgLyogQ2hlY2sgaW5wdXQgc3RhdGUgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKyAgCisgIHN3aXRjaChzQnJlYWtJbnB1dENvbmZpZy0+U291cmNlKQorICB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOOgorICAgIHsKKyAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0lORTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IFRJTTFfQUYxX0JLSU5FX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLSU5QOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSBUSU0xX0FGMV9CS0lOUF9Qb3M7CisgICAgICBicmVhazsKKyAgICB9CisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAxOgorICAgIHsKKyAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0NNUDFFOworICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gVElNMV9BRjFfQktDTVAxRV9Qb3M7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSBUSU0xX0FGMV9CS0NNUDFQOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDFQX1BvczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAyOgorICAgIHsKKyAgICAgIGJraW5fZW5hYmxlX21hc2sgPSBUSU0xX0FGMV9CS0NNUDJFOworICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gVElNMV9BRjFfQktDTVAyRV9Qb3M7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSBUSU0xX0FGMV9CS0NNUDJQOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDJQX1BvczsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBDT01QMSAmJiBDT01QMiAqLworCisgIGRlZmF1bHQ6CisgICAgeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IDBVOworICAgICAgYmtpbl9lbmFibGVfYml0cG9zID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSAwVTsKKyAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gMFU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIHN3aXRjaChCcmVha0lucHV0KQorICB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6CisgICAgeworICAgICAgLyogR2V0IHRoZSBUSU14X0FGMSByZWdpc3RlciB2YWx1ZSAqLworICAgICAgdG1wb3J4ID0gaHRpbS0+SW5zdGFuY2UtPkFGMTsKKyAgICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIGJyZWFrIGlucHV0ICovCisgICAgICB0bXBvcnggJj0gfmJraW5fZW5hYmxlX21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5FbmFibGUgPDwgYmtpbl9lbmFibGVfYml0cG9zKSAmIGJraW5fZW5hYmxlX21hc2s7CisgICAgICAgIAorICAgICAgLyogU2V0IHRoZSBicmVhayBpbnB1dCBwb2xhcml0eSAqLworICAgICAgdG1wb3J4ICY9IH5ia2luX3BvbGFyaXR5X21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5Qb2xhcml0eSA8PCBia2luX3BvbGFyaXR5X2JpdHBvcykgJiBia2luX3BvbGFyaXR5X21hc2s7CisgICAgICAgIAorICAgICAgLyogU2V0IFRJTXhfQUYxICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5BRjEgPSB0bXBvcng7ICAgICAgICAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzI6CisgICAgeworICAgICAgLyogR2V0IHRoZSBUSU14X0FGMiByZWdpc3RlciB2YWx1ZSAqLworICAgICAgdG1wb3J4ID0gaHRpbS0+SW5zdGFuY2UtPkFGMjsKKyAgICAgICAgCisgICAgICAvKiBFbmFibGUgdGhlIGJyZWFrIGlucHV0ICovCisgICAgICB0bXBvcnggJj0gfmJraW5fZW5hYmxlX21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5FbmFibGUgPDwgYmtpbl9lbmFibGVfYml0cG9zKSAmIGJraW5fZW5hYmxlX21hc2s7CisgICAgICAgIAorICAgICAgLyogU2V0IHRoZSBicmVhayBpbnB1dCBwb2xhcml0eSAqLworICAgICAgdG1wb3J4ICY9IH5ia2luX3BvbGFyaXR5X21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5Qb2xhcml0eSA8PCBia2luX3BvbGFyaXR5X2JpdHBvcykgJiBia2luX3BvbGFyaXR5X21hc2s7CisgICAgICAgIAorICAgICAgLyogU2V0IFRJTXhfQUYyICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5BRjIgPSB0bXBvcng7ICAgICAgICAKKyAgICAgIGJyZWFrOworICAgICAgfQorICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggUmVtYXBwaW5nIGlucHV0IGNhcGFiaWxpdGllcy4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFJlbWFwIHNwZWNpZmllcyB0aGUgVElNIHJlbWFwcGluZyBzb3VyY2UuCisgICogICAgICAgICBGb3IgVElNMSwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9HUElPOiAgICAgICAgICAgICAgICBUSU0xIEVUUiBpcyBpcyBjb25uZWN0ZWQgdG8gR1BJTworICBAaWYgU1RNMzJHMDgxeHgKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTEgRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgQGVuZGlmCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9BREMxX0FXRDE6ICAgICAgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QxCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9BREMxX0FXRDI6ICAgICAgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QyCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX0VUUl9BREMxX0FXRDM6ICAgICAgICAgICBUSU0xIEVUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBBV0QzCisgICoKKyAgQGlmIFNUTTMyRzA4MXh4CisgICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0VUUl9HUElPOiAgICAgICAgICAgICAgICBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfQ09NUDE6ICAgICAgICAgICAgICAgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfQ09NUDI6ICAgICAgICAgICAgICAgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9FVFJfTFNFOiAgICAgICAgICAgICAgICAgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIExTRQorICAqCisgICogICAgICAgICBGb3IgVElNMywgdGhlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9HUElPICAgICAgICAgICAgICAgIFRJTTNfRVRSIGlzIGNvbm5lY3RlZCB0byBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX0VUUl9DT01QMSAgICAgICAgICAgICAgIFRJTTNfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfRVRSX0NPTVAyICAgICAgICAgICAgICAgVElNM19FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICBAZW5kaWYKKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1JlbWFwQ29uZmlnKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBSZW1hcCkKK3sKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUkVNQVAoUmVtYXApKTsKKyAgCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+QUYxLCBUSU0xX0FGMV9FVFJTRUxfTXNrLCBSZW1hcCk7CisgIAorICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIHRpbWVyIGlucHV0IHNvdXJjZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVEkxIGlucHV0IGNoYW5uZWwKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVEkyIGlucHV0IGNoYW5uZWwKKyAgKiBAcGFyYW0gIFRJU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgdGltZXIgaW5wdXQgc291cmNlCisgIEBpZiBTVE0zMkcwODF4eAorICAqICAgICAgICAgRm9yIFRJTTEgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfVEkxX0dQSU86ICAgICAgICAgICAgICAgIFRJTTEgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU0xIFRJMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMl9HUElPOiAgICAgICAgICAgICAgICBUSU0xIFRJMiBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMV9USTJfQ09NUDI6ICAgICAgICAgICAgICAgVElNMSBUSTIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dAorICAqCisgICogICAgICAgICBGb3IgVElNMiwgdGhlIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0yIFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTFfQ09NUDE6ICAgICAgICAgICAgICAgVElNMiBUSTEgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMl9USTJfR1BJTzogICAgICAgICAgICAgICAgVElNMiBUSTIgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEkyX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTIgVEkyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKgorICAqICAgICAgICAgRm9yIFRJTTMsIHRoZSBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNM19USTFfR1BJTzogICAgICAgICAgICAgICAgVElNMyBUSTEgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkxX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTMgVEkxIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTNfVEkyX0dQSU86ICAgICAgICAgICAgICAgIFRJTTMgVEkyIGlzIGNvbm5lY3RlZCB0byBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0zX1RJMl9DT01QMjogICAgICAgICAgICAgICBUSU0zIFRJMiBpcyBjb25uZWN0ZWQgdG8gQ09NUDIgb3V0cHV0CisgIEBlbmRpZgorICAqCisgICogICAgICAgICBGb3IgVElNMTQsIHRoZSBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTRfVEkxX0dQSU86ICAgICAgICAgICAgICAgVElNMTQgVEkxIGlzIGNvbm5lY3RlZCB0byBHUElPCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNF9USTFfUlRDOiAgICAgICAgICAgICAgICBUSU0xNCBUSTEgaXMgY29ubmVjdGVkIHRvIFJUQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTRfVEkxX0hTRV8zMjogICAgICAgICAgICAgVElNMTQgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UgZGl2IDMyCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNF9USTFfTUNPOiAgICAgICAgICAgICAgICBUSU0xNCBUSTEgaXMgY29ubmVjdGVkIHRvIE1DTworICAqCisgICogICAgICAgICBGb3IgVElNMTUsIHRoZSBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkxX0dQSU86ICAgICAgICAgICAgICBUSU0xNSBUSTEgaXMgY29ubmVjdGVkIHRvIEdQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9USU0yX0NIMTogICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8gVElNMiBDSDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMV9USU0zX0NIMTogICAgICAgICAgIFRJTTE1IFRJMSBpcyBjb25uZWN0ZWQgdG8gVElNMyBDSDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE1X1RJMl9HUElPOiAgICAgICAgICAgICAgIFRJTTE1IFRJMiBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkyX1RJTTJfQ0gyOiAgICAgICAgICAgVElNMTUgVEkyIGlzIGNvbm5lY3RlZCB0byBUSU0yIENIMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTVfVEkyX1RJTTNfQ0gyOiAgICAgICAgICAgVElNMTUgVEkyIGlzIGNvbm5lY3RlZCB0byBUSU0zIENIMgorICAqCisgICogICAgICAgICBGb3IgVElNMTYsIHRoZSBwYXJhbWV0ZXIgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xNl9USTFfR1BJTzogICAgICAgICAgICAgIFRJTTE2IFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX0xTSTogICAgICAgICAgICAgICBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIExTSQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX0xTRTogICAgICAgICAgICAgICBUSU0xNiBUSTEgaXMgY29ubmVjdGVkIHRvIExTRQorICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTZfVEkxX1JUQ19XQUtFVVA6ICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBUUkMgd2FrZXVwIGludGVycnVwdAorICAqCisgICogICAgICAgICBGb3IgVElNMTcsIHRoZSBwYXJhbWV0ZXIgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfR1BJTzogICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8gR1BJTworICAqICAgICAgICAgICAgQGFyZyBUSU1fVElNMTdfVEkxX0hTRV8zMjogICAgICAgICAgICBUSU0xNyBUSTEgaXMgY29ubmVjdGVkIHRvIEhTRSBkaXYgMzIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE3X1RJMV9NQ086ICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0byBNQ08KKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9USU1FeF9USVNlbGVjdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVElTZWxlY3Rpb24gLCB1aW50MzJfdCBDaGFubmVsKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fVElTRUxfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9USVNFTChUSVNlbGVjdGlvbikpOworICAKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgICBNT0RJRllfUkVHKGh0aW0tPkluc3RhbmNlLT5USVNFTCwgVElNX1RJU0VMX1RJMVNFTCwgVElTZWxlY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+VElTRUwsIFRJTV9USVNFTF9USTJTRUwsIFRJU2VsZWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorICAKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR3JvdXAgY2hhbm5lbCA1IGFuZCBjaGFubmVsIDEsIDIgb3IgMworICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbHMgc3BlY2lmaWVzIHRoZSByZWZlcmVuY2Ugc2lnbmFsKHMpIHRoZSBPQzVSRUYgaXMgY29tYmluZWQgd2l0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUSU1fR1JPVVBDSDVfTk9ORTogTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MxUkVGQzogT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MyUkVGQzogT0MyUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MyUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MzUkVGQzogT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfR3JvdXBDaGFubmVsNShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbHMpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0dST1VQQ0g1KENoYW5uZWxzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBHQzVDeCBiaXQgZmllbGRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ1I1ICY9IH4oVElNX0NDUjVfR0M1QzN8VElNX0NDUjVfR0M1QzJ8VElNX0NDUjVfR0M1QzEpOworCisgIC8qIFNldCBHQzVDeCBiaXQgZmllbGRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ1I1IHw9IENoYW5uZWxzOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYXJtIHRoZSBkZXNpZ25hdGVkIGJyZWFrIGlucHV0ICh3aGVuIGl0IG9wZXJhdGVzIGluIGJpZGlyZWN0aW9uYWwgbW9kZSkuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBCcmVha0lucHV0IEJyZWFrIGlucHV0IHRvIGRpc2FybQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzogVGltZXIgYnJlYWsgaW5wdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0JSRUFLSU5QVVRfQlJLMjogVGltZXIgYnJlYWsgMiBpbnB1dAorICAqIEBub3RlICBUaGUgYnJlYWsgaW5wdXQgY2FuIGJlIGRpc2FybWVkIG9ubHkgd2hlbiBpdCBpcyBjb25maWd1cmVkIGluCisgICogICAgICAgIGJpZGlyZWN0aW9uYWwgbW9kZSBhbmQgd2hlbiB3aGVuIE1PRSBpcyByZXNldC4KKyAgKiBAbm90ZSAgUHVycG9zZSBpcyB0byBiZSBhYmxlIHRvIGhhdmUgdGhlIGlucHV0IHZvbHRhZ2UgYmFjayB0byBoaWdoLXN0YXRlLAorICAqICAgICAgICB3aGF0ZXZlciB0aGUgdGltZSBjb25zdGFudCBvbiB0aGUgb3V0cHV0IC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9EaXNhcm1CcmVha0lucHV0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCcmVha0lucHV0KQoreworICB1aW50MzJfdCB0bXBiZHRyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQURWQU5DRURfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS0lOUFVUKEJyZWFrSW5wdXQpKTsKKworICBzd2l0Y2ggKEJyZWFrSW5wdXQpCisgIHsKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzoKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgaW5pdGlhbCBjb25kaXRpb25zICovCisgICAgICAgIHRtcGJkdHIgPSBSRUFEX1JFRyhodGltLT5JbnN0YW5jZS0+QkRUUik7CisgICAgICAgIGlmICgoUkVBRF9CSVQodG1wYmR0ciwgVElNX0JEVFJfQktCSUQpID09IFRJTV9CRFRSX0JLQklEKSAmJgorICAgICAgICAgICAgKFJFQURfQklUKHRtcGJkdHIsIFRJTV9CRFRSX01PRSkgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQnJlYWsgaW5wdXQgQlJLIGlzIGRpc2FybWVkICovCisgICAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQktEU1JNKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAKKyAgICBjYXNlIFRJTV9CUkVBS0lOUFVUX0JSSzI6CisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgICB0bXBiZHRyID0gUkVBRF9SRUcoaHRpbS0+SW5zdGFuY2UtPkJEVFIpOworICAgICAgICBpZiAoKFJFQURfQklUKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkJJRCkgPT0gVElNX0JEVFJfQksyQklEKSAmJgorICAgICAgICAgICAgKFJFQURfQklUKHRtcGJkdHIsIFRJTV9CRFRSX01PRSkgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQnJlYWsgaW5wdXQgQlJLIGlzIGRpc2FybWVkICovCisgICAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+QkRUUiwgVElNX0JEVFJfQksyRFNSTSk7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfSAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBcm0gdGhlIGRlc2lnbmF0ZWQgYnJlYWsgaW5wdXQgKHdoZW4gaXQgb3BlcmF0ZXMgaW4gYmlkaXJlY3Rpb25hbCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEJyZWFrSW5wdXQgQnJlYWsgaW5wdXQgdG8gYXJtCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0JSRUFLSU5QVVRfQlJLOiBUaW1lciBicmVhayBpbnB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUksyOiBUaW1lciBicmVhayAyIGlucHV0CisgICogQG5vdGUgIEFybWluZyBpcyBwb3NzaWJsZSBhdCBhbnl0aW1lLCBldmVuIGlmIGZhdWx0IGlzIHByZXNlbnQuCisgICogQG5vdGUgIEJyZWFrIGlucHV0IGlzIGF1dG9tYXRpY2FsbHkgYXJtZWQgYXMgc29vbiBhcyBNT0UgYml0IGlzIHNldC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZUFybUJyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVChCcmVha0lucHV0KSk7CisKKyAgc3dpdGNoIChCcmVha0lucHV0KQorICB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6CisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGluaXRpYWwgY29uZGl0aW9ucyAqLworICAgICAgICBpZiAoUkVBRF9CSVQoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0JLQklEKSA9PSBUSU1fQkRUUl9CS0JJRCkKKyAgICAgICAgeworICAgICAgICAvKiBCcmVhayBpbnB1dCBCUksgaXMgcmUtYXJtZWQgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZS4gUG9sbCB0byBjaGVjayB3aGV0aGVyIGZhdWx0IGNvbmRpdGlvbiBkaXNhcHBlYXJlZCAqLworICAgICAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoUkVBRF9CSVQoaHRpbS0+SW5zdGFuY2UtPkJEVFIsIFRJTV9CRFRSX0JLRFNSTSkgIT0gVElNX0JEVFJfQktEU1JNKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPD0gVElNX0JSRUFLSU5QVVRfUkVBUk1fVElNRU9VVCk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUksyOgorICAgICAgeworICAgICAgICAvKiBDaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgKi8KKyAgICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CSzJCSUQpID09IFRJTV9CRFRSX0JLMkJJRCkKKyAgICAgICAgeworICAgICAgICAvKiBCcmVhayBpbnB1dCBCUksyIGlzIHJlLWFybWVkIGF1dG9tYXRpY2FsbHkgYnkgaGFyZHdhcmUuIFBvbGwgdG8gY2hlY2sgd2hldGhlciBmYXVsdCBjb25kaXRpb24gZGlzYXBwZWFyZWQgKi8KKyAgICAgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgaWYgKFJFQURfQklUKGh0aW0tPkluc3RhbmNlLT5CRFRSLCBUSU1fQkRUUl9CSzJEU1JNKSAhPSBUSU1fQkRUUl9CSzJEU1JNKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPD0gVElNX0JSRUFLSU5QVVRfUkVBUk1fVElNRU9VVCk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEV4dGVuZGVkIFRJTSBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAgKCspIFRpbWVyIENvbW11dGF0aW9uIGNhbGxiYWNrCisgICAgKCspIFRpbWVyIEJyZWFrIGNhbGxiYWNrCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGFsbCBjb21tdXRhdGlvbiBjaGFuZ2VkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorLyoqCisgICogQGJyaWVmICBIYWxsIGNvbW11dGF0aW9uIGNoYW5nZWQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFsbCBCcmVhayBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfQnJlYWtDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgQnJlYWsyIGRldGVjdGlvbiBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbTogVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBIYWxsIFNlbnNvciBpbnRlcmZhY2UgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgQ29tbXV0YXRpb24gY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiogaHRpbSA9ICggVElNX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGU9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPkNvbW11dGF0aW9uQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+Q29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeE4uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIENoYW5uZWwgc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzCisgICogQHBhcmFtICBDaGFubmVsTlN0YXRlIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4TkUgYml0IG5ldyBzdGF0ZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFRJTV9DQ3hOX0VOQUJMRSBvciBUSU1fQ0N4Tl9EaXNhYmxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0NDeE5DaGFubmVsQ21kKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBDaGFubmVsTlN0YXRlKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgdG1wID0gVElNX0NDRVJfQ0MxTkUgPDwgKENoYW5uZWwgJiAweDFGVSk7IC8qIDB4MUZVID0gMzEgYml0cyBtYXggc2hpZnQgKi8KKworICAvKiBSZXNldCB0aGUgQ0N4TkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gIH50bXA7CisKKyAgLyogU2V0IG9yIHJlc2V0IHRoZSBDQ3hORSBCaXQgKi8KKyAgVElNeC0+Q0NFUiB8PSAodWludDMyX3QpKENoYW5uZWxOU3RhdGUgPDwgKENoYW5uZWwgJiAweDFGVSkpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCit9CisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm1fdGVtcGxhdGUuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKKyAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcworICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zCisgICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGF0IGVhY2ggQWxhcm0gZXZlbnQgYW5kIHRoZSB0aW1lIGlzIHJlc2V0IHRvIDAwOjAwOjAwCisgICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZQorIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgorICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyZzB4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtLmMnCisgICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKKyAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmcweHhfaGFsX2NvbmYuaAorCisgICAgWy4uXQorICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6CisgICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKKyAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4KKyAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQKKyAgICAoQCkgVGhlIHN0bTMyZzB4eF9oYWxfdGltZWJhc2VfdGltIHVzZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIEFwcGxpY2F0aW9ucy9FeGFtcGxlcworICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVGltZUJhc2VfUlRDX0FsYXJtX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIEFsYXJtIFRlbXBsYXRlCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246CisgICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgorICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCisgICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KKyAgKi8KKyNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UKKy8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KKy8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KKworI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfSFNFCisjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDQ5VQorI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICA0VQorI2Vsc2UgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgfHwgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KKyNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKKyNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVCisjZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gUlRDX0hhbmRsZVR5cGVEZWYgaFJUQ19IYW5kbGU7CitSVENfSGFuZGxlVHlwZURlZiBoUlRDX0hhbmRsZTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUlRDX1RBTVBfSVJRSGFuZGxlcih2b2lkKTsKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfQUxBUk1BIGFzIGEgdGltZSBiYXNlIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCisgICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrKHVpbnQzMl90IFRpY2tQcmlvcml0eSkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CisKKyAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKKyAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OworCisjaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9MU0UKKyAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOworICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CisgIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOworI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0kpCisgIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKKyNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQorICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzI7CisjZWxzZQorI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKKyNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLworCisgIGlmKEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCkgPT0gSEFMX09LKQorICB7CisgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOworICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCisgICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOworICAgICAgX19IQUxfUkNDX1JUQ0FQQl9DTEtfRU5BQkxFKCk7CisKKyAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcworICAgICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDEpICogKFJUQ19TWU5DSF9QUkVESVYgKyAxKSkgLyBSVENfQ0xPQ0sKKyAgICAgICAgIEhTRSBhcyBSVEMgY2xvY2sKKyAgICAgICAgICAgVGltZSBiYXNlID0gKCg0OSArIDEpICogKDQgKyAxKSkgLyAyNTBrSHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAgICBMU0UgYXMgUlRDIGNsb2NrCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S0h6CisgICAgICAgICAgICAgICAgICAgICA9IH4xbXMKKyAgICAgICAgIExTSSBhcyBSVEMgY2xvY2sKKyAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktIegorICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgICAgICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKKyAgICAgIGlmIChIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLworICAgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLworICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBRik7CisKKyAgICAgIGNvdW50ZXIgPSAwVTsKKyAgICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQVdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFXRikgPT0gMFUpCisgICAgICB7CisgICAgICAgIGlmKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC8gNTZVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCkweDAxVTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CisKKyAgICAgIC8qIFJUQyBBbGFybSBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCisgICAgICBpZigoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklDU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKKyAgICAgICAgY291bnRlciA9IDBVOworICAgICAgICB3aGlsZSgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA1NlUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+RFIgPSAwVTsKKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5UUiA9IDBVOworCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SUNTUiAmPSAodWludDMyX3QpflJUQ19JQ1NSX0lOSVQ7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX1RBTVBfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CisgICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX1RBTVBfSVJRbik7CisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgfQorICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDIEFMQVJNIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisgIC8qIERpc2FibGUgUlRDIEFMQVJNIHVwZGF0ZSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgRW5hYmxpbmcgUlRDIEFMQVJNIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKyAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFMQVJNIEEgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB3aGVuIFJUQ19BTEFSTSBpbnRlcnJ1cHQgdG9vayBwbGFjZSwgaW5zaWRlCisgICogUlRDX0FMQVJNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAorICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaHJ0YyA6IFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKKworICBIQUxfSW5jVGljaygpOworCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPklDU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKKworICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICB7CisgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA1NlUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLworICAgIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGhydGMtPkluc3RhbmNlLT5EUiA9IDBVOworICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsKKworICBocnRjLT5JbnN0YW5jZS0+SUNTUiAmPSAodWludDMyX3QpflJUQ19JQ1NSX0lOSVQ7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSVEMgQUxBUk0gaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFJUQ19UQU1QX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoJmhSVENfSGFuZGxlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYyBiL1NyYy9zdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE1MzgwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfdGltZWJhc2VfcnRjX3dha2V1cF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjc3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwX3RlbXBsYXRlLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19XQUtFVVAgVGVtcGxhdGUuCisgICoKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKKyAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBXQUtFVVAgZm9yIHRoZSB0aW1lIGJhc2UgZ2VuZXJhdGlvbjoKKyAgKiAgICAgICAgICAgKyBJbnRpYWxpemVzIHRoZSBSVEMgcGVyaXBoZXJhbCBhbmQgY29uZmlndXJlcyB0aGUgd2FrZXVwIHRpbWVyIHRvIGJlCisgICogICAgICAgICAgICAgaW5jcmVtZW50ZWQgZWFjaCAxbXMKKyAgKiAgICAgICAgICAgKyBUaGUgd2FrZXVwIGZlYXR1cmUgaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IGVhY2ggMW1zCisgICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGluc2lkZSB0aGUgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjaworICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UKKyBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIGZpbGUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgbW9kaWZpZWQgYXMgZm9sbG93czoKKyAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXAuYycKKyAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudAorICAgICAgIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgZGVmaW5lIGluIHN0bTMyZzB4eF9oYWxfY29uZi5oCisKKyAgICBbLi5dCisgICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoKKyAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQorICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgorICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZAorICAgIChAKSBUaGUgc3RtMzJnMHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCisgICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2RlcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfV2FrZVVwX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIFdha2VVcCBUZW1wbGF0ZQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOgorICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgorICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCisgICovCisjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCisKKyNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQorI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA0OVUKKyNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgNFUKKyNlbHNlIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFIHx8IFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCisjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCisjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDMxVQorI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIFJUQ19IYW5kbGVUeXBlRGVmIGhSVENfSGFuZGxlOworUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBSVENfVEFNUF9JUlFIYW5kbGVyKHZvaWQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX1RBTVAgYXMgYSB0aW1lIGJhc2Ugc291cmNlLgorICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkCisgICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiAgICAgICAgIFdha2V1cCBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDFtcworICAqICAgICAgICAgV2FrZXVwIFRpbWUgPSBXYWtldXBUaW1lYmFzZSAqIFdha2VVcENvdW50ZXIgKDAgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPSAxIG1zCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCisgICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrKHVpbnQzMl90IFRpY2tQcmlvcml0eSkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CisKKyAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKKyAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OworCisjaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9MU0UKKyAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOworICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CisgIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOworI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0kpCisgIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKKyNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQorICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzI7CisjZWxzZQorI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKKyNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLworCisgIGlmKEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCkgPT0gSEFMX09LKQorICB7CisgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOworICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCisgICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOworICAgICAgX19IQUxfUkNDX1JUQ0FQQl9DTEtfRU5BQkxFKCk7CisKKyAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcworICAgICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDEpICogKFJUQ19TWU5DSF9QUkVESVYgKyAxKSkgLyBSVENfQ0xPQ0sKKyAgICAgICAgIEhTRSBhcyBSVEMgY2xvY2sKKyAgICAgICAgICAgVGltZSBiYXNlID0gKCg0OSArIDEpICogKDQgKyAxKSkgLyAyNTBraHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAgICBMU0UgYXMgUlRDIGNsb2NrCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S2h6CisgICAgICAgICAgICAgICAgICAgICA9IH4xbXMKKyAgICAgICAgIExTSSBhcyBSVEMgY2xvY2sKKyAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktoegorICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgICAgICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKKyAgICAgIGlmIChIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSxSVENfSVRfV1VUKTsKKworICAgICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCAgKi8KKyAgICAgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVFdGKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA1NlUpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDbGVhciBQV1Igd2FrZSB1cCBGbGFnICovCisgICAgICBfX0hBTF9QV1JfQ0xFQVJfRkxBRyhQV1JfRkxBR19XVUYpOworCisgICAgICAvKiBDbGVhciBSVEMgV2FrZSBVcCB0aW1lciBGbGFnICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVEYpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFdha2UtdXAgVGltZXIgY291bnRlciAqLworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPldVVFIgPSAwVTsKKworICAgICAgLyogQ2xlYXIgdGhlIFdha2UtdXAgVGltZXIgY2xvY2sgc291cmNlIGJpdHMgaW4gQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpflJUQ19DUl9XVUNLU0VMOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFM7CisKKyAgICAgIC8qIFJUQyBXYWtlVXBUaW1lciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsUlRDX0lUX1dVVCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFJUQ19UQU1QX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19UQU1QX0lSUW4pOworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQ19UQU1QIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisgIC8qIERpc2FibGUgV0FLRSBVUCBUSU1FUiBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVENfVEFNUCBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisgIC8qIEVuYWJsZSAgV0FLRSBVUCBUSU1FUiAgaW50ZXJydXB0ICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX1RBTVAgaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQorICAqIFJUQ19UQU1QX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAorICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaHJ0YyA6IFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgSEFMX0luY1RpY2soKTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIFdBS0UgVVAgVElNRVIgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFJUQ19UQU1QX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfdGltZWJhc2VfdGltX3RlbXBsYXRlLmMgYi9TcmMvc3RtMzJnMHh4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJmMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfdGltZWJhc2VfdGltX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbWViYXNlX3RpbV90ZW1wbGF0ZS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBUSU0gVGVtcGxhdGUuCisgICoKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKKyAgKiAgICAgICAgICB0aGUgVElNIHRpbWUgYmFzZToKKyAgKiAgICAgICAgICAgKyBJbnRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbCB0byBnZW5lcmF0ZSBhIFBlcmlvZCBlbGFwc2VkIEV2ZW50IGVhY2ggMW1zCisgICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGluc2lkZSBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjayBpZSBlYWNoIDFtcworICAqCisgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CisgICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJnMHh4X2hhbF90aW1lYmFzZV90aW0uYycKKyAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFRJTSBIQUwgZHJpdmVyIGZpbGVzIHRvIHlvdXIgcHJvamVjdCBhbmQgbWFrZSBzdXJlCisgICAgICAgSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCBpcyBkZWZpbmVkIGluIHN0bTMybDR4eF9oYWxfY29uZi5oCisKKyAgICBbLi5dCisgICAgKEApIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBlbnN1cmUgdGhhdCB0aGUgdGltZSBiYXNlIGlzIGFsd2F5cyBzZXQgdG8gMSBtaWxsaXNlY29uZAorICAgICAgIHRvIGhhdmUgY29ycmVjdCBIQUwgb3BlcmF0aW9uLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfVGltZUJhc2VfVElNCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBUSU1fSGFuZGxlVHlwZURlZiBUaW1IYW5kbGU7CitUSU1fSGFuZGxlVHlwZURlZiAgICAgICAgVGltSGFuZGxlOworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgVElNNl9EQUNfTFBUSU0xX0lSUUhhbmRsZXIodm9pZCk7CisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgVElNNiBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuCisgICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAorICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCisgICogQHBhcmFtICBUaWNrUHJpb3JpdHkgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBSQ0NfQ2xrSW5pdFR5cGVEZWYgICAgY2xrY29uZmlnOworICB1aW50MzJfdCAgICAgICAgICAgICAgdXdUaW1jbG9jaywgdXdBUEIxUHJlc2NhbGVyOworICB1aW50MzJfdCAgICAgICAgICAgICAgdXdQcmVzY2FsZXJWYWx1ZTsKKyAgdWludDMyX3QgICAgICAgICAgICAgIHBGTGF0ZW5jeTsKKworICAvKkNvbmZpZ3VyZSB0aGUgVElNNiBJUlEgcHJpb3JpdHkgKi8KKyAgSEFMX05WSUNfU2V0UHJpb3JpdHkoVElNNl9EQUNfTFBUSU0xX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworCisgIC8qIEVuYWJsZSB0aGUgVElNNiBnbG9iYWwgSW50ZXJydXB0ICovCisgIEhBTF9OVklDX0VuYWJsZUlSUShUSU02X0RBQ19MUFRJTTFfSVJRbik7CisKKyAgLyogRW5hYmxlIFRJTTYgY2xvY2sgKi8KKyAgX19IQUxfUkNDX1RJTTZfQ0xLX0VOQUJMRSgpOworCisgIC8qIEdldCBjbG9jayBjb25maWd1cmF0aW9uICovCisgIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoJmNsa2NvbmZpZywgJnBGTGF0ZW5jeSk7CisKKyAgLyogR2V0IEFQQjEgcHJlc2NhbGVyICovCisgIHV3QVBCMVByZXNjYWxlciA9IGNsa2NvbmZpZy5BUEIxQ0xLRGl2aWRlcjsKKworICAvKiBDb21wdXRlIFRJTTYgY2xvY2sgKi8KKyAgaWYgKHV3QVBCMVByZXNjYWxlciA9PSBSQ0NfSENMS19ESVYxKQorICB7CisgICAgdXdUaW1jbG9jayA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgdXdUaW1jbG9jayA9IDJVKkhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgIH0KKworICAvKiBDb21wdXRlIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gaGF2ZSBUSU02IGNvdW50ZXIgY2xvY2sgZXF1YWwgdG8gMU1IeiAqLworICB1d1ByZXNjYWxlclZhbHVlID0gKHVpbnQzMl90KSgodXdUaW1jbG9jayAvIDEwMDAwMDBVKSAtIDFVKTsKKworICAvKiBJbml0aWFsaXplIFRJTTYgKi8KKyAgVGltSGFuZGxlLkluc3RhbmNlID0gVElNNjsKKworICAvKiBJbml0aWFsaXplIFRJTXggcGVyaXBoZXJhbCBhcyBmb2xsb3c6CisgICsgUGVyaW9kID0gWyhUSU02Q0xLLzEwMDApIC0gMV0uIHRvIGhhdmUgYSAoMS8xMDAwKSBzIHRpbWUgYmFzZS4KKyAgKyBQcmVzY2FsZXIgPSAodXdUaW1jbG9jay8xMDAwMDAwIC0gMSkgdG8gaGF2ZSBhIDFNSHogY291bnRlciBjbG9jay4KKyAgKyBDbG9ja0RpdmlzaW9uID0gMAorICArIENvdW50ZXIgZGlyZWN0aW9uID0gVXAKKyAgKi8KKyAgVGltSGFuZGxlLkluaXQuUGVyaW9kID0gKDEwMDAwMDBVIC8gMTAwMFUpIC0gMVU7CisgIFRpbUhhbmRsZS5Jbml0LlByZXNjYWxlciA9IHV3UHJlc2NhbGVyVmFsdWU7CisgIFRpbUhhbmRsZS5Jbml0LkNsb2NrRGl2aXNpb24gPSAwVTsKKyAgVGltSGFuZGxlLkluaXQuQ291bnRlck1vZGUgPSBUSU1fQ09VTlRFUk1PREVfVVA7CisgIFRpbUhhbmRsZS5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkID0gVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFOworICBpZihIQUxfVElNX0Jhc2VfSW5pdCgmVGltSGFuZGxlKSA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTdGFydCB0aGUgVElNIHRpbWUgQmFzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlICovCisgICAgcmV0dXJuIEhBTF9USU1fQmFzZV9TdGFydF9JVCgmVGltSGFuZGxlKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFRJTTYgdXBkYXRlIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpCit7CisgIC8qIERpc2FibGUgVElNNiB1cGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKCZUaW1IYW5kbGUsIFRJTV9JVF9VUERBVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZW5hYmxpbmcgVElNNiB1cGRhdGUgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQoreworICAvKiBFbmFibGUgVElNNiB1cGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoJlRpbUhhbmRsZSwgVElNX0lUX1VQREFURSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB3aGVuIFRJTTYgaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQorICAqIEhBTF9USU1fSVJRSGFuZGxlcigpLiBJdCBtYWtlcyBhIGRpcmVjdCBjYWxsIHRvIEhBTF9JbmNUaWNrKCkgdG8gaW5jcmVtZW50CisgICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIEhBTF9JbmNUaWNrKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNNl9EQUNfTFBUSU0xX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1RJTV9JUlFIYW5kbGVyKCZUaW1IYW5kbGUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfdWFydC5jIGIvU3JjL3N0bTMyZzB4eF9oYWxfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTA1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF91YXJ0LmMKQEAgLTAsMCArMSw0MDM4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF91YXJ0LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgVUFSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVUFSVF9IYW5kbGVUeXBlRGVmIGh1YXJ0KS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVUFSVCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVUFSVCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVUFSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBVQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gIFRoZSBzcGVjaWZpYyBVQVJUIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQsIFJYL1RYIEZJRk9zIHJlbGF0ZWQgaW50ZXJydXB0cyBhbmQgRXJyb3IgSW50ZXJydXB0cykKKyAgICAgICAgICAgICAgICBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1VBUlRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1VBUlRfRElTQUJMRV9JVCgpCisgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzZXMuCisgICAgICAgICgrKykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfVUFSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBVQVJUIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgKCMpIFByb2dyYW0gdGhlIEJhdWQgUmF0ZSwgV29yZCBMZW5ndGgsIFN0b3AgQml0LCBQYXJpdHksIFByZXNjYWxlciB2YWx1ZSAsIEhhcmR3YXJlCisgICAgICAgIGZsb3cgY29udHJvbCBhbmQgTW9kZSAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodWFydCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gVUFSVCBhZHZhbmNlZCBmZWF0dXJlcyAoVFgvUlggcGlucyBzd2FwLCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24sLi4uKQorICAgICAgICBpbiB0aGUgaHVhcnQgaGFuZGxlIEFkdmFuY2VkSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIGFzeW5jaHJvbm91cyBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfVUFSVF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBIYWxmIGR1cGxleCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfSGFsZkR1cGxleF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBMSU4gKExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrKSBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfTElOX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIE11bHRpcHJvY2Vzc29yIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlZCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfUlM0ODVFeF9Jbml0KCkgQVBJLgorCisgICAgWy4uXQorICAgIChAKSBUaGVzZSBBUEkncyAoSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpLCBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpLAorICAgICAgICBhbHNvIGNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpIGJ5CisgICAgICAgIGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSS4KKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KKyAgICBGdW5jdGlvbiBAcmVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1VBUlRfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVUFSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9VQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VQVJUX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfVUFSVF9Jbml0KCkgYW5kIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VBUlRfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgIGluIEhBTF9VQVJUX1NUQVRFX1JFQURZIG9yIEhBTF9VQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUIFVBUlQKKyAgKiBAYnJpZWYgSEFMIFVBUlQgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0NvbnN0YW50cyBVQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0ZJRUxEUyAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfT1ZFUjh8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0ZJRk9FTiApKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVQVJUX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9DUjNfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFIHwgVVNBUlRfQ1IzX09ORUJJVHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHICkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IzIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVQVJUX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBMUFVBUlRfQlJSX01JTiAgMHgwMDAwMDMwMFUgIC8qIExQVUFSVCBCUlIgbWluaW11bSBhdXRob3JpemVkIHZhbHVlICovCisjZGVmaW5lIExQVUFSVF9CUlJfTUFYICAweDAwMEZGRkZGVSAgLyogTFBVQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworI2RlZmluZSBVQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qIFVBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworI2RlZmluZSBVQVJUX0JSUl9NQVggICAgMHgwMDAwRkZGRlUgIC8qIFVBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFR4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFJ4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9UeElTUl8xNkJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4IG9yIHRoZSBVQVJUeQorICAgIGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUgdGhlIHBhcmFtZXRlcnMgYmVsb3cgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBIYXJkd2FyZSBmbG93IGNvbnRyb2wKKyAgICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgICAoKyspIE92ZXIgU2FtcGxpbmcgTWV0aG9kCisgICAgICAgICgrKykgT25lLUJpdCBTYW1wbGluZyBNZXRob2QKKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSBjb25maWd1cmVkIGFzIHdlbGw6CisgICAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgUlggYW5kIFRYIHBpbnMgc3dhcAorICAgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3IKKyAgICAgICAgKCsrKSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lCisgICAgICAgICgrKykgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uCisgICAgWy4uXQorICAgIFRoZSBIQUxfVUFSVF9Jbml0KCksIEhBTF9IYWxmRHVwbGV4X0luaXQoKSwgSEFMX0xJTl9Jbml0KClhbmQgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKUFQSQorICAgIGZvbGxvdyByZXNwZWN0aXZlbHkgdGhlIFVBUlQgYXN5bmNocm9ub3VzLCBVQVJUIEhhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlCisgICAgYW5kIFVBUlQgbXVsdGlwcm9jZXNzb3IgbW9kZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzCisgICAgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgVUFSVCBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+SW5pdC5Id0Zsb3dDdGwgIT0gVUFSVF9IV0NPTlRST0xfTk9ORSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8IChJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpOworICB9CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7CisKKyAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIEhEU0VMIGFuZCBJUkVOICBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgaGFsZi1kdXBsZXggbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBoYWxmLWR1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIExJTiBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gQnJlYWtEZXRlY3RMZW5ndGggU3BlY2lmaWVzIHRoZSBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIgMTAtYml0IGJyZWFrIGRldGVjdGlvbgorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBMSU4gVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIENoZWNrIHRoZSBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChCcmVha0RldGVjdExlbmd0aCkpOworCisgIC8qIExJTiBtb2RlIGxpbWl0ZWQgdG8gMTYtYml0IG92ZXJzYW1wbGluZyBvbmx5ICovCisgIGlmIChodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogTElOIG1vZGUgbGltaXRlZCB0byA4LWJpdCBkYXRhIGxlbmd0aCAqLworICBpZiAoaHVhcnQtPkluaXQuV29yZExlbmd0aCAhPSBVQVJUX1dPUkRMRU5HVEhfOEIpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7CisKKyAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gTElOIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIExJTiBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoLiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgQnJlYWtEZXRlY3RMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIG11bHRpcHJvY2Vzc29yIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gQWRkcmVzcyAgICAgIFVBUlQgbm9kZSBhZGRyZXNzICg0LSwgNi0sIDctIG9yIDgtYml0IGxvbmcpLgorICAqIEBwYXJhbSBXYWtlVXBNZXRob2QgU3BlY2lmaWVzIHRoZSBVQVJUIHdha2V1cCBtZXRob2QuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFdha2VVcCBieSBhbiBpZGxlIGxpbmUgZGV0ZWN0aW9uCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLIFdha2VVcCBieSBhbiBhZGRyZXNzIG1hcmsKKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBpZGxlIGxpbmUgZGV0ZWN0aW9uIHdha2UgdXAsIHRoZSBBZGRyZXNzIHBhcmFtZXRlcgorICAqICAgICAgICBpcyB1c2VsZXNzIGFuZCBpZ25vcmVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBhZGRyZXNzIG1hcmsgd2FrZSB1cCwgdGhlIGFkZHJlc3MgbGVuZ3RoIGRldGVjdGlvbgorICAqICAgICAgICBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQgdG8gNCBiaXRzIG9ubHkuIEZvciB0aGUgVUFSVCB0byBiZSBhYmxlIHRvCisgICogICAgICAgIG1hbmFnZSA2LSwgNy0gb3IgOC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uLCB0aGUgQVBJCisgICogICAgICAgIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgKiAgICAgICAgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgQWRkcmVzcywgdWludDMyX3QgV2FrZVVwTWV0aG9kKQoreworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgd2FrZSB1cCBtZXRob2QgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUE1FVEhPRChXYWtlVXBNZXRob2QpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBtdWx0aXByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOLCBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworCisgIGlmIChXYWtlVXBNZXRob2QgPT0gVUFSVF9XQUtFVVBNRVRIT0RfQUREUkVTU01BUkspCisgIHsKKyAgICAvKiBJZiBhZGRyZXNzIG1hcmsgd2FrZSB1cCBtZXRob2QgaXMgY2hvc2VuLCBzZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BREQsICgodWludDMyX3QpQWRkcmVzcyA8PCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MpKTsKKyAgfQorCisgIC8qIFNldCB0aGUgd2FrZSB1cCBtZXRob2QgYnkgc2V0dGluZyB0aGUgV0FLRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfV0FLRSwgV2FrZVVwTWV0aG9kKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9EZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8IChJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICBodWFydC0+SW5zdGFuY2UtPkNSMSA9IDB4MFU7CisgIGh1YXJ0LT5JbnN0YW5jZS0+Q1IyID0gMHgwVTsKKyAgaHVhcnQtPkluc3RhbmNlLT5DUjMgPSAweDBVOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfVUFSVF9Nc3BEZUluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCBNU1AuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfTXNwSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgTVNQLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHVhcnQgdWFydCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBVQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+VHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1dBS0VVUF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBVQVJUIGNhbGxhYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh1YXJ0IHVhcnQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBpZiAoSEFMX1VBUlRfU1RBVEVfUkVBRFkgPT0gaHVhcnQtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfRVJST1JfQ0JfSUQgOgorICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgOgorICAgICAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9IEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgOgorICAgICAgICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9VQVJUX1NUQVRFX1JFU0VUID09IGh1YXJ0LT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgVUFSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVUFSVCBhc3luY2hyb25vdXMKKyAgICBhbmQgSGFsZiBkdXBsZXggZGF0YSB0cmFuc2ZlcnMuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgZGVkaWNhdGVkIFVBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgVGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgIFRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKSBIQUxfVUFSVF9UcmFuc21pdCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVJlc3VtZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKykgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VQVJUX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVUFSVCBzaWRlLgorICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworICAgIC1ALSBJbiB0aGUgSGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiwgaXQgaXMgZm9yYmlkZGVuIHRvIHJ1biB0aGUgdHJhbnNtaXQKKyAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2VzcyBpbiBwYXJhbGxlbCwgdGhlIFVBUlQgc3RhdGUgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCBjYW4ndCBiZSB1c2VmdWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgd3JpdGluZyBhIGRhdGEgaW4gdGhlIFREUiByZWdpc3RlciBhZGRzIG9uZQorICAqICAgICAgIGRhdGEgdG8gdGhlIFRYRklGTy4gV3JpdGUgb3BlcmF0aW9ucyB0byB0aGUgVERSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQKKyAgKiAgICAgICB3aGVuIFRYRk5GIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBUWEZORiBmbGFnIGFuZAorICAqICAgICAgIFRYRSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBiZSBzZW50LCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyBzZW50IGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnBkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwZGF0YTE2Yml0czsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIGZpbGxlZCBpbnRvIFREUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodWFydC0+VHhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwRGF0YTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gcERhdGE7CisgICAgICBwZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKGh1YXJ0LT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHBkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwZGF0YTE2Yml0cyAmIDB4MDFGRlUpOworICAgICAgICBwZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcGRhdGE4Yml0cyAmIDB4RkZVKTsKKyAgICAgICAgcGRhdGE4Yml0cysrOworICAgICAgfQorICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgdGhlIFJYRk5FIGZsYWcgaXMgc2V0IGFzIGxvbmcgYXMgdGhlIFJYRklGTworICAqICAgICAgIGlzIG5vdCBlbXB0eS4gUmVhZCBvcGVyYXRpb25zIGZyb20gdGhlIFJEUiByZWdpc3RlciBhcmUgcGVyZm9ybWVkIHdoZW4KKyAgKiAgICAgICBSWEZORSBmbGFnIGlzIHNldC4gRnJvbSBoYXJkd2FyZSBwZXJzcGVjdGl2ZSwgUlhGTkUgZmxhZyBhbmQKKyAgKiAgICAgICBSWE5FIGFyZSBtYXBwZWQgb24gdGhlIHNhbWUgYml0LWZpZWxkLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKiBAcGFyYW0gaHVhcnQgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICAgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnBkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgcmVjZWl2ZWQgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1YXJ0LT5SeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04oaHVhcnQpOworICAgIHVoTWFzayA9IGh1YXJ0LT5NYXNrOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBEYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLworICAgIHdoaWxlIChodWFydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAqcGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1YXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKnBkYXRhOGJpdHMgPSAodWludDhfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgICAgICBwZGF0YThiaXRzKys7CisgICAgICB9CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSBmaWxsZWQgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wVHhCdWZmUHRyICA9IHBEYXRhOworICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodWFydC0+VHhJU1IgICAgICAgPSBOVUxMOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBDb25maWd1cmUgVHggaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KKyAgICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodWFydC0+VHhJU1IgPSBVQVJUX1R4SVNSXzE2QklUX0ZJRk9FTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl84QklUX0ZJRk9FTjsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBUeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfMTZCSVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwRGF0YS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgcmVjZWl2ZWQgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wUnhCdWZmUHRyICA9IHBEYXRhOworICAgIGh1YXJ0LT5SeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgICBodWFydC0+UnhJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogQ29uZmlndXJlIFJ4IGludGVycnVwdCBwcm9jZXNzaW5nKi8KKyAgICBpZiAoKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkgJiYgKFNpemUgPj0gaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl8xNkJJVF9GSUZPRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfOEJJVF9GSUZPRU47CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQgYW5kIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaHVhcnQtPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVUFSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVQVJUX0RNQVRyYW5zbWl0Q3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BVHhIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVUFSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodWFydC0+aGRtYXR4LCAodWludDMyX3QpaHVhcnQtPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHVhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byByZWFkeSAqLworICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9UQ0YpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgIGluIHRoZSBVQVJUIENSMyByZWdpc3RlciAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgVUFSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4KKyAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcERhdGEuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSBjb3B5IGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIGJ5IERNQSBmcm9tIGEgdTE2IGZyb250aWVyLiAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBEYXRhKSAmIDFVKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFSZWNlaXZlQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUnhIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVUFSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWh1YXJ0LT5wUnhCdWZmUHRyLCBTaXplKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BUGF1c2UoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkKKyAgeworICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BUmVzdW1lKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBmbGFnIGJlZm9yZSByZXN1bWluZyB0aGUgUnggdHJhbnNmZXIgKi8KKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAvKiBSZWVuYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFTdG9wKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVUFSVCBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkgLyBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIC8gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOgorICAgICBpbmRlZWQsIHdoZW4gSEFMX0RNQV9BYm9ydCgpIEFQSSBpcyBjYWxsZWQsIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgb3IgSGFsZiBUcmFuc2ZlciBjb21wbGV0ZQorICAgICBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YKKyAgICAgdGhlIHN0cmVhbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAqLworCisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiBnc3RhdGUgPSBodWFydC0+Z1N0YXRlOworICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgcnhzdGF0ZSA9IGh1YXJ0LT5SeFN0YXRlOworCisgIC8qIFN0b3AgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgJiYKKyAgICAgIChnc3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsICovCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBVQVJUX0VuZFR4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgLyogU3RvcCBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSAmJgorICAgICAgKHJ4c3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBUWEUsIFRDLCBSWE5FLCBQRSwgUlhGVCwgVFhGVCBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLworICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKQorICB7CisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KKworICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBIYW5kbGUgRXJyb3JDb2RlIHRvIE5vIEVycm9yICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVENJRSwgVFhFSUUgYW5kIFRYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgIHsKKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUEVJRSwgRUlFLCBSWE5FSUUgYW5kIFJYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBVQVJUIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVBUlQgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKyAgICBodWFydC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgICAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKyAgICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLworICAgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgICAgeworICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgfQorCisgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gTlVMTDsKKworICAgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBodWFydC0+cFJ4QnVmZlB0ciA9IE5VTEw7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIFVBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyAgICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IGNyM2l0cyAgICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMyk7CisKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKyAgdWludDMyX3QgZXJyb3Jjb2RlOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogVUFSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpCisgICAgeworICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKChjcjNpdHMgJiAoVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19FSUUpKSAhPSAwVSkKKyAgICAgICAgICAgfHwgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSAwVSkpKSkKKyAgeworICAgIC8qIFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfTkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkgfHwKKyAgICAgICAgICAgICgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIENhbGwgVUFSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGh1YXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VBUlRfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKQorICAgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaHVhcnQtPlJ4SVNSKGh1YXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBPdmVycnVuIGVycm9yIG9jY3Vycywgb3IgaWYgYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24sCisgICAgICAgICBjb25zaWRlciBlcnJvciBhcyBibG9ja2luZyAqLworICAgICAgZXJyb3Jjb2RlID0gaHVhcnQtPkVycm9yQ29kZTsKKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgfHwKKyAgICAgICAgICAoKGVycm9yY29kZSAmIEhBTF9VQVJUX0VSUk9SX09SRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBVQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXJ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKyAgLyogVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1dVRikgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX1dVRklFKSAhPSAwVSkpCisgIHsKKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfV1VGKTsKKworICAgIC8qIFVBUlQgUnggc3RhdGUgaXMgbm90IHJlc2V0IGFzIGEgcmVjZXB0aW9uIHByb2Nlc3MgbWlnaHQgYmUgb25nb2luZy4KKyAgICAgICBJZiBVQVJUIGhhbmRsZSBzdGF0ZSBmaWVsZHMgbmVlZCB0byBiZSByZXNldCB0byBSRUFEWSwgdGhpcyBjb3VsZCBiZSBkb25lIGluIFdha2V1cCBjYWxsYmFjayAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgV2FrZXVwIENhbGxiYWNrICovCisgICAgaHVhcnQtPldha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBXYWtldXAgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpCisgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfVFhGVElFKSAhPSAwVSkpKQorICB7CisgICAgaWYgKGh1YXJ0LT5UeElTUiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5UeElTUihodWFydCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UQykgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RDSUUpICE9IDBVKSkKKyAgeworICAgIFVBUlRfRW5kVHJhbnNtaXRfSVQoaHVhcnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgVFggRmlmbyBFbXB0eSBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhGRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRkVJRSkgIT0gMFUpKQorICB7CisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYRkYpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWEZGSUUpICE9IDBVKSkKKyAgeworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFVBUlQgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgVUFSVC4KKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZSgpIEFQSSBlbmFibGVzIG11dGUgbW9kZQorICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgpIEFQSSBkaXNhYmxlcyBtdXRlIG1vZGUKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKCkgQVBJIGVudGVycyBtdXRlIG1vZGUKKyAgICAgKCspIFVBUlRfU2V0Q29uZmlnKCkgQVBJIGNvbmZpZ3VyZXMgdGhlIFVBUlQgcGVyaXBoZXJhbAorICAgICAoKykgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKCkgQVBJIG9wdGlvbmFsbHkgY29uZmlndXJlcyB0aGUgVUFSVCBhZHZhbmNlZCBmZWF0dXJlcworICAgICAoKykgVUFSVF9DaGVja0lkbGVTdGF0ZSgpIEFQSSBlbnN1cmVzIHRoYXQgVEVBQ0sgYW5kL29yIFJFQUNLIGFyZSBzZXQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgKCspIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKCkgQVBJIGRpc2FibGVzIHJlY2VpdmVyIGFuZCBlbmFibGVzIHRyYW5zbWl0dGVyCisgICAgICgrKSBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcigpIEFQSSBkaXNhYmxlcyB0cmFuc21pdHRlciBhbmQgZW5hYmxlcyByZWNlaXZlcgorICAgICAoKykgSEFMX0xJTl9TZW5kQnJlYWsoKSBBUEkgdHJhbnNtaXRzIHRoZSBicmVhayBjaGFyYWN0ZXJzCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBVQVJUIGluIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiBVQVJUIGVudGVycyBtdXRlIG1vZGU7CisgICogICAgICAgICB0byBlbnRlciBtdXRlIG1vZGUsIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKCkgQVBJIG11c3QgYmUgY2FsbGVkKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSBVU0FSVCBtdXRlIG1vZGUgYnkgc2V0dGluZyB0aGUgTU1FIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9NTUUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFVBUlQgbXV0ZSBtb2RlIChkb2VzIG5vdCBtZWFuIHRoZSBVQVJUIGFjdHVhbGx5IGV4aXRzIG11dGUgbW9kZQorICAqICAgICAgICAgYXMgaXQgbWF5IG5vdCBoYXZlIGJlZW4gaW4gbXV0ZSBtb2RlIGF0IHRoaXMgdmVyeSBtb21lbnQpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBNTUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbnRlciBVQVJUIG11dGUgbW9kZSAobWVhbnMgVUFSVCBhY3R1YWxseSBlbnRlcnMgbXV0ZSBtb2RlKS4KKyAgKiBAbm90ZSAgVG8gZXhpdCBmcm9tIG11dGUgbW9kZSwgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgpIEFQSSBtdXN0IGJlIGNhbGxlZC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfTVVURV9NT0RFX1JFUVVFU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVUFSVCB0cmFuc21pdHRlciBhbmQgZGlzYWJsZSB0aGUgVUFSVCByZWNlaXZlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpOworCisgIC8qIEVuYWJsZSB0aGUgVVNBUlQncyB0cmFuc21pdCBpbnRlcmZhY2UgYnkgc2V0dGluZyB0aGUgVEUgYml0IGluIHRoZSBVU0FSVCBDUjEgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIHJlY2VpdmVyIGFuZCBkaXNhYmxlIHRoZSBVQVJUIHRyYW5zbWl0dGVyLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpOworCisgIC8qIEVuYWJsZSB0aGUgVVNBUlQncyByZWNlaXZlIGludGVyZmFjZSBieSBzZXR0aW5nIHRoZSBSRSBiaXQgaW4gdGhlIFVTQVJUIENSMSByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGJyZWFrIGNoYXJhY3RlcnMuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MSU5fU2VuZEJyZWFrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0xJTl9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBVQVJUIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBSZXR1cm4gdGhlIFVBUlQgaGFuZGxlIHN0YXRlLgorICAgICAgKCspIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0ZW1wMSwgdGVtcDI7CisgIHRlbXAxID0gaHVhcnQtPmdTdGF0ZTsKKyAgdGVtcDIgPSBodWFydC0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9VQVJUX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4KKyAgKiBAcmV0dmFsIFVBUlQgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9VQVJUX0dldEVycm9yKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHJldHVybiBodWFydC0+RXJyb3JDb2RlOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVBUlQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBJbml0IHRoZSBVQVJUIENhbGxiYWNrIHNldHRpbmdzICovCisgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodWFydC0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaHVhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodWFydC0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKyAgaHVhcnQtPldha2V1cENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBXYWtldXBDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgID0gSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA9IEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKworfQorI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgdWludDE2X3QgYnJydGVtcDsKKyAgVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2U7CisgIHVpbnQzMl90IHVzYXJ0ZGl2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgID0gSEFMX09LOworICB1aW50MzJfdCBscHVhcnRfa2VyX2NrX3ByZXMgICAgICAgICA9IDB4MDAwMDAwMDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0JBVURSQVRFKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dPUkRfTEVOR1RIKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgaWYgKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX1NUT1BCSVRTKGh1YXJ0LT5Jbml0LlN0b3BCaXRzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT05FX0JJVF9TQU1QTEUoaHVhcnQtPkluaXQuT25lQml0U2FtcGxpbmcpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1BBUklUWShodWFydC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTU9ERShodWFydC0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChodWFydC0+SW5pdC5Id0Zsb3dDdGwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlNBTVBMSU5HKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZykpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9QUkVTQ0FMRVIoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUsIFJFIGFuZCBPVkVSOCBiaXRzIGFuZCBjb25maWd1cmUKKyAgKiAgdGhlIFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSwgTW9kZSBhbmQgb3ZlcnNhbXBsaW5nOgorICAqICBzZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAqICBzZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Nb2RlIHZhbHVlCisgICogIHNldCBPVkVSOCBiaXQgYWNjb3JkaW5nIHRvIGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyB2YWx1ZSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuV29yZExlbmd0aCB8IGh1YXJ0LT5Jbml0LlBhcml0eSB8IGh1YXJ0LT5Jbml0Lk1vZGUgfCBodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgOworICB0bXByZWcgfD0gKHVpbnQzMl90KWh1YXJ0LT5GaWZvTW9kZTsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIHRoZSBVQVJUIFN0b3AgQml0czogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nCisgICogdG8gaHVhcnQtPkluaXQuU3RvcEJpdHMgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIGh1YXJ0LT5Jbml0LlN0b3BCaXRzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICogLSBVQVJUIEhhcmRXYXJlIEZsb3cgQ29udHJvbDogc2V0IENUU0UgYW5kIFJUU0UgYml0cyBhY2NvcmRpbmcKKyAgKiAgIHRvIGh1YXJ0LT5Jbml0Lkh3Rmxvd0N0bCB2YWx1ZQorICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUgYWNjb3JkaW5nCisgICogICB0byBodWFydC0+SW5pdC5PbmVCaXRTYW1wbGluZyAobm90IGFwcGxpY2FibGUgdG8gTFBVQVJUKSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuSHdGbG93Q3RsOworCisgIGlmICghKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKSkKKyAgeworICAgIHRtcHJlZyB8PSBodWFydC0+SW5pdC5PbmVCaXRTYW1wbGluZzsKKyAgfQorICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZQorICAqIC0gVUFSVCBDbG9jayBQcmVzY2FsZXIgOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBVQVJUX0dFVENMT0NLU09VUkNFKGh1YXJ0LCBjbG9ja3NvdXJjZSk7CisKKyAgLyogQ2hlY2sgTFBVQVJUIGluc3RhbmNlICovCisgIGlmIChVQVJUX0lOU1RBTkNFX0xPV1BPV0VSKGh1YXJ0KSkKKyAgeworICAgIC8qIFJldHJpZXZlIGZyZXF1ZW5jeSBjbG9jayAqLworICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoKHVpbnQzMl90KUhTSV9WQUxVRSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoKHVpbnQzMl90KUxTRV9WQUxVRSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGlmIHByb3BlciBjbG9jayBzb3VyY2UgcmVwb3J0ZWQgKi8KKyAgICBpZiAobHB1YXJ0X2tlcl9ja19wcmVzICE9IDBVKQorICAgIHsKKyAgICAgIC8qIGVuc3VyZSB0aGF0IEZyZXF1ZW5jeSBjbG9jayBpcyBpbiB0aGUgcmFuZ2UgWzMgKiBiYXVkcmF0ZSwgNDA5NiAqIGJhdWRyYXRlXSAqLworICAgICAgaWYgKChscHVhcnRfa2VyX2NrX3ByZXMgPCAoM1UgKiBodWFydC0+SW5pdC5CYXVkUmF0ZSkpIHx8CisgICAgICAgICAgKGxwdWFydF9rZXJfY2tfcHJlcyA+ICg0MDk2VSAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpCisgICAgICB7CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX0xQVUFSVChIU0lfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX0xQVUFSVChMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogSXQgaXMgZm9yYmlkZGVuIHRvIHdyaXRlIHZhbHVlcyBsb3dlciB0aGFuIDB4MzAwIGluIHRoZSBMUFVBUlRfQlJSIHJlZ2lzdGVyICovCisgICAgICAgIGlmICgodXNhcnRkaXYgPj0gTFBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBMUFVBUlRfQlJSX01BWCkpCisgICAgICAgIHsKKyAgICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IHVzYXJ0ZGl2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfSAvKiAgIGlmICggKGxwdWFydF9rZXJfY2tfcHJlcyA8ICgzICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpICkgfHwgKGxwdWFydF9rZXJfY2tfcHJlcyA+ICg0MDk2ICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpICkpICovCisgICAgfSAvKiBpZiAobHB1YXJ0X2tlcl9ja19wcmVzICE9IDApICovCisgIH0KKyAgLyogQ2hlY2sgVUFSVCBPdmVyIFNhbXBsaW5nIHRvIHNldCBCYXVkIFJhdGUgUmVnaXN0ZXIgKi8KKyAgZWxzZSBpZiAoaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nID09IFVBUlRfT1ZFUlNBTVBMSU5HXzgpCisgIHsKKyAgICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICAgIHsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFBDTEsxRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhTSV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KCh1aW50MzJfdClMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICAgIGlmICgodXNhcnRkaXYgPj0gVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gVUFSVF9CUlJfTUFYKSkKKyAgICB7CisgICAgICBicnJ0ZW1wID0gKHVpbnQxNl90KSh1c2FydGRpdiAmIDB4RkZGMFUpOworICAgICAgYnJydGVtcCB8PSAodWludDE2X3QpKCh1c2FydGRpdiAmICh1aW50MTZfdCkweDAwMEZVKSA+PiAxVSk7CisgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IGJycnRlbXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihIQUxfUkNDX0dldFBDTEsxRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihIU0lfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KCh1aW50MzJfdClMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICAgIGlmICgodXNhcnRkaXYgPj0gVUFSVF9CUlJfTUlOKSAmJiAodXNhcnRkaXYgPD0gVUFSVF9CUlJfTUFYKSkKKyAgICB7CisgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IHVzYXJ0ZGl2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMTsKKyAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMTsKKworICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKyAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBVQVJUIHBlcmlwaGVyYWwgYWR2YW5jZWQgZmVhdHVyZXMuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBVQVJUX0FkdkZlYXR1cmVDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgc2V0IG9mIGFkdmFuY2VkIGZlYXR1cmVzIHRvIGNvbmZpZ3VyZSBpcyBwcm9wZXJseSBzZXQgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9JTklUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQpKTsKKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX1RYSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuVHhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9UWElOViwgaHVhcnQtPkFkdmFuY2VkSW5pdC5UeFBpbkxldmVsSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfUlhJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBodWFydC0+QWR2YW5jZWRJbml0LlJ4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBkYXRhIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlYoaHVhcnQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIGh1YXJ0LT5BZHZhbmNlZEluaXQuRGF0YUludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYL1RYIHBpbnMgc3dhcCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX1NXQVBfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX1NXQVAoaHVhcnQtPkFkdmFuY2VkSW5pdC5Td2FwKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIGh1YXJ0LT5BZHZhbmNlZEluaXQuU3dhcCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZyAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9PVkVSUlVOKGh1YXJ0LT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTLCBodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgRE1BIGRpc2FibGluZyBvbiByZWNlcHRpb24gZXJyb3IgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfRE1BT05SWEVSUk9SKGh1YXJ0LT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcikpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERFJFLCBodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gc2NoZW1lICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEUoaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVFbmFibGUpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4sIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlRW5hYmxlKTsKKyAgICAvKiBzZXQgYXV0byBCYXVkcmF0ZSBkZXRlY3Rpb24gcGFyYW1ldGVycyBpZiBkZXRlY3Rpb24gaXMgZW5hYmxlZCAqLworICAgIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVNb2RlKSk7CisgICAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQUJSTU9ERSwgaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVNb2RlKTsKKyAgICB9CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfTVNCRklSU1QoaHVhcnQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCwgaHVhcnQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVQVJUIElkbGUgU3RhdGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBFcnJvckNvZGUgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBpZiB0aGUgVHJhbnNtaXR0ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1RFKSA9PSBVU0FSVF9DUjFfVEUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFRFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1RFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBSZWNlaXZlciBpcyBlbmFibGVkICovCisgIGlmICgoaHVhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFVBUlQgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSBodWFydCAgICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIEZsYWcgICAgICBTcGVjaWZpZXMgdGhlIFVBUlQgZmxhZyB0byBjaGVjaworICAqIEBwYXJhbSBTdGF0dXMgICAgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkKKyAgKiBAcGFyYW0gVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcGFyYW0gVGltZW91dCAgIFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFR4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc21pdCBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRUeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFRYRlQgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuZCBvbmdvaW5nIFJ4IHRyYW5zZmVyIG9uIFVBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBSZWNlcHRpb24gY29tcGxldGlvbikuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRW5kUnhUcmFuc2ZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSkpOworCisgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgUnhJc3IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+UnhJU1IgPSBOVUxMOworfQorCisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykpCisgIHsKKyAgICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworICB9CisgIC8qIERNQSBDaXJjdWxhciBtb2RlICovCisgIGVsc2UKKyAgeworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sqLworICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBUeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgVHggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIH0KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLworICBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogU3RvcCBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kVHhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICAvKiBTdG9wIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkKKyAgeworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworICAgIFVBUlRfRW5kUnhUcmFuc2ZlcihodWFydCk7CisgIH0KKworICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFJ4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgIHsKKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUIEFQSSAoQWJvcnQgb25seSBUeCB0cmFuc2ZlcikKKyAgKiAgICAgICAgIChUaGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QsCisgICogICAgICAgICBhbmQgbGVhZHMgdG8gdXNlciBUeCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24pLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFUeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgIHsKKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVQVJUIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfVUFSVF9BYm9ydFJlY2VpdmVfSVQgQVBJIChBYm9ydCBvbmx5IFJ4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFJ4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVFggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggYml0cyBkYXRhIHdvcmQgbGVuZ3RoIC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaHVhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsKKyAgICAgIGh1YXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFRYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGguCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzE2QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90ICp0bXA7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdG1wID0gKHVpbnQxNl90ICopIGh1YXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVhcnQtPkluc3RhbmNlLT5URFIgPSAoKCh1aW50MzJfdCkoKnRtcCkpICYgMHgwMUZGVUwpOworICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFRYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgNyBvciA4IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90ICBuYl90eF9kYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGZvciAobmJfdHhfZGF0YSA9IGh1YXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA7IG5iX3R4X2RhdGEgPiAwVSA7IG5iX3R4X2RhdGEtLSkKKyAgICB7CisgICAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKworICAgICAgICBicmVhazsgLyogZm9yY2UgZXhpdCBsb29wICovCisgICAgICB9CisgICAgICBlbHNlIGlmIChSRUFEX0JJVChodWFydC0+SW5zdGFuY2UtPklTUiwgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodWFydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgICBodWFydC0+cFR4QnVmZlB0cisrOworICAgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgVFggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCAgbmJfdHhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgOyBuYl90eF9kYXRhID4gMFUgOyBuYl90eF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgICAgICAgYnJlYWs7IC8qIGZvcmNlIGV4aXQgbG9vcCAqLworICAgICAgfQorICAgICAgZWxzZSBpZiAoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVhcnQtPnBUeEJ1ZmZQdHI7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKCgodWludDMyX3QpKCp0bXApKSAmIDB4MDFGRlVMKTsKKyAgICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JhcCB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodWFydCBwb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2xlYXQgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+VHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgNyBvciA4IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCAuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1YXJ0LT5NYXNrOworICB1aW50MTZfdCAgdWhkYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICAqaHVhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICBodWFydC0+cFJ4QnVmZlB0cisrOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0cyAqLworICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QgKnRtcDsKKyAgdWludDE2X3QgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisgIHVpbnQxNl90ICB1aGRhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIHVoZGF0YSA9ICh1aW50MTZfdCkgUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5SRFIpOworICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodWFydC0+cFJ4QnVmZlB0ciA7CisgICAgKnRtcCA9ICh1aW50MTZfdCkodWhkYXRhICYgdWhNYXNrKTsKKyAgICBodWFydC0+cFJ4QnVmZlB0ciArPSAyVTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUlggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggIGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCAgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisgIHVpbnQxNl90ICB1aGRhdGE7CisgIHVpbnQxNl90ICAgbmJfcnhfZGF0YTsKKyAgdWludDE2X3QgIHJ4ZGF0YWNvdW50OworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBmb3IgKG5iX3J4X2RhdGEgPSBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3MgOyBuYl9yeF9kYXRhID4gMFUgOyBuYl9yeF9kYXRhLS0pCisgICAgeworICAgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7CisgICAgICAqaHVhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgIGh1YXJ0LT5wUnhCdWZmUHRyKys7CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWEZUIGludGVycnVwdCovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTworICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzCisgICAgZGlzYWJsZWQgKGkuZS4gb25lIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUpLgorICAgICovCisgICAgcnhkYXRhY291bnQgPSBodWFydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKChyeGRhdGFjb3VudCAhPSAwVSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl84QklUOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90ICB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKyAgdWludDE2X3QgICBuYl9yeF9kYXRhOworICB1aW50MTZfdCAgcnhkYXRhY291bnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGZvciAobmJfcnhfZGF0YSA9IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX3J4X2RhdGEgPiAwVSA7IG5iX3J4X2RhdGEtLSkKKyAgICB7CisgICAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodWFydC0+cFJ4QnVmZlB0ciA7CisgICAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWEZUIGludGVycnVwdCovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTworICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzCisgICAgZGlzYWJsZWQgKGkuZS4gb25lIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUpLgorICAgICovCisgICAgcnhkYXRhY291bnQgPSBodWFydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKChyeGRhdGFjb3VudCAhPSAwVSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl8xNkJJVDsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3VhcnRfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX3VhcnRfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIzNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfdWFydF9leC5jCkBAIC0wLDAgKzEsNzMxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF91YXJ0X2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyBleHRlbmRlZAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgIyMjIyMgVUFSVCBwZXJpcGhlcmFsIGV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICgjKSBEZWNsYXJlIGEgVUFSVF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIFJTNDg1IERyaXZlciBFbmFibGUgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMKKyAgICAgICAgYnkgY2FsbGluZyB0aGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSS4KKworICAgICgjKSBGSUZPIG1vZGUgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBSWC9UWCBGSUZPIHRocmVzaG9sZCBwcm9ncmFtbWluZy4KKworICAgICAgICAtQC0gV2hlbiBVQVJUIG9wZXJhdGVzIGluIEZJRk8gbW9kZSwgRklGTyBtb2RlIG11c3QgYmUgZW5hYmxlZCBwcmlvcgorICAgICAgICAgICAgc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLiBBbHNvIFJYL1RYIEZJRk8gdGhyZXNob2xkcyBtdXN0IGJlCisgICAgICAgICAgICBjb25maWd1cmVkIHByaW9yIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXggVUFSVEV4CisgICogQGJyaWVmIFVBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFWF9Qcml2YXRlX0NvbnN0YW50cyBVQVJURXggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogVUFSVCBSWCBGSUZPIGRlcHRoICovCisjZGVmaW5lIFJYX0ZJRk9fREVQVEggOFUKKworLyogVUFSVCBUWCBGSUZPIGRlcHRoICovCisjZGVmaW5lIFRYX0ZJRk9fREVQVEggOFUKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVBUlRFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7CitzdGF0aWMgdm9pZCBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zICBVQVJURXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIEZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVHggb3IgdGhlIFVBUlR5CisgICAgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSB0aGUgcGFyYW1ldGVycyBiZWxvdyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgKCsrKSBCYXVkIFJhdGUKKyAgICAgICAgKCsrKSBXb3JkIExlbmd0aAorICAgICAgICAoKyspIFN0b3AgQml0CisgICAgICAgICgrKykgUGFyaXR5OiBJZiB0aGUgcGFyaXR5IGlzIGVuYWJsZWQsIHRoZW4gdGhlIE1TQiBiaXQgb2YgdGhlIGRhdGEgd3JpdHRlbgorICAgICAgICAgICAgIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAoKyspIEhhcmR3YXJlIGZsb3cgY29udHJvbAorICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisgICAgICAgICgrKykgT3ZlciBTYW1wbGluZyBNZXRob2QKKyAgICAgICAgKCsrKSBPbmUtQml0IFNhbXBsaW5nIE1ldGhvZAorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgd2VsbDoKKyAgICAgICAgKCsrKSBUWCBhbmQvb3IgUlggcGluIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIGRhdGEgbG9naWNhbCBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBSWCBhbmQgVFggcGlucyBzd2FwCisgICAgICAgICgrKykgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nCisgICAgICAgICgrKykgRE1BIGRpc2FibGluZyBvbiBSWCBlcnJvcgorICAgICAgICAoKyspIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUKKyAgICAgICAgKCsrKSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24KKyAgICBbLi5dCisgICAgVGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkgZm9sbG93cyB0aGUgVUFSVCBSUzQ4NSBtb2RlIGNvbmZpZ3VyYXRpb24KKyAgICAgcHJvY2VkdXJlcyAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgICAgVGFibGUgMS4gVUFSVCBmcmFtZSBmb3JtYXQuCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgIE0xIGJpdCB8ICBNMCBiaXQgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBVQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA4IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDcgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA4IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDcgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUlM0ODUgRHJpdmVyIGVuYWJsZSBmZWF0dXJlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gUG9sYXJpdHkgICAgICAgICBTZWxlY3QgdGhlIGRyaXZlciBlbmFibGUgcG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9ERV9QT0xBUklUWV9ISUdIIERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaAorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0xPVyAgREUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cKKyAgKiBAcGFyYW0gQXNzZXJ0aW9uVGltZSAgICBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lOgorICAqICAgICAgIDUtYml0IHZhbHVlIGRlZmluaW5nIHRoZSB0aW1lIGJldHdlZW4gdGhlIGFjdGl2YXRpb24gb2YgdGhlIERFIChEcml2ZXIgRW5hYmxlKQorICAqICAgICAgIHNpZ25hbCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhcnQgYml0LiBJdCBpcyBleHByZXNzZWQgaW4gc2FtcGxlIHRpbWUKKyAgKiAgICAgICB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUpCisgICogQHBhcmFtIERlYXNzZXJ0aW9uVGltZSAgRHJpdmVyIEVuYWJsZSBkZWFzc2VydGlvbiB0aW1lOgorICAqICAgICAgIDUtYml0IHZhbHVlIGRlZmluaW5nIHRoZSB0aW1lIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbGFzdCBzdG9wIGJpdCwgaW4gYQorICAqICAgICAgIHRyYW5zbWl0dGVkIG1lc3NhZ2UsIGFuZCB0aGUgZGUtYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlciBFbmFibGUpIHNpZ25hbC4KKyAgKiAgICAgICBJdCBpcyBleHByZXNzZWQgaW4gc2FtcGxlIHRpbWUgdW5pdHMgKDEvOCBvciAxLzE2IGJpdCB0aW1lLCBkZXBlbmRpbmcgb24gdGhlCisgICogICAgICAgb3ZlcnNhbXBsaW5nIHJhdGUpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKQoreworICB1aW50MzJfdCB0ZW1wOworCisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBVQVJUIGluc3RhbmNlICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfREVfUE9MQVJJVFkoUG9sYXJpdHkpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gdGltZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BU1NFUlRJT05USU1FKEFzc2VydGlvblRpbWUpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBkZWFzc2VydGlvbiB0aW1lICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RFQVNTRVJUSU9OVElNRShEZWFzc2VydGlvblRpbWUpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVggKi8KKyAgICBIQUxfVUFSVF9Nc3BJbml0KGh1YXJ0KTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKyAgfQorCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBTZXQgdGhlIFVBUlQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChVQVJUX1NldENvbmZpZyhodWFydCkgPT0gSEFMX0VSUk9SKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFVBUlRfQURWRkVBVFVSRV9OT19JTklUKQorICB7CisgICAgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKGh1YXJ0KTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgRHJpdmVyIEVuYWJsZSBtb2RlIGJ5IHNldHRpbmcgdGhlIERFTSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKKworICAvKiBTZXQgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RFUCwgUG9sYXJpdHkpOworCisgIC8qIFNldCB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gYW5kIGRlYXNzZXJ0aW9uIHRpbWVzICovCisgIHRlbXAgPSAoQXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyk7CisgIHRlbXAgfD0gKERlYXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyk7CisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfREVEVCB8IFVTQVJUX0NSMV9ERUFUKSwgdGVtcCk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiBFeHRlbmRlZCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIFdha2V1cCBhbmQgRklGTyBtb2RlIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zLgorCisgICAgKCMpIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBDYWxsYmFjazoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soKQorCisgICAgKCMpIFRYL1JYIEZpZm9zIENhbGxiYWNrczoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVQVJUIHdha2V1cCBmcm9tIFN0b3AgbW9kZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBSWCBGaWZvIGZ1bGwgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgVFggRmlmbyBlbXB0eSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KCkgQVBJIG9wdGlvbmFsbHkgc2V0cyB0aGUgVUFSVCBub2RlIGFkZHJlc3MKKyAgICAgICAgIGRldGVjdGlvbiBsZW5ndGggdG8gbW9yZSB0aGFuIDQgYml0cyBmb3IgbXVsdGlwcm9jZXNzb3IgYWRkcmVzcyBtYXJrIHdha2UgdXAuCisgICAgICgrKSBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCkgQVBJIGRlZmluZXMgdGhlIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUKKyAgICAgICAgIHRyaWdnZXI6IGFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORSBiaXQgc3RhdHVzLgorICAgICAoKykgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBVQVJUIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIHN0b3AgbW9kZQorICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBBUEkgZGlzYWJsZXMgdGhlIGFib3ZlIGZ1bmN0aW9uYWxpdHkKKyAgICAgKCspIEhBTF9VQVJURXhfRW5hYmxlRmlmb01vZGUoKSBBUEkgZW5hYmxlcyB0aGUgRklGTyBtb2RlCisgICAgICgrKSBIQUxfVUFSVEV4X0Rpc2FibGVGaWZvTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgRklGTyBtb2RlCisgICAgICgrKSBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBUWCBGSUZPIHRocmVzaG9sZAorICAgICAoKykgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgUlggRklGTyB0aHJlc2hvbGQKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisKKworLyoqCisgICogQGJyaWVmIEJ5IGRlZmF1bHQgaW4gbXVsdGlwcm9jZXNzb3IgbW9kZSwgd2hlbiB0aGUgd2FrZSB1cCBtZXRob2QgaXMgc2V0CisgICogICAgICAgIHRvIGFkZHJlc3MgbWFyaywgdGhlIFVBUlQgaGFuZGxlcyBvbmx5IDQtYml0IGxvbmcgYWRkcmVzc2VzIGRldGVjdGlvbjsKKyAgKiAgICAgICAgdGhpcyBBUEkgYWxsb3dzIHRvIGVuYWJsZSBsb25nZXIgYWRkcmVzc2VzIGRldGVjdGlvbiAoNi0sIDctIG9yIDgtYml0CisgICogICAgICAgIGxvbmcpLgorICAqIEBub3RlICBBZGRyZXNzZXMgZGV0ZWN0aW9uIGxlbmd0aHMgYXJlOiA2LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBpbiA3LWJpdCBkYXRhIG1vZGUsCisgICogICAgICAgIDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDgtYml0IGRhdGEgbW9kZSwgOC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gOS1iaXQgZGF0YSBtb2RlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBBZGRyZXNzTGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfNEIgNC1iaXQgbG9uZyBhZGRyZXNzCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQUREUkVTU19ERVRFQ1RfN0IgNi0sIDctIG9yIDgtYml0IGxvbmcgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIGFkZHJlc3MgbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChBZGRyZXNzTGVuZ3RoKSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERE03LCBBZGRyZXNzTGVuZ3RoKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBmbGFnIHNlbGVjdGlvbi4KKyAgKiBAbm90ZSBJdCBpcyB0aGUgYXBwbGljYXRpb24gcmVzcG9uc2liaWxpdHkgdG8gZW5hYmxlIHRoZSBpbnRlcnJ1cHQgdXNlZCBhcworICAqICAgICAgIHVzYXJ0X3drdXAgaW50ZXJydXB0IHNvdXJjZSBiZWZvcmUgZW50ZXJpbmcgbG93LXBvd2VyIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIEFkZHJlc3MgbWF0Y2gsIFN0YXJ0IEJpdCBkZXRlY3Rpb24gb3IgUlhORS9SWEZORSBiaXQgc3RhdHVzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogY2hlY2sgdGhlIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIGNoZWNrIHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQX1NFTEVDVElPTihXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSB3YWtlLXVwIHNlbGVjdGlvbiBzY2hlbWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1dVUywgV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50KTsKKworICBpZiAoV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50ID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpCisgIHsKKyAgICBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoaHVhcnQsIFdha2VVcFNlbGVjdGlvbik7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVU0FSVF9JU1JfUkVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykKKyAgeworICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgU3RhdGUgKi8KKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAgKiBAbm90ZSBUaGUgVUFSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgMSBtb2RlIGFzIGxvbmcgYXMgVUFSVCBjbG9jayBpcyBIU0kgb3IgTFNFLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogU2V0IFVFU00gYml0ICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgVUFSVCBTdG9wIE1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogQ2xlYXIgVUVTTSBiaXQgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGSUZPIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBFbmFibGUgRklGTyBtb2RlICovCisgIFNFVF9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9FTkFCTEU7CisKKyAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRklGTyBtb2RlLgorICAqIEBwYXJhbSBodWFydCAgICAgIFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVUFSVCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgQ0xFQVJfQklUKHRtcGNyMSwgVVNBUlRfQ1IxX0ZJRk9FTik7CisgIGh1YXJ0LT5GaWZvTW9kZSA9IFVBUlRfRklGT01PREVfRElTQUJMRTsKKworICAvKiBSZXN0b3JlIFVBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVFhGSUZPIHRocmVzaG9sZC4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBUWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1RYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBVcGRhdGUgVFggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsIFRocmVzaG9sZCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovCisgIFVBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVhcnQpOworCisgIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBodWFydCAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBUaHJlc2hvbGQgIFJYIEZJRk8gdGhyZXNob2xkIHZhbHVlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU2V0UnhGaWZvVGhyZXNob2xkKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1JYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBVcGRhdGUgUlggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsIFRocmVzaG9sZCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovCisgIFVBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVhcnQpOworCisgIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMgd2hlbiB0cmlnZ2VyZWQgYnkgYWRkcmVzcyBkZXRlY3Rpb24uCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pCit7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKSk7CisKKyAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsIFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELCAoKHVpbnQzMl90KVdha2VVcFNlbGVjdGlvbi5BZGRyZXNzIDw8IFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAgKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20KKyAgKiAgICAgICB0aGUgVUFSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQ4X3QgcnhfZmlmb19kZXB0aDsKKyAgdWludDhfdCB0eF9maWZvX2RlcHRoOworICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IHR4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IG51bWVyYXRvcltdID0gezFVLCAxVSwgMVUsIDNVLCA3VSwgMVUsIDBVLCAwVX07CisgIHVpbnQ4X3QgZGVub21pbmF0b3JbXSA9IHs4VSwgNFUsIDJVLCA0VSwgOFUsIDFVLCAxVSwgMVV9OworCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9ESVNBQkxFKQorICB7CisgICAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMVU7CisgICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcnhfZmlmb19kZXB0aCA9IFJYX0ZJRk9fREVQVEg7CisgICAgdHhfZmlmb19kZXB0aCA9IFRYX0ZJRk9fREVQVEg7CisgICAgcnhfZmlmb190aHJlc2hvbGQgPSAodWludDhfdCkoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHKSA+PiBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworICAgIHR4X2ZpZm9fdGhyZXNob2xkID0gKHVpbnQ4X3QpKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKKyAgICBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAoKHVpbnQxNl90KXR4X2ZpZm9fZGVwdGggKiBudW1lcmF0b3JbdHhfZmlmb190aHJlc2hvbGRdKSAvICh1aW50MTZfdClkZW5vbWluYXRvclt0eF9maWZvX3RocmVzaG9sZF07CisgICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdClyeF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3J4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbcnhfZmlmb190aHJlc2hvbGRdOworICB9Cit9CisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3VzYXJ0LmMgYi9TcmMvc3RtMzJnMHh4X2hhbF91c2FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTRhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2hhbF91c2FydC5jCkBAIC0wLDAgKzEsMzczOSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9oYWxfdXNhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVVNBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIFN5bmNocm9ub3VzL0FzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlcgorICAqICAgICAgICAgIFBlcmlwaGVyYWwgKFVTQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBVU0FSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVVNBUlRfSGFuZGxlVHlwZURlZiBodXNhcnQpLgorICAgICAgKCMpIEluaXRpYWxpemUgdGhlIFVTQVJUIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfVVNBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgICAoKyspIEVuYWJsZSB0aGUgVVNBUlR4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAoKyspIFVTQVJUIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0FSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVU0FSVCBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLgorICAgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCksCisgICAgICAgICAgICAgICAgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKSBhbmQgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVHggaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUIElSUSBoYW5kbGUuCisgICAgICAgICAgICAoKyspIFVTQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gICBUaGUgc3BlY2lmaWMgVVNBUlQgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisgICAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgICAgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKCkgYW5kIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFVTQVJUIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCwgU3RvcCBCaXQsIFBhcml0eSwgYW5kIE1vZGUKKyAgICAgICAgICAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodXNhcnQgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9VU0FSVF9Jbml0KCkgQVBJOgorICAgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VTQVJUX01zcEluaXQoJmh1c2FydCkgQVBJLgorCisgICAgWy4uXQorICAgICAoQCkgVG8gY29uZmlndXJlIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgVVNBUlQgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gc3RvcCBtb2RlLCByZXNvcnQgdG8gVUFSVCBBUEkncworICAgICAgICBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCksIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoKSBhbmQKKyAgICAgICAgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBpbiBjYXN0aW5nIHRoZSBVU0FSVCBoYW5kbGUgdG8gVUFSVCB0eXBlIFVBUlRfSGFuZGxlVHlwZURlZi4KKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICA6IFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVU0FSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVVNBUlQgTXNwRGVJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9VU0FSVF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICA6IFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVU0FSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVVNBUlQgTXNwRGVJbml0LgorCisgICAgWy4uXQorICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9VU0FSVF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9VU0FSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKSBhbmQgQHJlZiBIQUxfVVNBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VTQVJUX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfVVNBUlRfU1RBVEVfUkVBRFkgb3IgSEFMX1VTQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKQorICAgIG9yIEByZWYgSEFMX1VTQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlQgVVNBUlQKKyAgKiBAYnJpZWYgSEFMIFVTQVJUIFN5bmNocm9ub3VzIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0NvbnN0YW50cyBVU0FSVCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0RVTU1ZX0RBVEEgICAgICAgICAgKCh1aW50MTZfdCkgMHhGRkZGKSAgICAgICAgICAgLyohPCBVU0FSVCB0cmFuc21pdHRlZCBkdW1teSBkYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCAgICAgICAgICAgICAxMDAwVSAgICAgICAgICAgICAvKiE8IFVTQVJUIFRYIG9yIFJYIGVuYWJsZSBhY2tub3dsZWRnZSB0aW1lLW91dCB2YWx1ZSAqLworI2RlZmluZSBVU0FSVF9DUjFfRklFTERTICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgIFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFICB8IFVTQVJUX0NSMV9PVkVSOCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfRklGT0VOICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVU0FSVF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IyX0ZJRUxEUyAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjJfQ1BIQSB8IFVTQVJUX0NSMl9DUE9MIHwgVVNBUlRfQ1IyX0NMS0VOIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9MQkNMIHwgVVNBUlRfQ1IyX1NUT1AgfCBVU0FSVF9DUjJfU0xWRU4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0RJU19OU1MpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIENSMiBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVVNBUlRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0NSM19GSUVMRFMgICAgICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IzX1RYRlRDRkcgfCBVU0FSVF9DUjNfUlhGVENGRyApKSAgICAgICAgICAgICAvKiE8IFVTQVJUIG9yIFVTQVJUIENSMyBmaWVsZHMgb2YgcGFyYW1ldGVycyBzZXQgYnkgVVNBUlRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qIFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKyNkZWZpbmUgVVNBUlRfQlJSX01BWCAgICAweEZGRkZVICAgICAgLyogVVNBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVVNBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc2ZlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1NldENvbmZpZyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl84QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl8xNkJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfOEJJVF9GSUZPRU4oVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfRW5kVHJhbnNtaXRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzhCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9SeElTUl84QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfMTZCSVRfRklGT0VOKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVAorICAgIGluIGFzeW5jaHJvbm91cyBhbmQgaW4gc3luY2hyb25vdXMgbW9kZXMuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSBvbmx5IHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBVU0FSVCBwb2xhcml0eQorICAgICAgICAoKyspIFVTQVJUIHBoYXNlCisgICAgICAgICgrKykgVVNBUlQgTGFzdEJpdAorICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisKKyAgICBbLi5dCisgICAgVGhlIEhBTF9VU0FSVF9Jbml0KCkgZnVuY3Rpb24gZm9sbG93cyB0aGUgVVNBUlQgIHN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24KKyAgICBwcm9jZWR1cmUgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmUgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVU0FSVCBmb3JtYXRzIGFyZSBsaXN0ZWQgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZS4KKworICAgIFRhYmxlIDEuIFVTQVJUIGZyYW1lIGZvcm1hdC4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgTTEgYml0IHwgIE0wIGJpdCB8ICBQQ0UgYml0ICB8ICAgICAgICAgICAgVVNBUlQgZnJhbWUgICAgICAgICAgICAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDggYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNyBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA5IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgNyBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA2IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVVNBUlRfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9Jbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVTQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodXNhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodXNhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBVU0FSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1c2FydCk7CisKKyAgICBpZiAoaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VTQVJUX01zcEluaXQoaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIFNldCB0aGUgVXNhcnQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChVU0FSVF9TZXRDb25maWcoaHVzYXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyCisgIC0gSERTRUwsIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMiAmPSB+VVNBUlRfQ1IyX0xJTkVOOworICBodXNhcnQtPkluc3RhbmNlLT5DUjMgJj0gfihVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVVNBUlRfRU5BQkxFKGh1c2FydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVTQVJUX0NoZWNrSWRsZVN0YXRlKGh1c2FydCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBVU0FSVCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9EZUluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBDaGVjayB0aGUgVVNBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1c2FydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZOworCisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMSA9IDB4MFU7CisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMiA9IDB4MFU7CisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMyA9IDB4MFU7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9VU0FSVF9Nc3BEZUluaXQoaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVTQVJUIE1TUC4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9Nc3BJbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJUX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVTQVJUIE1TUC4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9Nc3BEZUluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVU0FSVCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh1c2FydCB1c2FydCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisrICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCBIQUxfVVNBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFVTQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhGaWZvRnVsbENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFVBUlQgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFVBUlQgY2FsbGFiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHVzYXJ0IHVhcnQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1VuUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmIChIQUxfVVNBUlRfU1RBVEVfUkVBRFkgPT0gaHVzYXJ0LT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPkVycm9yQ2FsbGJhY2sgPSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgPSBIQUxfVVNBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgPSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VTQVJUX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VTQVJUX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfVVNBUlRfU1RBVEVfUkVTRVQgPT0gaHVzYXJ0LT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgIFVTQVJUIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBVU0FSVCBzeW5jaHJvbm91cworICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgWy4uXSBUaGUgVVNBUlQgc3VwcG9ydHMgbWFzdGVyIG1vZGUgb25seTogaXQgY2Fubm90IHJlY2VpdmUgb3Igc2VuZCBkYXRhIHJlbGF0ZWQgdG8gYW4gaW5wdXQKKyAgICAgICAgIGNsb2NrIChTQ0xLIGlzIGFsd2F5cyBhbiBvdXRwdXQpLgorCisgICAgWy4uXQorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICAgb3IgRE1BLCBUaGVzZSBBUEkncyByZXR1cm4gdGhlIEhBTCBzdGF0dXMuCisgICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICAgZGVkaWNhdGVkIFVTQVJUIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjaygpIGFuZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzCisgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgICAgVGhlIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0KCkgaW4gc2ltcGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX1JlY2VpdmUoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlKCkgaW4gZnVsbCBkdXBsZXggbW9kZQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIEFQSSdzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkgaW4gc2ltcGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKCkgaW4gZnVsbCBkdXBsZXggbW9kZQorICAgICAgICAoKyspIEhBTF9VU0FSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOby1CbG9ja2luZyBtb2RlIEFQSSdzICB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSBpbiBmdWxsIGR1cGxleCByZWNlaXZlIG9ubHkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0RNQSgpIGluIGZ1bGwgZHVwbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFSZXN1bWUoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soKQorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycyBjb3VsZCBiZSBhYm9ydGVkIHVzaW5nIEFib3J0IEFQSSdzIDoKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfQWJvcnQoKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydF9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VU0FSVF9BYm9ydF9JVCksIGEgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGlzIHByb3ZpZGVkOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpCisKKyAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgorICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICAgUmVjZWl2ZWQgY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsCisgICAgICAgICAgICAgYW5kIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFVTQVJUIHNpZGUuCisgICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICAoKyspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICAgIFRoaXMgY29uY2VybnMgT3ZlcnJ1biBFcnJvciBJbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCisgICAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwVHhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwdHhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwdHhkYXRhMTZiaXRzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFR4RGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgZmlsbGVkIGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcFR4RGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwdHhkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHB0eGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcFR4RGF0YTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHB0eGRhdGE4Yml0cyAgPSBwVHhEYXRhOworICAgICAgcHR4ZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQgKi8KKyAgICB3aGlsZSAoaHVzYXJ0LT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHB0eGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHB0eGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdHhkYXRhOGJpdHMgJiAweEZGVSk7CisgICAgICAgIHB0eGRhdGE4Yml0cysrOworICAgICAgfQorCisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIENsZWFyIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBGbGFnICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBDbGVhciBvdmVycnVuIGZsYWcgYW5kIGRpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgICBfX0hBTF9VU0FSVF9DTEVBUl9PUkVGTEFHKGh1c2FydCk7CisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBBdCBlbmQgb2YgVHggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgVG8gcmVjZWl2ZSBzeW5jaHJvbm91cyBkYXRhLCBkdW1teSBkYXRhIGFyZSBzaW11bHRhbmVvdXNseSB0cmFuc21pdHRlZC4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGZvciBzdG9yaW5nIGRhdGEgdG8gYmUgcmVjZWl2ZWQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHJlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIHVzaW5nIHUxNiBwb2ludGVyIGNhc3QpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFJ4RGF0YS4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcFJ4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQ4X3QgICpwcnhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwcnhkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIGJ1ZmZlciBwcm92aWRlZCBhcyBpbnB1dCBwYXJhbWV0ZXIKKyAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIHUxNiBmcm9udGllciwgYXMgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworICAgIHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcHJ4ZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwcnhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBSeERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcnhkYXRhOGJpdHMgID0gcFJ4RGF0YTsKKyAgICAgIHByeGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFzIGxvbmcgYXMgZGF0YSBoYXZlIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGh1c2FydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBpZiAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKKyAgICAgICAgKiBjbG9jayBmb3IgdGhlIHNsYXZlIHRvIHNlbmQgZGF0YS4KKyAgICAgICAgKiBXaGF0ZXZlciB0aGUgZnJhbWUgbGVuZ3RoICg3LCA4IG9yIDktYml0IGxvbmcpLCB0aGUgc2FtZSBkdW1teSB2YWx1ZQorICAgICAgICAqIGNhbiBiZSB3cml0dGVuIGZvciBhbGwgdGhlIGNhc2VzLiAqLworICAgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwRkYpOworICAgICAgfQorCisgICAgICAvKiBXYWl0IGZvciBSWE5FIEZsYWcgKi8KKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKworICAgICAgaWYgKHByeGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICAqcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgcHJ4ZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcHJ4ZGF0YThiaXRzID0gKHVpbnQ4X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KSh1aE1hc2sgJiAweEZGVSkpOworICAgICAgICBwcnhkYXRhOGJpdHMrKzsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgfQorCisgICAgLyogQ2xlYXIgU1BJIHNsYXZlIHVuZGVycnVuIGZsYWcgYW5kIGRpc2NhcmQgdHJhbnNtaXQgZGF0YSAqLworICAgIGlmIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX1VEUkZMQUcoaHVzYXJ0KTsKKyAgICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEZ1bGwtRHVwbGV4IFNlbmQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVycyBjb250YWluaW5nIGRhdGEgdG8gYmUgc2VudC9yZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgc2VudC9yZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBUeERhdGEgYW5kIHBSeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IChzYW1lIGFtb3VudCB0byBiZSByZWNlaXZlZCkuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnByeGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnByeGRhdGExNmJpdHM7CisgIHVpbnQ4X3QgICpwdHhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwdHhkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQxNl90IHJ4ZGF0YWNvdW50OworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFR4RGF0YSBhbmQgcFJ4RGF0YSBidWZmZXJzIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIGZpbGxlZCBpbnRvIFREUi9yZXRyaWV2ZWQgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgdGhyb3VnaCBhIHUxNiBjYXN0LiAqLworICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIGlmICgoKCgodWludDMyX3QpcFR4RGF0YSkgJiAxVSkgIT0gMFUpIHx8ICgoKCh1aW50MzJfdClwUnhEYXRhKSAmIDFVKSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oaHVzYXJ0KTsKKyAgICB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHByeGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcHR4ZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwdHhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBUeERhdGE7CisgICAgICBwcnhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBSeERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcnhkYXRhOGJpdHMgID0gcFJ4RGF0YTsKKyAgICAgIHB0eGRhdGE4Yml0cyAgPSBwVHhEYXRhOworICAgICAgcHR4ZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgICBwcnhkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMHgwMVUpIHx8IChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHB0eGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgdWhNYXNrKTsKKyAgICAgICAgcHR4ZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKnB0eGRhdGE4Yml0cyAmICh1aW50OF90KSh1aE1hc2sgJiAweEZGVSkpOworICAgICAgICBwdHhkYXRhOGJpdHMrKzsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5UeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIENoZWNrIHRoZSByZW1haW4gZGF0YSB0byBiZSBzZW50ICovCisgICAgLyogcnhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgcnhkYXRhY291bnQgPSBodXNhcnQtPlJ4WGZlckNvdW50OworICAgIHdoaWxlICgoaHVzYXJ0LT5UeFhmZXJDb3VudCA+IDBVKSB8fCAocnhkYXRhY291bnQgPiAwVSkpCisgICAgeworICAgICAgaWYgKGh1c2FydC0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHR4ZGF0YThiaXRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgdWhNYXNrKTsKKyAgICAgICAgICBwdHhkYXRhMTZiaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdHhkYXRhOGJpdHMgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgICBwdHhkYXRhOGJpdHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKworICAgICAgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgUlhORSBGbGFnICovCisgICAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJ4ZGF0YThiaXRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAqcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgICBwcnhkYXRhMTZiaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKnByeGRhdGE4Yml0cyA9ICh1aW50OF90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgICBwcnhkYXRhOGJpdHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIHJ4ZGF0YWNvdW50ID0gaHVzYXJ0LT5SeFhmZXJDb3VudDsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgVHhSeCBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRvIGJlIHNlbnQsIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgaGFsZiB3b3JkIGZyb250aWVyICgxNiBiaXRzKQorICAqICAgICAgICAgKGFzIHNlbnQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdTE2IHBvaW50ZXIgY2FzdCkuIERlcGVuZGluZyBvbiBjb21waWxhdGlvbiBjaGFpbiwKKyAgKiAgICAgICAgIHVzZSBvZiBzcGVjaWZpYyBhbGlnbm1lbnQgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBvciBwcmFnbWFzIG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IGZvciBwVHhEYXRhLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFR4RGF0YSBidWZmZXIgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgZmlsbGVkIGludG8gVERSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcFR4RGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyICA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5UeElTUiAgICAgICA9IE5VTEw7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgICAgID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBUaGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0czogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgICBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIFVTQVJUIFRyYW5zbWl0IFByb2Nlc3MgdG8gYXZvaWQgdGhlIG92ZXJydW4gaW50ZXJydXB0CisgICAgd2hlbiB0aGUgdXNhcnQgbW9kZSBpcyBjb25maWd1cmVkIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSAiVVNBUlRfTU9ERV9UWF9SWCIKKyAgICB0byBiZW5lZml0IGZvciB0aGUgZnJhbWUgZXJyb3IgYW5kIG5vaXNlIGludGVycnVwdHMgdGhlIHVzYXJ0IG1vZGUgc2hvdWxkIGJlCisgICAgY29uZmlndXJlZCBvbmx5IGZvciB0cmFuc21pdCAiVVNBUlRfTU9ERV9UWCIgKi8KKworICAgIC8qIENvbmZpZ3VyZSBUeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmIChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl8xNkJJVF9GSUZPRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl84QklUX0ZJRk9FTjsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UWEZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzE2QklUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodXNhcnQtPlR4SVNSID0gVVNBUlRfVHhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgIFRvIHJlY2VpdmUgc3luY2hyb25vdXMgZGF0YSwgZHVtbXkgZGF0YSBhcmUgc2ltdWx0YW5lb3VzbHkgdHJhbnNtaXR0ZWQuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIGFkZHJlc3Mgb2YgdXNlciBkYXRhIGJ1ZmZlciBmb3Igc3RvcmluZyBkYXRhIHRvIGJlIHJlY2VpdmVkLCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyByZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBSeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDE2X3QgbmJfZHVtbXlfZGF0YTsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIHRvIGJlIHJlY2VpdmVkIGZyb20gUkRSIHdpbGwgYmUKKyAgICAgICBoYW5kbGVkIHRocm91Z2ggYSB1MTYgY2FzdC4gKi8KKyAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBpZiAoKCgodWludDMyX3QpcFJ4RGF0YSkgJiAxVSkgIT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyICA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5SeElTUiAgICAgICA9IE5VTEw7CisKKyAgICBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKGh1c2FydCk7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIENvbmZpZ3VyZSBSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmICgoaHVzYXJ0LT5GaWZvTW9kZSA9PSBVU0FSVF9GSUZPTU9ERV9FTkFCTEUpICYmIChTaXplID49IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzE2QklUX0ZJRk9FTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzhCSVRfRklGT0VOOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl8xNkJJVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzhCSVQ7CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisKKyAgICBpZiAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpCisgICAgeworICAgICAgLyogU2VuZCBkdW1teSBkYXRhIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIHNlbmQgdGhlIG5leHQgZGF0YS4KKyAgICAgICAgIFdoZW4gRklGTyBtb2RlIGlzIGRpc2FibGVkIG9ubHkgb25lIGRhdGEgbXVzdCBiZSB0cmFuc2ZlcnJlZC4KKyAgICAgICAgIFdoZW4gRklGTyBtb2RlIGlzIGVuYWJsZWQgZGF0YSBtdXN0IGJlIHRyYW5zbWl0dGVkIHVudGlsIHRoZSBSWCBGSUZPIHJlYWNoZXMgaXRzIHRocmVzaG9sZC4KKyAgICAgICovCisgICAgICBpZiAoKGh1c2FydC0+Rmlmb01vZGUgPT0gVVNBUlRfRklGT01PREVfRU5BQkxFKSAmJiAoU2l6ZSA+PSBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICAgIHsKKyAgICAgICAgZm9yIChuYl9kdW1teV9kYXRhID0gaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX2R1bW15X2RhdGEgPiAwVSA7IG5iX2R1bW15X2RhdGEtLSkKKyAgICAgICAgeworICAgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwMEZGKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRnVsbC1EdXBsZXggU2VuZCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVycyBjb250YWluaW5nIGRhdGEgdG8gYmUgc2VudC9yZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgc2VudC9yZWNlaXZlZCBkYXRhIHdpbGwgYmUgaGFuZGxlZCB1c2luZyB1MTYgcG9pbnRlciBjYXN0KS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBUeERhdGEgYW5kIHBSeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IChzYW1lIGFtb3VudCB0byBiZSByZWNlaXZlZCkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgIHVpbnQxNl90IFNpemUpCit7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwVHhEYXRhIGFuZCBwUnhEYXRhIGJ1ZmZlcnMgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgdG8gYmUgZmlsbGVkIGludG8gVERSL3JldHJpZXZlZCBmcm9tIFJEUiB3aWxsIGJlCisgICAgICAgaGFuZGxlZCB0aHJvdWdoIGEgdTE2IGNhc3QuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKCh1aW50MzJfdClwVHhEYXRhKSAmIDFVKSAhPSAwVSkgfHwgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyID0gcFR4RGF0YTsKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVVNBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKGh1c2FydCk7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWDsKKworICAgIC8qIENvbmZpZ3VyZSBUeFJ4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgaWYgKChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkgJiYgKFNpemUgPj0gaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpCisgICAgeworICAgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodXNhcnQtPlR4SVNSID0gVVNBUlRfVHhJU1JfMTZCSVRfRklGT0VOOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfMTZCSVRfRklGT0VOOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodXNhcnQtPlR4SVNSID0gVVNBUlRfVHhJU1JfOEJJVF9GSUZPRU47CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl84QklUX0ZJRk9FTjsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0ICAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUWCBhbmQgIFJYIEZJRk8gVGhyZXNob2xkIGludGVycnVwdHMgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1RYRlRJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodXNhcnQtPlR4SVNSID0gVVNBUlRfVHhJU1JfMTZCSVQ7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl8xNkJJVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzhCSVQ7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl84QklUOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBhbmQgVVNBUlQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgYWRkcmVzcyBvZiB1c2VyIGRhdGEgYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSB0byBiZSBzZW50LCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyBzZW50IGRhdGEgd2lsbCBiZSBoYW5kbGVkIGJ5IERNQSBmcm9tIGhhbGZ3b3JkIGZyb250aWVyKS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBUeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgKnRtcDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBUeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgaW50byBURFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBUeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwVHhEYXRhOworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCAqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9UQ0YpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpLCB0aGUgcmVjZWl2ZWQgZGF0YSBjb250YWluCisgICogICAgICAgICB0aGUgcGFyaXR5IGJpdCAoTVNCIHBvc2l0aW9uKS4KKyAgKiBAbm90ZSBUaGUgVVNBUlQgRE1BIHRyYW5zbWl0IGNoYW5uZWwgbXVzdCBiZSBjb25maWd1cmVkIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIHNsYXZlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXIgZm9yIHN0b3JpbmcgZGF0YSB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBoYWxmIHdvcmQgZnJvbnRpZXIgKDE2IGJpdHMpCisgICogICAgICAgICAoYXMgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIGhhbmRsZWQgYnkgRE1BIGZyb20gaGFsZndvcmQgZnJvbnRpZXIpLiBEZXBlbmRpbmcgb24gY29tcGlsYXRpb24gY2hhaW4sCisgICogICAgICAgICB1c2Ugb2Ygc3BlY2lmaWMgYWxpZ25tZW50IGNvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgb3IgcHJhZ21hcyBtaWdodCBiZSByZXF1aXJlZCB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBmb3IgcFJ4RGF0YS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCAqdG1wID0gKHVpbnQzMl90ICopJnBSeERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogSW4gY2FzZSBvZiA5Yml0cy9ObyBQYXJpdHkgdHJhbnNmZXIsIHBSeERhdGEgYnVmZmVyIHByb3ZpZGVkIGFzIGlucHV0IHBhcmFtZXRlcgorICAgICAgIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgdTE2IGZyb250aWVyLCBhcyBkYXRhIGNvcHkgZnJvbSBSRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBSeCB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgcmVjZWl2ZSBETUEgY2hhbm5lbCAqLworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QgKil0bXAsIFNpemUpOworICAgIH0KKworICAgIGlmICgoc3RhdHVzID09IEhBTF9PSykgJiYKKyAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsOiB0aGUgdHJhbnNtaXQgY2hhbm5lbCBpcyB1c2VkIGluIG9yZGVyCisgICAgICAgICB0byBnZW5lcmF0ZSBpbiB0aGUgbm9uLWJsb2NraW5nIG1vZGUgdGhlIGNsb2NrIHRvIHRoZSBzbGF2ZSBkZXZpY2UsCisgICAgICAgICB0aGlzIG1vZGUgaXNuJ3QgYSBzaW1wbGV4IHJlY2VpdmUgbW9kZSBidXQgYSBmdWxsLWR1cGxleCByZWNlaXZlIG1vZGUgKi8KKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgVHggQ29tcGxldGUgYW5kIEVycm9yIGNhbGxiYWNrIHRvIE51bGwgKi8KKyAgICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hdHgsICoodWludDMyX3QgKil0bXAsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXJ4KTsKKyAgICAgIH0KKworICAgICAgLyogTm8gbmVlZCB0byBjaGVjayBvbiBlcnJvciBjb2RlICovCisgICAgICBVTlVTRUQoc3RhdHVzKTsKKworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRnVsbC1EdXBsZXggVHJhbnNtaXQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIFVTQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSB0aGUgZGF0YSByZWNlaXZlZCBjb250YWluIHRoZSBwYXJpdHkgYml0LgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICBhZGRyZXNzIG9mIHVzZXIgZGF0YSBidWZmZXJzIGNvbnRhaW5pbmcgZGF0YSB0byBiZSBzZW50L3JlY2VpdmVkLCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIGhhbGYgd29yZCBmcm9udGllciAoMTYgYml0cykKKyAgKiAgICAgICAgIChhcyBzZW50L3JlY2VpdmVkIGRhdGEgd2lsbCBiZSBoYW5kbGVkIGJ5IERNQSBmcm9tIGhhbGZ3b3JkIGZyb250aWVyKS4gRGVwZW5kaW5nIG9uIGNvbXBpbGF0aW9uIGNoYWluLAorICAqICAgICAgICAgdXNlIG9mIHNwZWNpZmljIGFsaWdubWVudCBjb21waWxhdGlvbiBkaXJlY3RpdmVzIG9yIHByYWdtYXMgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZW5zdXJlIHByb3BlciBhbGlnbm1lbnQgZm9yIHBUeERhdGEgYW5kIHBSeERhdGEuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC9zZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90ICp0bXA7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwVHhEYXRhIGFuZCBwUnhEYXRhIGJ1ZmZlcnMgcHJvdmlkZWQgYXMgaW5wdXQgcGFyYW1ldGVyCisgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgb24gYSB1MTYgZnJvbnRpZXIsIGFzIGRhdGEgY29weSB0by9mcm9tIFREUi9SRFIgd2lsbCBiZQorICAgICAgIGhhbmRsZWQgYnkgRE1BIGZyb20gYSB1MTYgZnJvbnRpZXIuICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgaWYgKCgoKCh1aW50MzJfdClwVHhEYXRhKSAmIDFVKSAhPSAwVSkgfHwgKCgoKHVpbnQzMl90KXBSeERhdGEpICYgMVUpICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyID0gcFR4RGF0YTsKKyAgICBodXNhcnQtPlR4WGZlclNpemUgPSBTaXplOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlg7CisKKyAgICBpZiAoKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpICYmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBSeCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSZWNlaXZlQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BUnhIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgVHggdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVU0FSVF9ETUFFcnJvcjsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCByZWNlaXZlIERNQSBjaGFubmVsICovCisgICAgICB0bXAgPSAodWludDMyX3QgKikmcFJ4RGF0YTsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hcngsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+UkRSLCAqKHVpbnQzMl90ICopdG1wLCBTaXplKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCB0cmFuc21pdCBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwVHhEYXRhOworICAgICAgICBzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGh1c2FydC0+aGRtYXR4LCAqKHVpbnQzMl90ICopdG1wLCAodWludDMyX3QpJmh1c2FydC0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9UQ0YpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpOworICAgICAgfQorCisgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIG9uIGVycm9yIGNvZGUgKi8KKyAgICAgIFVOVVNFRChzdGF0dXMpOworCisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFQYXVzZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICAgIH0KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUmVzdW1lKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYpOworCisgICAgLyogUmVlbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBSeCByZXF1ZXN0ICBiZWZvcmUgdGhlIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BU3RvcChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVVNBUlQgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSAvIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayAvIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2s6CisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlCisgICAgIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgdGhlIERNQSB0cmFuc2ZlciBpbnRlcnJ1cHRpb24gb2NjdXJzIGF0IHRoZSBtaWRkbGUgb3IgYXQgdGhlIGVuZCBvZgorICAgICB0aGUgc3RyZWFtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQuICovCisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgVHgvUnggRE1BIHJlcXVlc3RzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgdHggY2hhbm5lbCAqLworICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVzYXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgcnggY2hhbm5lbCAqLworICBpZiAoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVzYXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVVNBUlRfRW5kVHJhbnNmZXIoaHVzYXJ0KTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVTQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBEaXNhYmxlIFRYRUlFLCBUQ0lFLCBSWE5FLCBSWEZULCBUWEZULCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1c2FydC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVzYXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRiB8IFVTQVJUX0NMRUFSX05FRiB8IFVTQVJUX0NMRUFSX1BFRiB8IFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1c2FydC0+Rmlmb01vZGUgPT0gVVNBUlRfRklGT01PREVfRU5BQkxFKQorICB7CisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KKworICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICBodXNhcnQtPlN0YXRlICA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBIYW5kbGUgRXJyb3JDb2RlIHRvIE5vIEVycm9yICovCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVVNBUlQgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgYWJvcnRjcGx0ID0gMVU7CisKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUlhGVCwgVFhGVCwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX1RYRlRJRSkpOworCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gVVNBUlQgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZAorICAgICBiZWZvcmUgYW55IGNhbGwgdG8gRE1BIEFib3J0IGZ1bmN0aW9ucyAqLworICAvKiBETUEgVHggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVU0FSVCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVTQVJUX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVU0FSVCBsZXZlbCAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogVVNBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogVVNBUlQgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRiB8IFVTQVJUX0NMRUFSX05FRiB8IFVTQVJUX0NMRUFSX1BFRiB8IFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLworICAgIGlmIChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlICA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVVNBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVVNBUlRfSVJRSGFuZGxlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBjcjFpdHMgICAgID0gUkVBRF9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzICAgICA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMyk7CisKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKyAgdWludDMyX3QgZXJyb3Jjb2RlOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FIHwgVVNBUlRfSVNSX1VEUikpOworICBpZiAoZXJyb3JmbGFncyA9PSAwVSkKKyAgeworICAgIC8qIFVTQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkKKyAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpKSkKKyAgICB7CisgICAgICBpZiAoaHVzYXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPlJ4SVNSKGh1c2FydCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgaWYgKChlcnJvcmZsYWdzICE9IDBVKQorICAgICAgJiYgKCgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSAwVSkpKQorICB7CisgICAgLyogVVNBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX1BFRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfSVQoaHVzYXJ0LCBVU0FSVF9DTEVBUl9GRUYpOworCisgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfRkU7CisgICAgfQorCisgICAgLyogVVNBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfTkVGKTsKKworICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX05FOworICAgIH0KKworICAgIC8qIFVTQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkgfHwKKyAgICAgICAgICAgICgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYpOworCisgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIFVTQVJUIFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVURSKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgLyogSWdub3JlIFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvcnMgd2hlbiByZWNlcHRpb24gaXMgZ29pbmcgb24gKi8KKyAgICAgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgICAgeworICAgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfVURSRkxBRyhodXNhcnQpOworICAgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfVURSOworICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGwgVVNBUlQgRXJyb3IgQ2FsbCBiYWNrIGZ1bmN0aW9uIGlmIG5lZWQgYmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChodXNhcnQtPkVycm9yQ29kZSAhPSBIQUxfVVNBUlRfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBVU0FSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSAhPSAwVSkKKyAgICAgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpICE9IDBVKQorICAgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpCisgICAgICB7CisgICAgICAgIGlmIChodXNhcnQtPlJ4SVNSICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPlJ4SVNSKGh1c2FydCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAorICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIGVycm9yY29kZSA9IGh1c2FydC0+RXJyb3JDb2RlICYgSEFMX1VTQVJUX0VSUk9SX09SRTsKKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHx8CisgICAgICAgICAgKGVycm9yY29kZSAhPSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAorICAgICAgICAgICBTZXQgdGhlIFVTQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgSW50ZXJydXB0cywgYW5kIGRpc2FibGUgRE1BIHJlcXVlc3RzLCBpZiBvbmdvaW5nICovCisgICAgICAgIFVTQVJUX0VuZFRyYW5zZmVyKGh1c2FydCk7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUiB8IFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgVVNBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIHRvIE5VTEwgOiBubyBjYWxsYmFjaworICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWF0eCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBVU0FSVCBSeCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVVNBUlRfRE1BQWJvcnRPbkVycm9yOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1c2FydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1c2FydC0+aGRtYXJ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgICBodXNhcnQtPkVycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBDYWxsYmFjayAqLworICAgICAgICAgIGh1c2FydC0+RXJyb3JDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgICAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKworICAvKiBVU0FSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpCisgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfVFhGVElFKSAhPSAwVSkpKQorICB7CisgICAgaWYgKGh1c2FydC0+VHhJU1IgIT0gTlVMTCkKKyAgICB7CisgICAgICBodXNhcnQtPlR4SVNSKGh1c2FydCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVTQVJUIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVEMpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UQ0lFKSAhPSAwVSkpCisgIHsKKyAgICBVU0FSVF9FbmRUcmFuc21pdF9JVChodXNhcnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVTQVJUIFRYIEZpZm8gRW1wdHkgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRkUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UWEZFSUUpICE9IDBVKSkKKyAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgaHVzYXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICAgIEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVTQVJUIFJYIEZpZm8gRnVsbCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhGRikgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYRkZJRSkgIT0gMFUpKQorICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIGh1c2FydC0+UnhGaWZvRnVsbENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggRmlmbyBGdWxsIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFR4L1J4IFRyYW5zZmVycyBjb21wbGV0ZWQgY2FsbGJhY2sgZm9yIHRoZSBub24tYmxvY2tpbmcgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBVU0FSVCBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBVU0FSVCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgorICAgICAgKCspIFJldHVybiB0aGUgVVNBUlQgaGFuZGxlIHN0YXRlCisgICAgICAoKykgUmV0dXJuIHRoZSBVU0FSVCBoYW5kbGUgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gdGhlIFVTQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gaHVzYXJ0IHBvaW50ZXIgdG8gYSBVU0FSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJULgorICAqIEByZXR2YWwgVVNBUlQgaGFuZGxlIHN0YXRlCisgICovCitIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIEhBTF9VU0FSVF9HZXRTdGF0ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHJldHVybiBodXNhcnQtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBVU0FSVCBlcnJvciBjb2RlLgorICAqIEBwYXJhbSBodXNhcnQgcG9pbnRlciB0byBhIFVTQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQuCisgICogQHJldHZhbCBVU0FSVCBoYW5kbGUgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX1VTQVJUX0dldEVycm9yKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgcmV0dXJuIGh1c2FydC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVTQVJUIFByaXZhdGUgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2tzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVVNBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIEluaXQgdGhlIFVTQVJUIENhbGxiYWNrIHNldHRpbmdzICovCisgIGh1c2FydC0+VHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh1c2FydC0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1c2FydC0+UnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayAgICAgICAgICA9IEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICovCisgIGh1c2FydC0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgIGh1c2FydC0+QWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGh1c2FydC0+UnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA9IEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovCisgIGh1c2FydC0+VHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA9IEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICovCit9CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyB0cmFuc2ZlciBvbiBVU0FSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFRyYW5zZmVyIGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0VuZFRyYW5zZmVyKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUlhGVCwgVFhGVCwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX1RYRlRJRSkpOworCisgIC8qIEF0IGVuZCBvZiBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKK30KKworLyoqCisgICogQGJyaWVmIERNQSBVU0FSVCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICB9CisgIC8qIERNQSBDaXJjdWxhciBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKQorICAgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5UeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgVVNBUlQgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLworICBodXNhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVTQVJUIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIFJYIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSByZXNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgaW4gVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICAgIC8qIHNpbWlsYXJseSwgZGlzYWJsZSB0aGUgRE1BIFRYIHRyYW5zZmVyIHRoYXQgd2FzIHN0YXJ0ZWQgdG8gcHJvdmlkZSB0aGUKKyAgICAgICBjbG9jayB0byB0aGUgc2xhdmUgZGV2aWNlICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgLyogVGhlIFVTQVJUIHN0YXRlIGlzIEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYICovCisgICAgZWxzZQorICAgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICB9CisgIC8qIERNQSBjaXJjdWxhciBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIC8qIFRoZSBVU0FSVCBzdGF0ZSBpcyBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCAqLworICAgIGVsc2UKKyAgICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVU0FSVCByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVU0FSVCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIFVTQVJUX0VuZFRyYW5zZmVyKGh1c2FydCk7CisKKyAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgVVNBUlQgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIENhbGxiYWNrICovCisgIGh1c2FydC0+RXJyb3JDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVTQVJUIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYgKGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgVVNBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfT1JFRiB8IFVTQVJUX0NMRUFSX05FRiB8IFVTQVJUX0NMRUFSX1BFRiB8IFVTQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIGh1c2FydC0+U3RhdGUgID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFVTQVJUIENvbW11bmljYXRpb24gVGltZW91dC4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgVVNBUlQgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyB0aGUgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCB0aW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoX19IQUxfVVNBUlRfR0VUX0ZMQUcoaHVzYXJ0LCBGbGFnKSA/IFNFVCA6IFJFU0VUKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBVU0FSVCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1NldENvbmZpZyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgVVNBUlRfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgICAgICAgICAgICAgICAgPSBIQUxfT0s7CisgIHVpbnQxNl90IGJycnRlbXA7CisgIHVpbnQzMl90IHVzYXJ0ZGl2ICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BPTEFSSVRZKGh1c2FydC0+SW5pdC5DTEtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUEhBU0UoaHVzYXJ0LT5Jbml0LkNMS1BoYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9MQVNUQklUKGh1c2FydC0+SW5pdC5DTEtMYXN0Qml0KSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9CQVVEUkFURShodXNhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1dPUkRfTEVOR1RIKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9TVE9QQklUUyhodXNhcnQtPkluaXQuU3RvcEJpdHMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BBUklUWShodXNhcnQtPkluaXQuUGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9NT0RFKGh1c2FydC0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QUkVTQ0FMRVIoaHVzYXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENsZWFyIE0sIFBDRSwgUFMsIFRFIGFuZCBSRSBiaXRzIGFuZCBjb25maWd1cmUKKyAgKiAgdGhlIFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIE1vZGU6CisgICogIHNldCB0aGUgTSBiaXRzIGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAqICBzZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuUGFyaXR5IHZhbHVlCisgICogIHNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0Lk1vZGUgdmFsdWUKKyAgKiAgZm9yY2UgT1ZFUjggdG8gMSB0byBhbGxvdyB0byByZWFjaCB0aGUgbWF4aW11bSBzcGVlZCAoRmNsb2NrLzgpICovCisgIHRtcHJlZyA9ICh1aW50MzJfdClodXNhcnQtPkluaXQuV29yZExlbmd0aCB8IGh1c2FydC0+SW5pdC5QYXJpdHkgfCBodXNhcnQtPkluaXQuTW9kZSB8IFVTQVJUX0NSMV9PVkVSODsKKyAgTU9ESUZZX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9GSUVMRFMsIHRtcHJlZyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENsZWFyIGFuZCBjb25maWd1cmUgdGhlIFVTQVJUIENsb2NrLCBDUE9MLCBDUEhBLCBMQkNMIFNUT1AgYW5kIFNMVkVOIGJpdHM6CisgICAqIHNldCBDUE9MIGJpdCBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LkNMS1BvbGFyaXR5IHZhbHVlCisgICAqIHNldCBDUEhBIGJpdCBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LkNMS1BoYXNlIHZhbHVlCisgICAqIHNldCBMQkNMIGJpdCBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LkNMS0xhc3RCaXQgdmFsdWUgKHVzZWQgaW4gU1BJIG1hc3RlciBtb2RlIG9ubHkpCisgICAqIHNldCBTVE9QWzEzOjEyXSBiaXRzIGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuU3RvcEJpdHMgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KShVU0FSVF9DTE9DS19FTkFCTEUpOworICB0bXByZWcgfD0gKHVpbnQzMl90KWh1c2FydC0+SW5pdC5DTEtMYXN0Qml0OworICB0bXByZWcgfD0gKCh1aW50MzJfdClodXNhcnQtPkluaXQuQ0xLUG9sYXJpdHkgfCAodWludDMyX3QpaHVzYXJ0LT5Jbml0LkNMS1BoYXNlKTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdClodXNhcnQtPkluaXQuU3RvcEJpdHM7CisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZQorICAgKiAtIFVTQVJUIENsb2NrIFByZXNjYWxlciA6IHNldCBQUkVTQ0FMRVIgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGh1c2FydC0+SW5zdGFuY2UtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsIGh1c2FydC0+SW5pdC5DbG9ja1ByZXNjYWxlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIEJSUiBpcyBmaWxsZWQtdXAgYWNjb3JkaW5nIHRvIE9WRVI4IGJpdCBzZXR0aW5nIHdoaWNoIGlzIGZvcmNlZCB0byAxICAgICAqLworICBVU0FSVF9HRVRDTE9DS1NPVVJDRShodXNhcnQsIGNsb2Nrc291cmNlKTsKKworICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICB7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KEhBTF9SQ0NfR2V0UENMSzFGcmVxKCksIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSwgaHVzYXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0hTSToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KEhTSV9WQUxVRSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLCBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgorICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLCBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoKHVpbnQzMl90KUxTRV9WQUxVRSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLCBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgYW5kIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBmZmZmICovCisgIGlmICgodXNhcnRkaXYgPj0gVVNBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVTQVJUX0JSUl9NQVgpKQorICB7CisgICAgYnJydGVtcCA9ICh1aW50MTZfdCkodXNhcnRkaXYgJiAweEZGRjBVKTsKKyAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICBodXNhcnQtPkluc3RhbmNlLT5CUlIgPSBicnJ0ZW1wOworICB9CisgIGVsc2UKKyAgeworICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgaHVzYXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA9IDFVOworICBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMVU7CisKKyAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGh1c2FydC0+UnhJU1IgICA9IE5VTEw7CisgIGh1c2FydC0+VHhJU1IgICA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVU0FSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVTQVJUIEVycm9yQ29kZSAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfVEUpID09IFVTQVJUX0NSMV9URSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVEVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBVU0FSVCBzdGF0ZSovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBlcnJvcnMgYXJlIG5vdCBtYW5hZ2VkIHRvIGF2b2lkIHRoZSBvdmVycnVuIGVycm9yLgorICAqIEBub3RlICAgSVNSIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gRklGTyBtb2RlIGlzIGRpc2FibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyBsZXNzIHRoYW4gOSBiaXRzIGxvbmcuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1c2FydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgaHVzYXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9UcmFuc21pdF9JVCgpLgorICAqIEBub3RlICAgVGhlIFVTQVJUIGVycm9ycyBhcmUgbm90IG1hbmFnZWQgdG8gYXZvaWQgdGhlIG92ZXJydW4gZXJyb3IuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZGlzYWJsZWQgYW5kIHdoZW4gdGhlCisgICogICAgICAgICBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90ICp0bXA7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqdG1wICYgMHgwMUZGVSk7CisgICAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9UcmFuc21pdF9JVCgpLgorICAqIEBub3RlICAgVGhlIFVTQVJUIGVycm9ycyBhcmUgbm90IG1hbmFnZWQgdG8gYXZvaWQgdGhlIG92ZXJydW4gZXJyb3IuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCBhbmQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRhdGEgd29yZCBsZW5ndGggaXMgbGVzcyB0aGFuIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90ICBuYl90eF9kYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBodXNhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzIDsgbmJfdHhfZGF0YSA+IDBVIDsgbmJfdHhfZGF0YS0tKQorICAgIHsKKyAgICAgIGlmIChodXNhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRlQpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RDKTsKKworICAgICAgICBicmVhazsgLyogZm9yY2UgZXhpdCBsb29wICovCisgICAgICB9CisgICAgICBlbHNlIGlmIChfX0hBTF9VU0FSVF9HRVRfRkxBRyhodXNhcnQsIFVTQVJUX0ZMQUdfVFhGTkYpID09IFNFVCkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodXNhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsKKyAgICAgICAgaHVzYXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBlcnJvcnMgYXJlIG5vdCBtYW5hZ2VkIHRvIGF2b2lkIHRoZSBvdmVycnVuIGVycm9yLgorICAqIEBub3RlICAgSVNSIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gRklGTyBtb2RlIGlzIGVuYWJsZWQgYW5kIHdoZW4gdGhlCisgICogICAgICAgICBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCAgbmJfdHhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFgpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpKQorICB7CisgICAgZm9yIChuYl90eF9kYXRhID0gaHVzYXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA7IG5iX3R4X2RhdGEgPiAwVSA7IG5iX3R4X2RhdGEtLSkKKyAgICB7CisgICAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UWEZUKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisKKyAgICAgICAgYnJlYWs7IC8qIGZvcmNlIGV4aXQgbG9vcCAqLworICAgICAgfQorICAgICAgZWxzZSBpZiAoX19IQUxfVVNBUlRfR0VUX0ZMQUcoaHVzYXJ0LCBVU0FSVF9GTEFHX1RYRk5GKSA9PSBTRVQpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodXNhcnQtPnBUeEJ1ZmZQdHI7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnRtcCAmIDB4MDFGRlUpOworICAgICAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyYXBzIHVwIHRyYW5zbWlzc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh1c2FydCBQb2ludGVyIHRvIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0VuZFRyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfRVJSKTsKKworICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgIGh1c2FydC0+VHhJU1IgPSBOVUxMOworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfT1JFRkxBRyhodXNhcnQpOworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgICAgLyogVHggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBUeFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBTaW1wbGV4IHJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKS4KKyAgKiBAbm90ZSAgIElTUiBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIEZJRk8gbW9kZSBpcyBkaXNhYmxlZCBhbmQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRhdGEgd29yZCBsZW5ndGggaXMgbGVzcyB0aGFuIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworICB1aW50MTZfdCB0eGRhdGFjb3VudDsKKyAgdWludDE2X3QgdWhNYXNrID0gaHVzYXJ0LT5NYXNrOworCisgIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpKQorICB7CisgICAgKmh1c2FydC0+cFJ4QnVmZlB0ciA9ICh1aW50OF90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCl1aE1hc2spOworICAgIGh1c2FydC0+cFJ4QnVmZlB0cisrOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVzYXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIHR4ZGF0YWNvdW50IGlzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTMuNSAqLworICAgICAgdHhkYXRhY291bnQgPSBodXNhcnQtPlR4WGZlckNvdW50OworCisgICAgICBpZiAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRyYW5zbWl0IGRhdGEgKi8KKyAgICAgICAgaWYgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICAgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChSRUFEX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSAhPSBVU0FSVF9DUjFfVENJRSkgJiYKKyAgICAgICAgICAgICAgICh0eGRhdGFjb3VudCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFR4UnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgJiYKKyAgICAgICAgICAgICAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpKQorICAgIHsKKyAgICAgIC8qIFNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBTZW5kIHRoZSBuZXh0IGRhdGEgKi8KKyAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZGlzYWJsZWQgYW5kIHdoZW4gdGhlCisgICogICAgICAgICBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfMTZCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodXNhcnQtPnBSeEJ1ZmZQdHI7CisgICAgKnRtcCA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhORSBpbnRlcnJ1cHQqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodXNhcnQtPlJ4SVNSID0gTlVMTDsKKworICAgICAgLyogdHhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgICB0eGRhdGFjb3VudCA9IGh1c2FydC0+VHhYZmVyQ291bnQ7CisKKyAgICAgIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1BJIHNsYXZlIHVuZGVycnVuIGZsYWcgYW5kIGRpc2NhcmQgdHJhbnNtaXQgZGF0YSAqLworICAgICAgICBpZiAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0VOQUJMRSkKKyAgICAgICAgeworICAgICAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX1VEUkZMQUcoaHVzYXJ0KTsKKyAgICAgICAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZSBpZiAoKFJFQURfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpICE9IFVTQVJUX0NSMV9UQ0lFKSAmJgorICAgICAgICAgICAgICAgKHR4ZGF0YWNvdW50ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogVHhSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSAmJgorICAgICAgICAgICAgIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRElTQUJMRSkpCisgICAgeworICAgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwMEZGKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTaW1wbGV4IHJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKS4KKyAgKiBAbm90ZSAgIElTUiBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyBsZXNzIHRoYW4gOSBiaXRzIGxvbmcuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9SeElTUl84QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworICB1aW50MTZfdCB0eGRhdGFjb3VudDsKKyAgdWludDE2X3QgcnhkYXRhY291bnQ7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKyAgdWludDE2X3QgbmJfcnhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpKQorICB7CisgICAgZm9yIChuYl9yeF9kYXRhID0gaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX3J4X2RhdGEgPiAwVSA7IG5iX3J4X2RhdGEtLSkKKyAgICB7CisgICAgICBpZiAoX19IQUxfVVNBUlRfR0VUX0ZMQUcoaHVzYXJ0LCBVU0FSVF9GTEFHX1JYRk5FKSA9PSBTRVQpCisgICAgICB7CisgICAgICAgICpodXNhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpKHVoTWFzayAmIDB4RkZVKSk7CisgICAgICAgIGh1c2FydC0+cFJ4QnVmZlB0cisrOworICAgICAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisKKyAgICAgICAgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgICAgICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgICAgaHVzYXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgICAgICAvKiB0eGRhdGFjb3VudCBpcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgTUlTUkFDMjAxMi1SdWxlLTEzLjUgKi8KKyAgICAgICAgICB0eGRhdGFjb3VudCA9IGh1c2FydC0+VHhYZmVyQ291bnQ7CisKKyAgICAgICAgICBpZiAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQ2xlYXIgU1BJIHNsYXZlIHVuZGVycnVuIGZsYWcgYW5kIGRpc2NhcmQgdHJhbnNtaXQgZGF0YSAqLworICAgICAgICAgICAgaWYgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX1VEUkZMQUcoaHVzYXJ0KTsKKyAgICAgICAgICAgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgICAgICBzdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKFJFQURfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpICE9IFVTQVJUX0NSMV9UQ0lFKSAmJgorICAgICAgICAgICAgICAgICAgICh0eGRhdGFjb3VudCA9PSAwVSkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogVHhSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICAgICAgICAgICAgc3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpICYmCisgICAgICAgICAgICAgICAgIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRElTQUJMRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZW5kIGR1bW15IGJ5dGUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgU2xhdmUgdG8gU2VuZCB0aGUgbmV4dCBkYXRhICovCisgICAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwMEZGKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXaGVuIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gdGhlIFJYIEZJRk8KKyAgICB0aHJlc2hvbGQsIG5leHQgaW5jb21pbmcgZnJhbWVzIGFyZSBwcm9jZXNzZWQgYXMgaWYgRklGTyBtb2RlIHdhcworICAgIGRpc2FibGVkIChpLmUuIG9uZSBpbnRlcnJ1cHQgcGVyIHJlY2VpdmVkIGZyYW1lKS4KKyAgICAqLworICAgIHJ4ZGF0YWNvdW50ID0gaHVzYXJ0LT5SeFhmZXJDb3VudDsKKyAgICBpZiAoKChyeGRhdGFjb3VudCAhPSAwVSkpICYmIChyeGRhdGFjb3VudCA8IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworCisgICAgICAvKiBVcGRhdGUgdGhlIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl84QklUOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAgIGlmICgoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkgJiYKKyAgICAgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpICYmCisgICAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICAgIHsKKyAgICAgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTaW1wbGV4IHJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKS4KKyAgKiBAbm90ZSAgIElTUiBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyA5IGJpdHMgbG9uZy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworICB1aW50MTZfdCB0eGRhdGFjb3VudDsKKyAgdWludDE2X3QgcnhkYXRhY291bnQ7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKyAgdWludDE2X3QgbmJfcnhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpIHx8CisgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpKQorICB7CisgICAgZm9yIChuYl9yeF9kYXRhID0gaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX3J4X2RhdGEgPiAwVSA7IG5iX3J4X2RhdGEtLSkKKyAgICB7CisgICAgICBpZiAoX19IQUxfVVNBUlRfR0VUX0ZMQUcoaHVzYXJ0LCBVU0FSVF9GTEFHX1JYRk5FKSA9PSBTRVQpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodXNhcnQtPnBSeEJ1ZmZQdHI7CisgICAgICAgICp0bXAgPSAodWludDE2X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmIHVoTWFzayk7CisgICAgICAgIGh1c2FydC0+cFJ4QnVmZlB0ciArPSAyVTsKKyAgICAgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgICAgIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgYW5kIFJYIEZJRk8gVGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSkpOworCisgICAgICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgICAgIGh1c2FydC0+UnhJU1IgPSBOVUxMOworCisgICAgICAgICAgLyogdHhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgICAgICAgdHhkYXRhY291bnQgPSBodXNhcnQtPlR4WGZlckNvdW50OworCisgICAgICAgICAgaWYgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRyYW5zbWl0IGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICAgICAgICAgICAgc3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKChSRUFEX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSAhPSBVU0FSVF9DUjFfVENJRSkgJiYKKyAgICAgICAgICAgICAgICAgICAodHhkYXRhY291bnQgPT0gMFUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFR4UnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgICAgIHN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSAmJgorICAgICAgICAgICAgICAgICAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogV2hlbiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIHRoZSBSWCBGSUZPCisgICAgdGhyZXNob2xkLCBuZXh0IGluY29taW5nIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGFzIGlmIEZJRk8gbW9kZSB3YXMKKyAgICBkaXNhYmxlZCAoaS5lLiBvbmUgaW50ZXJydXB0IHBlciByZWNlaXZlZCBmcmFtZSkuCisgICAgKi8KKyAgICByeGRhdGFjb3VudCA9IGh1c2FydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKCgocnhkYXRhY291bnQgIT0gMFUpKSAmJiAocnhkYXRhY291bnQgPCBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBSWEZUIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKworICAgICAgLyogVXBkYXRlIHRoZSBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfMTZCSVQ7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKworICAgICAgaWYgKChodXNhcnQtPlR4WGZlckNvdW50ID09IDBVKSAmJgorICAgICAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkgJiYKKyAgICAgICAgICAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpKQorICAgICAgeworICAgICAgICAvKiBTZW5kIGR1bW15IGJ5dGUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgU2xhdmUgdG8gU2VuZCB0aGUgbmV4dCBkYXRhICovCisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9oYWxfdXNhcnRfZXguYyBiL1NyYy9zdG0zMmcweHhfaGFsX3VzYXJ0X2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MTIzYwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfaGFsX3VzYXJ0X2V4LmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3VzYXJ0X2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFVTQVJUIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgZXh0ZW5kZWQKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFVuaXZlcnNhbCBTeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVU0FSVCkuCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgIyMjIyMgVVNBUlQgcGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAoIykgRklGTyBtb2RlIGVuYWJsaW5nL2Rpc2FibGluZyBhbmQgUlgvVFggRklGTyB0aHJlc2hvbGQgcHJvZ3JhbW1pbmcuCisKKyAgICAgICAgLUAtIFdoZW4gVVNBUlQgb3BlcmF0ZXMgaW4gRklGTyBtb2RlLCBGSUZPIG1vZGUgbXVzdCBiZSBlbmFibGVkIHByaW9yCisgICAgICAgICAgICBzdGFydGluZyBSWC9UWCB0cmFuc2ZlcnMuIEFsc28gUlgvVFggRklGTyB0aHJlc2hvbGRzIG11c3QgYmUKKyAgICAgICAgICAgIGNvbmZpZ3VyZWQgcHJpb3Igc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLgorCisgICAgKCMpIFNsYXZlIG1vZGUgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBOU1MgcGluIGNvbmZpZ3VyYXRpb24uCisKKyAgICAgICAgLUAtIFdoZW4gVVNBUlQgb3BlcmF0ZXMgaW4gU2xhdmUgbW9kZSwgU2xhdmUgbW9kZSBtdXN0IGJlIGVuYWJsZWQgcHJpb3IKKyAgICAgICAgICAgIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4IFVTQVJURXgKKyAgKiBAYnJpZWYgVVNBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBVQVJUIFJYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgUlhfRklGT19ERVBUSCA4VQorCisvKiBVQVJUIFRYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgVFhfRklGT19ERVBUSCA4VQorCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVTQVJURXggUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMgIFVTQVJURXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiBFeHRlbmRlZCBVU0FSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgRklGTyBtb2RlIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zLgorCisgICAgKCMpIFRYL1JYIEZpZm9zIENhbGxiYWNrczoKKyAgICAgICAgKCspIEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBSWCBGaWZvIGZ1bGwgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBUWCBGaWZvIGVtcHR5IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAoKykgSEFMX1VTQVJURXhfRW5hYmxlU1BJU2xhdmVNb2RlKCkgQVBJIGVuYWJsZXMgdGhlIFNQSSBzbGF2ZSBtb2RlCisgICAgICgrKSBIQUxfVVNBUlRFeF9EaXNhYmxlU1BJU2xhdmVNb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBTUEkgc2xhdmUgbW9kZQorICAgICAoKykgSEFMX1VTQVJURXhfQ29uZmlnTlNTIEFQSSBjb25maWd1cmVzIHRoZSBTbGF2ZSBTZWxlY3QgaW5wdXQgcGluIChOU1MpCisgICAgICgrKSBIQUxfVVNBUlRFeF9FbmFibGVGaWZvTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9VU0FSVEV4X0Rpc2FibGVGaWZvTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgRklGTyBtb2RlCisgICAgICgrKSBIQUxfVVNBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgVFggRklGTyB0aHJlc2hvbGQKKyAgICAgKCspIEhBTF9VU0FSVEV4X1NldFJ4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBSWCBGSUZPIHRocmVzaG9sZAorCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTUEkgc2xhdmUgbW9kZS4KKyAgKiBAbm90ZSBXaGVuIHRoZSBVU0FSVCBvcGVyYXRlcyBpbiBTUEkgc2xhdmUgbW9kZSwgaXQgaGFuZGxlcyBkYXRhIGZsb3cgdXNpbmcKKyAgKiAgICAgICB0aGUgc2VyaWFsIGludGVyZmFjZSBjbG9jayBkZXJpdmVkIGZyb20gdGhlIGV4dGVybmFsIFNDTEsgc2lnbmFsCisgICogICAgICAgcHJvdmlkZWQgYnkgdGhlIGV4dGVybmFsIG1hc3RlciBTUEkgZGV2aWNlLgorICAqIEBub3RlIEluIFNQSSBzbGF2ZSBtb2RlLCB0aGUgVVNBUlQgbXVzdCBiZSBlbmFibGVkIGJlZm9yZSBzdGFydGluZyB0aGUgbWFzdGVyCisgICogICAgICAgY29tbXVuaWNhdGlvbnMgKG9yIGJldHdlZW4gZnJhbWVzIHdoaWxlIHRoZSBjbG9jayBpcyBzdGFibGUpLiBPdGhlcndpc2UsCisgICogICAgICAgaWYgdGhlIFVTQVJUIHNsYXZlIGlzIGVuYWJsZWQgd2hpbGUgdGhlIG1hc3RlciBpcyBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgKiAgICAgICBmcmFtZSwgaXQgd2lsbCBiZWNvbWUgZGVzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbWFzdGVyLgorICAqIEBub3RlIFRoZSBkYXRhIHJlZ2lzdGVyIG9mIHRoZSBzbGF2ZSBuZWVkcyB0byBiZSByZWFkeSBiZWZvcmUgdGhlIGZpcnN0IGVkZ2UKKyAgKiAgICAgICBvZiB0aGUgY29tbXVuaWNhdGlvbiBjbG9jayBvciBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgb25nb2luZyBjb21tdW5pY2F0aW9uLAorICAqICAgICAgIG90aGVyd2lzZSB0aGUgU1BJIHNsYXZlIHdpbGwgdHJhbnNtaXQgemVyb3MuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0VuYWJsZVNsYXZlTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogSW4gU1BJIHNsYXZlIG1vZGUgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlcgorICAtIEhEU0VMLCBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKSk7CisKKyAgLyogRW5hYmxlIFNQSSBzbGF2ZSBtb2RlICovCisgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU0xWRU4pOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1c2FydC0+U2xhdmVNb2RlID0gVVNBUlRfU0xBVkVNT0RFX0VOQUJMRTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIEVuYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9FTkFCTEUoaHVzYXJ0KTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU1BJIHNsYXZlIG1vZGUuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0Rpc2FibGVTbGF2ZU1vZGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVVNBUlQgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIERpc2FibGUgU1BJIHNsYXZlIG1vZGUgKi8KKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlNsYXZlTW9kZSA9IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEU7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTbGF2ZSBTZWxlY3QgaW5wdXQgcGluIChOU1MpLgorICAqIEBub3RlIFNvZnR3YXJlIE5TUyBtYW5hZ2VtZW50OiBTUEkgc2xhdmUgd2lsbCBhbHdheXMgYmUgc2VsZWN0ZWQgYW5kIE5TUworICAqICAgICAgIGlucHV0IHBpbiB3aWxsIGJlIGlnbm9yZWQuCisgICogQG5vdGUgSGFyZHdhcmUgTlNTIG1hbmFnZW1lbnQ6IHRoZSBTUEkgc2xhdmUgc2VsZWN0aW9uIGRlcGVuZHMgb24gTlNTCisgICogICAgICAgaW5wdXQgcGluLiBUaGUgc2xhdmUgaXMgc2VsZWN0ZWQgd2hlbiBOU1MgaXMgbG93IGFuZCBkZXNlbGVjdGVkIHdoZW4KKyAgKiAgICAgICBOU1MgaXMgaGlnaC4KKyAgKiBAcGFyYW0gaHVzYXJ0ICAgICAgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBOU1NDb25maWcgICBOU1MgY29uZmlndXJhdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX05TU19IQVJECisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfTlNTX1NPRlQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0NvbmZpZ05TUyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IE5TU0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX05TUyhOU1NDb25maWcpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVTQVJUICovCisgIF9fSEFMX1VTQVJUX0RJU0FCTEUoaHVzYXJ0KTsKKworICAvKiBQcm9ncmFtIERJU19OU1MgYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9ESVNfTlNTLCBOU1NDb25maWcpOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRklGTyBtb2RlLgorICAqIEBwYXJhbSBodXNhcnQgICAgICBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9FbmFibGVGaWZvTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVVNBUlQgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgU0VUX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOworICBodXNhcnQtPkZpZm9Nb2RlID0gVVNBUlRfRklGT01PREVfRU5BQkxFOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBVU0FSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZJRk8gbW9kZS4KKyAgKiBAcGFyYW0gaHVzYXJ0ICAgICAgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfRGlzYWJsZUZpZm9Nb2RlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogRW5hYmxlIEZJRk8gbW9kZSAqLworICBDTEVBUl9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVzYXJ0LT5GaWZvTW9kZSA9IFVTQVJUX0ZJRk9NT0RFX0RJU0FCTEU7CisKKyAgLyogUmVzdG9yZSBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBodXNhcnQgICAgICBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtIFRocmVzaG9sZCAgVFggRklGTyB0aHJlc2hvbGQgdmFsdWUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1RYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogVXBkYXRlIFRYIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVzYXJ0KTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJYRklGTyB0aHJlc2hvbGQuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBSWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1JYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1JYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1JYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogVXBkYXRlIFJYIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVzYXJ0KTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAgKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20KKyAgKiAgICAgICB0aGUgVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQ4X3QgcnhfZmlmb19kZXB0aDsKKyAgdWludDhfdCB0eF9maWZvX2RlcHRoOworICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IHR4X2ZpZm9fdGhyZXNob2xkOworICAvKiAyIDBVLzFVIGFkZGVkIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTguMV9iIGFuZCBNSVNSQUMyMDEyLVJ1bGUtMTguMV9kICovCisgIHVpbnQ4X3QgbnVtZXJhdG9yW10gICA9IHsxVSwgMVUsIDFVLCAzVSwgN1UsIDFVLCAwVSwgMFV9OworICB1aW50OF90IGRlbm9taW5hdG9yW10gPSB7OFUsIDRVLCAyVSwgNFUsIDhVLCAxVSwgMVUsIDFVfTsKKworICBpZiAoaHVzYXJ0LT5GaWZvTW9kZSA9PSBVU0FSVF9GSUZPTU9ERV9ESVNBQkxFKQorICB7CisgICAgaHVzYXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA9IDFVOworICAgIGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByeF9maWZvX2RlcHRoID0gUlhfRklGT19ERVBUSDsKKyAgICB0eF9maWZvX2RlcHRoID0gVFhfRklGT19ERVBUSDsKKyAgICByeF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KSgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRykgPj4gVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKSAmIDB4RkZVKTsKKyAgICB0eF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KSgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSAmIDB4RkZVKTsKKyAgICBodXNhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdCl0eF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3R4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbdHhfZmlmb190aHJlc2hvbGRdOworICAgIGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAoKHVpbnQxNl90KXJ4X2ZpZm9fZGVwdGggKiBudW1lcmF0b3JbcnhfZmlmb190aHJlc2hvbGRdKSAvICh1aW50MTZfdClkZW5vbWluYXRvcltyeF9maWZvX3RocmVzaG9sZF07CisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfaGFsX3d3ZGcuYyBiL1NyYy9zdG0zMmcweHhfaGFsX3d3ZGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdhYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9oYWxfd3dkZy5jCkBAIC0wLDAgKzEsNDE0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2hhbF93d2RnLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgV2luZG93IFdhdGNoZG9nIChXV0RHKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFdXREcgU3BlY2lmaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBPbmNlIGVuYWJsZWQgdGhlIFdXREcgZ2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0IG9uIGV4cGlyeSBvZiBhIHByb2dyYW1tZWQKKyAgICB0aW1lIHBlcmlvZCwgdW5sZXNzIHRoZSBwcm9ncmFtIHJlZnJlc2hlcyB0aGUgY291bnRlciAoVFs2OzBdIGRvd25jb3VudGVyKQorICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKKyAgICB2YWx1ZSByb2xscyBkb3duIGZyb20gMHg0MCB0byAweDNGKS4KKworICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCisgICAgICAgIGJlZm9yZSB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUuIFRoaXMKKyAgICAgICAgaW1wbGllcyB0aGF0IHRoZSBjb3VudGVyIG11c3QgYmUgcmVmcmVzaGVkIGluIGEgbGltaXRlZCB3aW5kb3cuCisgICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgorICAgICgrKSBXV0RHUlNUIGZsYWcgaW4gUkNDIENTUiByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBpbmZvcm0gd2hlbiBhIFdXREcKKyAgICAgICAgcmVzZXQgb2NjdXJzLgorICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKKyAgICAgICAgYnkgYSBwcm9ncmFtbWFibGUgcHJlc2NhbGVyLgorICAgICgrKSBXV0RHIGNsb2NrIChIeikgPSBQQ0xLMSAvICg0MDk2ICogUHJlc2NhbGVyKQorICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKKyAgICAgICAgd2hlcmUgVFs1OzBdIGFyZSB0aGUgbG93ZXN0IDYgYml0cyBvZiBDb3VudGVyLgorICAgICgrKSBXV0RHIENvdW50ZXIgcmVmcmVzaCBpcyBhbGxvd2VkIGJldHdlZW4gdGhlIGZvbGxvd2luZyBsaW1pdHMgOgorICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jaworICAgICAgICAoKyspIG1heCB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSAweDQwKSAvIFdXREcgY2xvY2sKKyAgICAoKykgVHlwaWNhbCB2YWx1ZXM6CisgICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA1NiBNSHooUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CisgICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDczLjE0IG1pY3Jvc2Vjb25kcworICAgICAgICAoKyspIENvdW50ZXIgbWF4IChUWzU7MF0gPSAweDNGKSBANTYgTUh6KFBDTEsxKSB3aXRoIHByZXNjYWxlciBkaXZpZGluZyBieSAxMjg6CisgICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDU5OS4xOCBtaWxsaXNlY29uZHMKKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAqKiogQ29tbW9uIGRyaXZlciB1c2FnZSAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dCisgICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgorICAgICgrKSBTZXQgdGhlIFdXREcgcHJlc2NhbGVyLCByZWZyZXNoIHdpbmRvdyBhbmQgY291bnRlciB2YWx1ZQorICAgICAgICB1c2luZyBIQUxfV1dER19Jbml0KCkgZnVuY3Rpb24uCisgICAgKCspIFN0YXJ0IHRoZSBXV0RHIHVzaW5nIEhBTF9XV0RHX1N0YXJ0KCkgZnVuY3Rpb24uCisgICAgICAgIFdoZW4gdGhlIFdXREcgaXMgZW5hYmxlZCB0aGUgY291bnRlciB2YWx1ZSBzaG91bGQgYmUgY29uZmlndXJlZCB0bworICAgICAgICBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAweDQwIHRvIHByZXZlbnQgZ2VuZXJhdGluZyBhbiBpbW1lZGlhdGUgcmVzZXQuCisgICAgKCspIE9wdGlvbmFsbHkgeW91IGNhbiBlbmFibGUgdGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgd2hpY2ggaXMKKyAgICAgICAgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyAweDQwLCBhbmQgdGhlbiBzdGFydCB0aGUgV1dERyB1c2luZworICAgICAgICBIQUxfV1dER19TdGFydF9JVCgpLiBBdCBFV0kgSEFMX1dXREdfV2FrZXVwQ2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBjYWxsYmFjayBIQUxfV1dER19XYWtldXBDYWxsYmFjay4KKyAgICAgICAgT25jZSBlbmFibGVkLCBFV0kgaW50ZXJydXB0IGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCisgICAgKCspIFRoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gbXVzdCByZWZyZXNoIHRoZSBXV0RHIGNvdW50ZXIgYXQgcmVndWxhcgorICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nCisgICAgICAgIEhBTF9XV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IHdoZW4KKyAgICAgICAgdGhlIGNvdW50ZXIgaXMgbG93ZXIgdGhhbiB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUgYWxyZWFkeSBwcm9ncmFtbWVkLgorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEgYWxsb3dzCisgICAgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLiBVc2UgRnVuY3Rpb25zCisgICAgQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorCisgICAgKCspIEZ1bmN0aW9uIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKKyAgICAgICAgY2FsbGJhY2tzOgorICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgKCspIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KKyAgICB0aGUgZGVmYXVsdCB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4gQHJlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKQorICAgIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorICAKKyAgICBbLi5dCisgICAgV2hlbiBjYWxsaW5nIEByZWYgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUKKyAgICBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6IAorICAgIEByZWYgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjaygpIGFuZCBIQUxfV1dER19Nc3BJbml0KCkgb25seSBpZiB0aGV5IGhhdmUKKyAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KKworICAgIFsuLl0KKyAgICBXaGVuIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgCisgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICAgICoqKiBXV0RHIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIFdXREcgSEFMIGRyaXZlci4KKyAgICAgICgrKSBfX0hBTF9XV0RHX0VOQUJMRTogRW5hYmxlIHRoZSBXV0RHIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9XV0RHX0dFVF9GTEFHOiBHZXQgdGhlIHNlbGVjdGVkIFdXREcncyBmbGFnIHN0YXR1cworICAgICAgKCspIF9fSEFMX1dXREdfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIFdXREcncyBwZW5kaW5nIGZsYWdzCisgICAgICAoKykgX19IQUxfV1dER19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgV1dERyBlYXJseSB3YWtldXAgaW50ZXJydXB0CisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRAorLyoqIEBkZWZncm91cCBXV0RHIFdXREcKKyAgKiBAYnJpZWYgV1dERyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgYW5kIHN0YXJ0IHRoZSBXV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBXV0RHIE1TUC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBXV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkLgorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiAgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQoreworICAvKiBDaGVjayB0aGUgV1dERyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHd3ZGcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfV1dER19BTExfSU5TVEFOQ0UoaHd3ZGctPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX1BSRVNDQUxFUihod3dkZy0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfV0lORE9XKGh3d2RnLT5Jbml0LldpbmRvdykpOworICBhc3NlcnRfcGFyYW0oSVNfV1dER19DT1VOVEVSKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfRVdJX01PREUoaHd3ZGctPkluaXQuRVdJTW9kZSkpOworCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgKi8KKyAgaWYoaHd3ZGctPkV3aUNhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOworICB9CisKKyAgaWYoaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CisgIH0KKworICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayhod3dkZyk7CisjZWxzZQorICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1dXREdfTXNwSW5pdChod3dkZyk7CisjZW5kaWYKKworICAvKiBTZXQgV1dERyBDb3VudGVyICovCisgIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoV1dER19DUl9XREdBIHwgaHd3ZGctPkluaXQuQ291bnRlcikpOworCisgIC8qIFNldCBXV0RHIFByZXNjYWxlciBhbmQgV2luZG93ICovCisgIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNGUiwgKGh3d2RnLT5Jbml0LkVXSU1vZGUgfCBod3dkZy0+SW5pdC5QcmVzY2FsZXIgfCBod3dkZy0+SW5pdC5XaW5kb3cpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBXV0RHIE1TUC4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQG5vdGUgICBXaGVuIHJld3JpdGluZyB0aGlzIGZ1bmN0aW9uIGluIHVzZXIgZmlsZSwgbWVjaGFuaXNtIG1heSBiZSBhZGRlZAorICAqICAgICAgICAgdG8gYXZvaWQgbXVsdGlwbGUgaW5pdGlhbGl6ZSB3aGVuIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gaXMgY2FsbGVkCisgICogICAgICAgICBhZ2FpbiB0byBjaGFuZ2UgcGFyYW1ldGVycy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9XV0RHX01zcEluaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHd3ZGcpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1dXREdfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgV1dERyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBod3dkZyBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX0VXSV9DQl9JRCBFYXJseSBXYWtlVXAgSW50ZXJydXB0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzd2l0Y2goQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKKyAgICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfV1dER19NU1BJTklUX0NCX0lEOgorICAgICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFdXREcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjayAKKyAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIHN3aXRjaChDYWxsYmFja0lEKQorICB7CisgICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CisgICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CisgICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1dXREdfTXNwSW5pdDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIFJlZnJlc2ggdGhlIFdXREcuCisgICAgKCspIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNhbGxiYWNrLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlZnJlc2ggdGhlIFdXREcuCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVmcmVzaChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQoreworICAvKiBXcml0ZSB0byBXV0RHIENSIHRoZSBXV0RHIENvdW50ZXIgdmFsdWUgdG8gcmVmcmVzaCB3aXRoICovCisgIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoaHd3ZGctPkluaXQuQ291bnRlcikpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSAgIFRoZSBFYXJseSBXYWtldXAgSW50ZXJydXB0IChFV0kpIGNhbiBiZSB1c2VkIGlmIHNwZWNpZmljIHNhZmV0eSBvcGVyYXRpb25zCisgICogICAgICAgICBvciBkYXRhIGxvZ2dpbmcgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBhY3R1YWwgcmVzZXQgaXMgZ2VuZXJhdGVkLgorICAqICAgICAgICAgVGhlIEVXSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBieSBjYWxsaW5nIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gd2l0aAorICAqICAgICAgICAgRVdJTW9kZSBzZXQgdG8gV1dER19FV0lfRU5BQkxFLgorICAqICAgICAgICAgV2hlbiB0aGUgZG93bmNvdW50ZXIgcmVhY2hlcyB0aGUgdmFsdWUgMHg0MCwgYW5kIEVXSSBpbnRlcnJ1cHQgaXMKKyAgKiAgICAgICAgIGdlbmVyYXRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSAoSVNSKSBjYW4KKyAgKiAgICAgICAgIGJlIHVzZWQgdG8gdHJpZ2dlciBzcGVjaWZpYyBhY3Rpb25zIChzdWNoIGFzIGNvbW11bmljYXRpb25zIG9yIGRhdGEKKyAgKiAgICAgICAgIGxvZ2dpbmcpLCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZXZpY2UuCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfV1dER19JUlFIYW5kbGVyKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIENoZWNrIGlmIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgaXMgZW5hYmxlICovCisgIGlmIChfX0hBTF9XV0RHX0dFVF9JVF9TT1VSQ0UoaHd3ZGcsIFdXREdfSVRfRVdJKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGlmIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9XV0RHX0dFVF9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRikgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFdXREcgRWFybHkgV2FrZXVwIGZsYWcgKi8KKyAgICAgIF9fSEFMX1dXREdfQ0xFQVJfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpOworCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIEVhcmx5IFdha2V1cCByZWdpc3RlcmVkIGNhbGxiYWNrICovCisgICAgICBod3dkZy0+RXdpQ2FsbGJhY2soaHd3ZGcpOworI2Vsc2UKKyAgICAgIC8qIEVhcmx5IFdha2V1cCBjYWxsYmFjayAqLworICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhod3dkZyk7CisjZW5kaWYKKyAgICB9CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIFdXREcgRWFybHkgV2FrZXVwIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHd3ZGcpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX2FkYy5jIGIvU3JjL3N0bTMyZzB4eF9sbF9hZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjk1ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9hZGMuYwpAQCAtMCwwICsxLDc2MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9hZGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQURDIExMIG1vZHVsZSBkcml2ZXIKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9hZGMuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisgICNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChBREMxKQorCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMIEFEQworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBEZWZpbml0aW9ucyBvZiBBREMgaGFyZHdhcmUgY29uc3RyYWludHMgZGVsYXlzICovCisvKiBOb3RlOiBPbmx5IEFEQyBwZXJpcGhlcmFsIEhXIGRlbGF5cyBhcmUgZGVmaW5lZCBpbiBBREMgTEwgZHJpdmVyIGRyaXZlciwgICAqLworLyogICAgICAgbm90IHRpbWVvdXQgdmFsdWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFRpbWVvdXQgdmFsdWVzIGZvciBBREMgb3BlcmF0aW9ucyBhcmUgZGVwZW5kZW50IHRvIGRldmljZSBjbG9jayAgICAgICovCisvKiAgICAgICBjb25maWd1cmF0aW9uIChzeXN0ZW0gY2xvY2sgdmVyc3VzIEFEQyBjbG9jayksICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGRlZmluZWQgaW4gdXNlciBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFJlZmVyIHRvIEByZWYgQURDX0xMX0VDX0hXX0RFTEFZUyBmb3IgZGVzY3JpcHRpb24gb2YgQURDIHRpbWVvdXQgICAgICovCisvKiAgICAgICB2YWx1ZXMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogQURDIHRpbWVvdXQgdmFsdWVzIGFyZSBkZWZpbmVkIGhlcmUgaW4gQ1BVIGN5Y2xlcyB0byBiZSBpbmRlcGVuZGVudCAgKi8KKy8qICAgICAgIG9mIGRldmljZSBjbG9jayBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJbiB1c2VyIGFwcGxpY2F0aW9uLCBBREMgdGltZW91dCB2YWx1ZXMgc2hvdWxkIGJlIGRlZmluZWQgd2l0aCAgICAgICAqLworLyogICAgICAgdGVtcG9yYWwgdmFsdWVzLCBpbiBmdW5jdGlvbiBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZ3MuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhpZ2hlc3QgcmF0aW8gQ1BVIGNsb2NrIGZyZXF1ZW5jeSB2cyBBREMgY2xvY2sgZnJlcXVlbmN5OiAgICAgICAgICAgICovCisvKiAgICAgICAgLSBBREMgY2xvY2sgZnJvbSBzeW5jaHJvbm91cyBjbG9jayB3aXRoIEFIQiBwcmVzY2FsZXIgNTEyLCAgICAgICAgICAqLworLyogICAgICAgICAgQVBCIHByZXNjYWxlciAxNiwgQURDIHByZXNjYWxlciA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFEQyBjbG9jayBmcm9tIGFzeW5jaHJvbm91cyBjbG9jayAoSFNJKSB3aXRoIHByZXNjYWxlciAxLCAgICAgICAgICovCisvKiAgICAgICAgICB3aXRoIGhpZ2hlc3QgcmF0aW8gQ1BVIGNsb2NrIGZyZXF1ZW5jeSB2cyBIU0kgY2xvY2sgZnJlcXVlbmN5OiAgICAqLworLyogICAgICAgICAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBtYXggNTZNSHosIEhTSSBmcmVxdWVuY3kgMTZNSHo6IHJhdGlvIDQuICAgICAgKi8KKy8qIFVuaXQ6IENQVSBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAgICAgICAgICAoNTEyVUwgKiAxNlVMICogNFVMKQorI2RlZmluZSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVMgICAgICAgICAgKEFEQ19DTE9DS19SQVRJT19WU19DUFVfSElHSEVTVCAqIDFVTCkKKyNkZWZpbmUgQURDX1RJTUVPVVRfU1RPUF9DT05WRVJTSU9OX0NQVV9DWUNMRVMgIChBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgKiAxVUwpCisvKiBOb3RlOiBDQ1JEWSBoYW5kc2hha2UgcmVxdWlyZXMgMUFQQiArIDIgQURDICsgMyBBUEIgY3ljbGVzICAgICAgICAgICAgICAgICAqLworLyogICAgICAgYWZ0ZXIgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIERyaXZlciB0aW1lb3V0IGlzIGFwcHJveGltYXRlZCB0byA2IENQVSBjeWNsZXMuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19USU1FT1VUX0NDUkRZX0NQVV9DWUNMRVMgICAgICAgICAgICAoQURDX0NMT0NLX1JBVElPX1ZTX0NQVV9ISUdIRVNUICogNlVMKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19DT01NT05fQ0xPQ0soX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0NMT0NLX0ZSRVFfTU9ERShfX0NMT0NLX0ZSRVFfTU9ERV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fQ0xPQ0tfRlJFUV9NT0RFX18pID09IExMX0FEQ19DTE9DS19GUkVRX01PREVfSElHSCkgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX0ZSRVFfTU9ERV9fKSA9PSBMTF9BRENfQ0xPQ0tfRlJFUV9NT0RFX0xPVykgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX0NMT0NLKF9fQ0xPQ0tfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFU09MVVRJT04oX19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFU09MVVRJT05fXykgPT0gTExfQURDX1JFU09MVVRJT05fMTBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzhCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl82QikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0RBVEFfQUxJR04oX19EQVRBX0FMSUdOX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9SSUdIVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0RBVEFfQUxJR05fXykgPT0gTExfQURDX0RBVEFfQUxJR05fTEVGVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19MT1dfUE9XRVIoX19MT1dfUE9XRVJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfTU9ERV9OT05FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19MT1dfUE9XRVJfXykgPT0gTExfQURDX0xQX0FVVE9XQUlUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fTE9XX1BPV0VSX18pID09IExMX0FEQ19MUF9BVVRPUE9XRVJPRkYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfQVVUT1dBSVRfQVVUT1BPV0VST0ZGKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFRJTTE1KSAmJiBkZWZpbmVkKFRJTTYpICYmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NINCApICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU02X1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExKSAgICAgICAgICAgICAgIFwKKyAgKQorI2VsaWYgZGVmaW5lZChUSU0xNSkgJiYgZGVmaW5lZChUSU02KQorI2RlZmluZSBJU19MTF9BRENfUkVHX1RSSUdfU09VUkNFKF9fUkVHX1RSSUdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX1NPRlRXQVJFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0g0ICkgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0zX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNNl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTE1X1RSR08pICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkgICAgICAgICAgICAgICBcCisgICkKKyNlbGlmIGRlZmluZWQoVElNMikKKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIpICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NINCApICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkgICAgICAgICAgICAgICBcCisgICkKKyNlbHNlCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoX19SRUdfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDQgKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTNfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkgICAgICAgICAgICAgICBcCisgICkKKyNlbmRpZgorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfQ09OVElOVU9VU19NT0RFKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19DT05USU5VT1VTX01PREVfXykgPT0gTExfQURDX1JFR19DT05WX1NJTkdMRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTKSAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX0RNQV9UUkFOU0ZFUihfX1JFR19ETUFfVFJBTlNGRVJfXykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUpICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVEKSAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVEKSAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgICAgICAgICAgICAgXAorICAoICAgKChfX1JFR19PVlJfREFUQV9CRUhBVklPUl9fKSA9PSBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRCkgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgPT0gTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTikgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX1NFUV9NT0RFKF9fUkVHX1NFUV9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfU0VRX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRklYRUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0NPTkZJR1VSQUJMRSkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9MRU5HVEgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTKSAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fRElTQ09OVF9NT0RFKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgICAgICAgICAgXAorICAoICAgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRSkgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LKSAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0bworICAqICAgICAgICAgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgcGVyZm9ybWluZyBhIGhhcmQgcmVzZXQsIHVzaW5nIGhpZ2ggbGV2ZWwKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgCisgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BREMpOworICAKKyAgLyogUmVsZWFzZSByZXNldCBvZiBBREMgY2xvY2sgKGNvcmUgY2xvY2spICovCisgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BREMpOworICAKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycworICAqICAgICAgICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKQorICAqICAgICAgICAgYW5kIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIGluc3RhbmNlcyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICBtdXN0IGJlIGRpc2FibGVkLgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBBRENfQ29tbW9uSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfQ09NTU9OX0NMT0NLKEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jaykpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zICAgICAgICAgICAgICovCisgIC8qICAgICAgICJMTF9BRENfU2V0Q29tbW9uWFhYKCkiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoZXNlIGZlYXR1cmVzIGlzIGNvbmRpdGlvbmVkIHRvICAgKi8KKyAgLyogICAgICAgQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAqLworICBpZihfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gY29tbW9uIHRvIHNldmVyYWwgQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIChhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSkgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgY2xvY2sgKGNvbnZlcnNpb24gY2xvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTExfQURDX1NldENvbW1vbkNsb2NrKEFEQ3h5X0NPTU1PTiwgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogT25lIG9yIHNldmVyYWwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gICAgICAgICovCisgICAgLyogdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgbm90IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfQ29tbW9uSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfQ29tbW9uSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgY29tbW9uICovCisgIC8qIChhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSkgKi8KKyAgQURDX0NvbW1vbkluaXRTdHJ1Y3QtPkNvbW1vbkNsb2NrID0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjI7CisgIAorfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgVG8gcmVzZXQgYWxsIEFEQyBpbnN0YW5jZXMgcXVpY2tseSAocGVyZm9ybSBhIGhhcmQgcmVzZXQpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLgorICAqIEBub3RlICAgSWYgdGhpcyBmdW5jdGlvbnMgcmV0dXJucyBlcnJvciBzdGF0dXMsIGl0IG1lYW5zIHRoYXQgQURDIGluc3RhbmNlCisgICogICAgICAgICBpcyBpbiBhbiB1bmtub3duIHN0YXRlLgorICAqICAgICAgICAgSW4gdGhpcyBjYXNlLCBwZXJmb3JtIGEgaGFyZCByZXNldCB1c2luZyBoaWdoIGxldmVsCisgICogICAgICAgICBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0NvbW1vbkRlSW5pdCgpLgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19EZUluaXQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICBfX0lPIHVpbnQzMl90IHRpbWVvdXRfY3B1X2N5Y2xlcyA9IDBVTDsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgCisgIC8qIERpc2FibGUgQURDIGluc3RhbmNlIGlmIG5vdCBhbHJlYWR5IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDFVTCkKKyAgeworICAgIC8qIFNldCBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSB0byBTVyBzdGFydCB0byBlbnN1cmUgdG8gbm90ICAgICAgKi8KKyAgICAvKiBoYXZlIGFuIGV4dGVybmFsIHRyaWdnZXIgZXZlbnQgb2NjdXJyaW5nIGR1cmluZyB0aGUgY29udmVyc2lvbiBzdG9wICAgICovCisgICAgLyogQURDIGRpc2FibGUgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZShBREN4LCBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpOworICAgIAorICAgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLiAgICAgICAgICAgKi8KKyAgICBpZihMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgIT0gMFVMKQorICAgIHsKKyAgICAgIGlmKExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMFVMKQorICAgICAgeworICAgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ3gpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdGltZW91dF9jcHVfY3ljbGVzID0gQURDX1RJTUVPVVRfU1RPUF9DT05WRVJTSU9OX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMVVMKQorICAgIHsKKyAgICAgIHRpbWVvdXRfY3B1X2N5Y2xlcy0tOworICAgICAgaWYodGltZW91dF9jcHVfY3ljbGVzID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogVGltZS1vdXQgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgaW5zdGFuY2UgKi8KKyAgICBMTF9BRENfRGlzYWJsZShBREN4KTsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgaW5zdGFuY2UgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICB0aW1lb3V0X2NwdV9jeWNsZXMgPSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKEFEQ3gpID09IDFVTCkKKyAgICB7CisgICAgICB0aW1lb3V0X2NwdV9jeWNsZXMtLTsKKyAgICAgIGlmKHRpbWVvdXRfY3B1X2N5Y2xlcyA9PSAwVUwpCisgICAgICB7CisgICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovCisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENoZWNrIHdoZXRoZXIgQURDIHN0YXRlIGlzIGNvbXBsaWFudCB3aXRoIGV4cGVjdGVkIHN0YXRlICovCisgIGlmKFJFQURfQklUKEFEQ3gtPkNSLAorICAgICAgICAgICAgICAoICBBRENfQ1JfQURTVFAgfCBBRENfQ1JfQURTVEFSVAorICAgICAgICAgICAgICAgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTiAgICkKKyAgICAgICAgICAgICApCisgICAgID09IDBVTCkKKyAgeworICAgIC8qID09PT09PT09PT0gUmVzZXQgQURDIHJlZ2lzdGVycyA9PT09PT09PT09ICovCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgSUVSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPklFUiwKKyAgICAgICAgICAgICAgKCAgTExfQURDX0lUX0FEUkRZCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9FT0MKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPUworICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfT1ZSCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9FT1NNUAorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMQorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMgorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMworICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfRU9DQUwKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0NDUkRZCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLworICAgIFNFVF9CSVQoQURDeC0+SVNSLAorICAgICAgICAgICAgKCAgTExfQURDX0ZMQUdfQURSRFkKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPQworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfRU9TCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19PVlIKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPU01QCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19BV0QxCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19BV0QyCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19BV0QzCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT0NBTAorICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfQ0NSRFkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDUiAqLworICAgIC8qIEJpdHMgQURDX0NSX0FEQ0FMLCBBRENfQ1JfQURTVFAsIEFEQ19DUl9BRFNUQVJUIGFyZSBpbiBhY2Nlc3MgbW9kZSAgICAgKi8KKyAgICAvKiAicmVhZC1zZXQiOiBubyBkaXJlY3QgcmVzZXQgYXBwbGljYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNSLCBBRENfQ1JfQURWUkVHRU4pOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IxLAorICAgICAgICAgICAgICAoICBBRENfQ0ZHUjFfQVdEMUNIICB8IEFEQ19DRkdSMV9BV0QxRU4gfCBBRENfQ0ZHUjFfQVdEMVNHTCB8IEFEQ19DRkdSMV9ESVNDRU4KKyAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FVVE9GRiAgfCBBRENfQ0ZHUjFfV0FJVCAgIHwgQURDX0NGR1IxX0NPTlQgICAgfCBBRENfQ0ZHUjFfT1ZSTU9ECisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9FWFRFTiAgIHwgQURDX0NGR1IxX0VYVFNFTCB8IEFEQ19DRkdSMV9BTElHTiAgIHwgQURDX0NGR1IxX1JFUworICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfU0NBTkRJUiB8IEFEQ19DRkdSMV9ETUFDRkcgfCBBRENfQ0ZHUjFfRE1BRU4gICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDRkdSMiAqLworICAgIC8qIE5vdGU6IFVwZGF0ZSBvZiBBREMgY2xvY2sgbW9kZSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUgZGlzYWJsZWQ6ICAgKi8KKyAgICAvKiAgICAgICBhbHJlYWR5IGRvbmUgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IyLAorICAgICAgICAgICAgICAoICBBRENfQ0ZHUjJfQ0tNT0RFCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMl9UT1ZTICAgfCBBRENfQ0ZHUjJfT1ZTUyAgfCBBRENfQ0ZHUjJfT1ZTUgorICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjJfT1ZTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTTVBSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIsIEFEQ19TTVBSX1NNUDEgfCBBRENfU01QUl9TTVAyIHwgQURDX1NNUFJfU01QU0VMKTsKKworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIxLCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxLCBBRENfVFIxX0hUMSk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgVFIyICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIsIEFEQ19UUjJfSFQyKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBUUjMgKi8KKyAgICBNT0RJRllfUkVHKEFEQ3gtPlRSMywgQURDX1RSM19IVDMgfCBBRENfVFIzX0xUMywgQURDX1RSM19IVDMpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENIU0VMUiAqLworICAgIENMRUFSX0JJVChBREN4LT5DSFNFTFIsCisgICAgICAgICAgICAgICggIEFEQ19DSFNFTFJfQ0hTRUwxOCB8IEFEQ19DSFNFTFJfQ0hTRUwxNyB8IEFEQ19DSFNFTFJfQ0hTRUwxNgorICAgICAgICAgICAgICAgfCBBRENfQ0hTRUxSX0NIU0VMMTUgfCBBRENfQ0hTRUxSX0NIU0VMMTQgfCBBRENfQ0hTRUxSX0NIU0VMMTMgfCBBRENfQ0hTRUxSX0NIU0VMMTIKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDExIHwgQURDX0NIU0VMUl9DSFNFTDEwIHwgQURDX0NIU0VMUl9DSFNFTDkgIHwgQURDX0NIU0VMUl9DSFNFTDgKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDcgIHwgQURDX0NIU0VMUl9DSFNFTDYgIHwgQURDX0NIU0VMUl9DSFNFTDUgIHwgQURDX0NIU0VMUl9DSFNFTDQKKyAgICAgICAgICAgICAgIHwgQURDX0NIU0VMUl9DSFNFTDMgIHwgQURDX0NIU0VMUl9DSFNFTDIgIHwgQURDX0NIU0VMUl9DSFNFTDEgIHwgQURDX0NIU0VMUl9DSFNFTDAgKQorICAgICAgICAgICAgICk7CisgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWFkeSAqLworICAgIHRpbWVvdXRfY3B1X2N5Y2xlcyA9IEFEQ19USU1FT1VUX0NDUkRZX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19Jc0FjdGl2ZUZsYWdfQ0NSRFkoQURDeCkgPT0gMFVMKQorICAgIHsKKyAgICAgIHRpbWVvdXRfY3B1X2N5Y2xlcy0tOworICAgICAgaWYodGltZW91dF9jcHVfY3ljbGVzID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogVGltZS1vdXQgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBDbGVhciBmbGFnIEFEQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVhZHkgKi8KKyAgICBMTF9BRENfQ2xlYXJGbGFnX0NDUkRZKEFEQ3gpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIERSICovCisgICAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlICovCisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0FMRkFDVCAqLworICAgIENMRUFSX0JJVChBREN4LT5DQUxGQUNULCBBRENfQ0FMRkFDVF9DQUxGQUNUKTsKKyAgICAKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBBREMgaW5zdGFuY2UgaXMgaW4gYW4gdW5rbm93biBzdGF0ZSAqLworICAgIC8qIE5lZWQgdG8gcGVyZm9ybWluZyBhIGhhcmQgcmVzZXQgb2YgQURDIGluc3RhbmNlLCB1c2luZyBoaWdoIGxldmVsICAgICAgKi8KKyAgICAvKiBjbG9jayBzb3VyY2UgUkNDIEFEQyByZXNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogQ2F1dGlvbjogT24gdGhpcyBTVE0zMiBzZXJpZSwgaWYgc2V2ZXJhbCBBREMgaW5zdGFuY2VzIGFyZSBhdmFpbGFibGUgICAqLworICAgIC8qICAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UsIFJDQyBBREMgcmVzZXQgd2lsbCByZXNldCAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICBhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbW1vbiBBREMgaW5zdGFuY2UuICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHNvbWUgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBzZXF1ZW5jZXIgbW9kZSAocmVmZXIgdG8KKyAgKiAgICAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoKSApOgorICAqICAgICAgICAgICAgLSBtYXAgY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQgc2VxdWVuY2VyIHJhbmsuCisgICogICAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpOworICAqICAgICAgICAgICAgLSBtYXAgY2hhbm5lbCBvbiByYW5rIGNvcnJlc3BvbmRpbmcgdG8gY2hhbm5lbCBudW1iZXIuCisgICogICAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJDaGFubmVscygpOworICAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRTYW1wbGluZ1RpbWVDb21tb25DaGFubmVscygpOworICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShBREN4KSk7CisgIAorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0NMT0NLKEFEQ19Jbml0U3RydWN0LT5DbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFU09MVVRJT04oQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19EQVRBX0FMSUdOKEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfTE9XX1BPV0VSKEFEQ19Jbml0U3RydWN0LT5Mb3dQb3dlck1vZGUpKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBkYXRhIHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGxvdyBwb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjEsCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9SRVMKKyAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0FMSUdOCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9XQUlUCisgICAgICAgICAgICAgICB8IEFEQ19DRkdSMV9BVVRPRkYKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbgorICAgICAgICAgICAgICAgfCBBRENfSW5pdFN0cnVjdC0+RGF0YUFsaWdubWVudAorICAgICAgICAgICAgICAgfCBBRENfSW5pdFN0cnVjdC0+TG93UG93ZXJNb2RlCisgICAgICAgICAgICAgICk7CisgICAgCisgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSMiwKKyAgICAgICAgICAgICAgIEFEQ19DRkdSMl9DS01PREUKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgQURDX0luaXRTdHJ1Y3QtPkNsb2NrCisgICAgICAgICAgICAgICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IEFEQyBpbnN0YW5jZSBpcyBub3QgZGlzYWJsZWQuICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IEFEQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBpbnN0YW5jZSAqLworICBBRENfSW5pdFN0cnVjdC0+Q2xvY2sgICAgICAgICA9IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMjsKKyAgQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24gICAgPSBMTF9BRENfUkVTT0xVVElPTl8xMkI7CisgIEFEQ19Jbml0U3RydWN0LT5EYXRhQWxpZ25tZW50ID0gTExfQURDX0RBVEFfQUxJR05fUklHSFQ7CisgIEFEQ19Jbml0U3RydWN0LT5Mb3dQb3dlck1vZGUgID0gTExfQURDX0xQX01PREVfTk9ORTsKKyAgCit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJSRUciKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFmdGVyIHVzaW5nIHRoaXMgZnVuY3Rpb24sIG90aGVyIGZlYXR1cmVzIG11c3QgYmUgY29uZmlndXJlZAorICAqICAgICAgICAgdXNpbmcgTEwgdW5pdGFyeSBmdW5jdGlvbnMuCisgICogICAgICAgICBUaGUgbWluaW11bSBjb25maWd1cmF0aW9uIHJlbWFpbmluZyB0byBiZSBkb25lIGlzOgorICAqICAgICAgICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgc2VxdWVuY2VyIG1vZGUgKHJlZmVyIHRvCisgICogICAgICAgICAgICBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ29uZmlndXJhYmxlKCkgKToKKyAgKiAgICAgICAgICAgIC0gbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICAqICAgICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKTsKKyAgKiAgICAgICAgICAgIC0gbWFwIGNoYW5uZWwgb24gcmFuayBjb3JyZXNwb25kaW5nIHRvIGNoYW5uZWwgbnVtYmVyLgorICAqICAgICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKTsKKyAgKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lCisgICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBMTF9BRENfU2V0U2FtcGxpbmdUaW1lQ29tbW9uQ2hhbm5lbHMoKTsKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDX1JFR19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfUkVHX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfVFJJR19TT1VSQ0UoQURDX1JFR19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0xFTkdUSChBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCkpOworICBpZihBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250KSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfQ09OVElOVU9VU19NT0RFKEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfRE1BX1RSQU5TRkVSKEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IoQURDX1JFR19Jbml0U3RydWN0LT5PdmVycnVuKSk7CisgIAorICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8KKyAgLyogICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMFVMKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEFEQyBncm91cCByZWd1bGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciAgICAqLworICAgIC8qICAgICAgdHJhbnNmZXIgYnkgRE1BLCBhbmQgRE1BIHJlcXVlc3RzIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiggICAoTExfQURDX1JFR19HZXRTZXF1ZW5jZXJDb25maWd1cmFibGUoQURDeCkgPT0gTExfQURDX1JFR19TRVFfRklYRUQpCisgICAgICAgfHwgKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkKKyAgICAgICkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRTRUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRVhURU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0NPTlQKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRE1BRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRE1BQ0ZHCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX09WUk1PRAorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1bgorICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IxLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9FWFRTRUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRVhURU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX0NPTlQKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRE1BRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUjFfRE1BQ0ZHCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IxX09WUk1PRAorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgICAgfCBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1bgorICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uICovCisgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDeCwgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBBRENfUkVHX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGdyb3VwIHJlZ3VsYXIgKi8KKyAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAgICovCisgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICA9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPkNvbnRpbnVvdXNNb2RlICAgPSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyICAgICAgPSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4gICAgICAgICAgPSBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQURDMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX2NvbXAuYyBiL1NyYy9zdG0zMmcweHhfbGxfY29tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2I1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2xsX2NvbXAuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9jb21wLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENPTVAgTEwgbW9kdWxlIGRyaXZlcgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2NvbXAuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQ09NUDEpIHx8IGRlZmluZWQgKENPTVAyKQorCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTCBDT01QCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIENPTVAgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAqLworLyogQ09NUCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJU19MTF9DT01QX1BPV0VSX01PREUoX19QT1dFUl9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19QT1dFUl9NT0RFX18pID09IExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNvbXBhcmF0b3IgaW5wdXQgcGx1cyBwYXJhbWV0ZXJzIGFyZSAgICAgICAgICAgICovCisvKiAgICAgICB0aGUgc2FtZSBvbiBhbGwgQ09NUCBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSG93ZXZlciwgY29tcGFyYXRvciBpbnN0YW5jZSBrZXB0IGFzIG1hY3JvIHBhcmFtZXRlciBmb3IgICAgICAgICAgICAgKi8KKy8qICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBmYW1pbGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfUExVUyhfX0NPTVBfSU5TVEFOQ0VfXywgX19JTlBVVF9QTFVTX18pICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNvbXBhcmF0b3IgaW5wdXQgbWludXMgcGFyYW1ldGVycyBhcmUgICAgICAgICAgICovCisvKiAgICAgICB0aGUgc2FtZSBvbiBhbGwgQ09NUCBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSG93ZXZlciwgY29tcGFyYXRvciBpbnN0YW5jZSBrZXB0IGFzIG1hY3JvIHBhcmFtZXRlciBmb3IgICAgICAgICAgICAgKi8KKy8qICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBmYW1pbGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfTUlOVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfTUlOVVNfXykgICAgICAgICAgICAgXAorICAoICAgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gxKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMikgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQ09NUF9JTlBVVF9IWVNURVJFU0lTKF9fSU5QVVRfSFlTVEVSRVNJU19fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX0xPVykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9IWVNURVJFU0lTX18pID09IExMX0NPTVBfSFlTVEVSRVNJU19NRURJVU0pICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfSElHSCkgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQ09NUF9PVVRQVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUE9MQVJJVFlfXykgPT0gTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPTEFSSVRZX18pID09IExMX0NPTVBfT1VUUFVUUE9MX0lOVkVSVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0NPTVBfT1VUUFVUX0JMQU5LSU5HX1NPVVJDRShfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgICAgICAgICAgXAorICAoICAgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzQpICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1KSAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMykgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfVElNM19PQzMpICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTE1X09DMikgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDT01QX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIHRoZSBzZWxlY3RlZCBDT01QIGluc3RhbmNlCisgICogICAgICAgICB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIElmIGNvbXBhcmF0b3IgaXMgbG9ja2VkLCBkZS1pbml0aWFsaXphdGlvbiBieSBzb2Z0d2FyZSBpcworICAqICAgICAgICAgbm90IHBvc3NpYmxlLgorICAqICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4KKyAgKiBAcGFyYW0gIENPTVB4IENPTVAgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ09NUCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQ09NUCByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQ09NUF9EZUluaXQoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoQ09NUHgpKTsKKworICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKTogICAgICAgKi8KKyAgLyogICAgICAgQ09NUCBpbnN0YW5jZSBtdXN0IG5vdCBiZSBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9DT01QX0lzTG9ja2VkKENPTVB4KSA9PSAwVUwpCisgIHsKKyAgICBMTF9DT01QX1dyaXRlUmVnKENPTVB4LCBDU1IsIDB4MDAwMDAwMDBVTCk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDb21wYXJhdG9yIGluc3RhbmNlIGlzIGxvY2tlZDogZGUtaW5pdGlhbGl6YXRpb24gYnkgc29mdHdhcmUgaXMgICAgICAgICAqLworICAgIC8qIG5vdCBwb3NzaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogVGhlIG9ubHkgd2F5IHRvIHVubG9jayB0aGUgY29tcGFyYXRvciBpcyBhIGRldmljZSBoYXJkd2FyZSByZXNldC4gICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIENPTVAgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgZmVhdHVyZXMgb2YgdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UuCisgICogICAgICAgICBTb21lIGZlYXR1cmVzIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBzY29wZSBDT01QIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNvbW1vbiB0byBzZXZlcmFsIENPTVAgaW5zdGFuY2VzKS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkNPTVB4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIENPTVB4IENPTVAgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENPTVBfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9DT01QX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBDT01QIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDT01QIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9DT01QX0luaXQoQ09NUF9UeXBlRGVmICpDT01QeCwgTExfQ09NUF9Jbml0VHlwZURlZiAqQ09NUF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DT01QX0FMTF9JTlNUQU5DRShDT01QeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9QT1dFUl9NT0RFKENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX0lOUFVUX1BMVVMoQ09NUHgsIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRQbHVzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX0lOUFVUX01JTlVTKENPTVB4LCBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfSU5QVVRfSFlTVEVSRVNJUyhDT01QX0luaXRTdHJ1Y3QtPklucHV0SHlzdGVyZXNpcykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9PVVRQVVRfUE9MQVJJVFkoQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9PVVRQVVRfQkxBTktJTkdfU09VUkNFKENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0QmxhbmtpbmdTb3VyY2UpKTsKKworICAvKiBOb3RlOiBIYXJkd2FyZSBjb25zdHJhaW50IChyZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uKSAgICAgICAgKi8KKyAgLyogICAgICAgQ09NUCBpbnN0YW5jZSBtdXN0IG5vdCBiZSBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9DT01QX0lzTG9ja2VkKENPTVB4KSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbXBhcmF0b3IgaW5zdGFuY2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gUG93ZXJNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0UGx1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBJbnB1dE1pbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gSW5wdXRIeXN0ZXJlc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE91dHB1dFBvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBPdXRwdXRCbGFua2luZ1NvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLAorICAgICAgICAgICAgICAgQ09NUF9DU1JfUFdSTU9ERQorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9JTlBTRUwKKyAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfSU5NU0VMCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0hZU1QKKyAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfUE9MQVJJVFkKKyAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfQkxBTktJTkcKKyAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgIENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlCisgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+SW5wdXRQbHVzCisgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+SW5wdXRNaW51cworICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0SHlzdGVyZXNpcworICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dFBvbGFyaXR5CisgICAgICAgICAgICAgICB8IENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgICAgICAgICAgICAgKTsKKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBDT01QIGluc3RhbmNlIGlzIGxvY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gQ09NUF9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0NPTVBfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0NPTVBfU3RydWN0SW5pdChMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBDT01QX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIENPTVBfSW5pdFN0cnVjdC0+UG93ZXJNb2RlICAgICAgICAgICAgPSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRDsKKyAgQ09NUF9Jbml0U3RydWN0LT5JbnB1dFBsdXMgICAgICAgICAgICA9IExMX0NPTVBfSU5QVVRfUExVU19JTzE7CisgIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRNaW51cyAgICAgICAgICAgPSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQ7CisgIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRIeXN0ZXJlc2lzICAgICAgPSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORTsKKyAgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eSAgICAgICA9IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEOworICBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dEJsYW5raW5nU291cmNlID0gTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogQ09NUDEgfHwgQ09NUDIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9jcmMuYyBiL1NyYy9zdG0zMmcweHhfbGxfY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNWM2MgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfbGxfY3JjLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfY3JjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2NyYy5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQ1JDKQorCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBDUkMgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ1JDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDUkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NSQ19EZUluaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19BTExfSU5TVEFOQ0UoQ1JDeCkpOworCisgIGlmIChDUkN4ID09IENSQykKKyAgeworICAgIC8qIEZvcmNlIENSQyByZXNldCAqLworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKTsKKworICAgIC8qIFJlbGVhc2UgQ1JDIHJlc2V0ICovCisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChDUkMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9kYWMuYyBiL1NyYy9zdG0zMmcweHhfbGxfZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1ODQyYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfbGxfZGFjLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfZGFjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERBQyBMTCBtb2R1bGUgZHJpdmVyCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfZGFjLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2J1cy5oIgorCisjaWZkZWYgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoREFDMSkKKworLyoqIEBhZGR0b2dyb3VwIERBQ19MTCBEQUMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfREFDX0NIQU5ORUwoX19EQUNfQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKChfX0RBQ19DSEFOTkVMX18pID09IExMX0RBQ19DSEFOTkVMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19EQUNfQ0hBTk5FTF9fKSA9PSBMTF9EQUNfQ0hBTk5FTF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9EQUNfVFJJR0dFUl9TT1VSQ0UoX19UUklHR0VSX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNM19UUkdPKSAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX1RJTTZfVFJHTykgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9USU03X1RSR08pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfVElNMTVfVFJHTykgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fVFJJR0dFUl9TT1VSQ0VfXykgPT0gTExfREFDX1RSSUdfRVhUX0xQVElNMV9PVVQpICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1RSSUdHRVJfU09VUkNFX18pID09IExMX0RBQ19UUklHX0VYVF9MUFRJTTJfT1VUKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19UUklHR0VSX1NPVVJDRV9fKSA9PSBMTF9EQUNfVFJJR19FWFRfRVhUSV9MSU5FOSkgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9EQUNfV0FWRV9BVVRPX0dFTkVSX01PREUoX19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFX18pICAgICAgICAgICBcCisgICggICAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERV9fKSA9PSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORSkgICAgIFwKKyAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9NT0RFX18pID09IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT0lTRSkgICAgXAorICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgPT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX1RSSUFOR0xFKSBcCisgICkKKworI2RlZmluZSBJU19MTF9EQUNfV0FWRV9BVVRPX0dFTkVSX0NPTkZJRyhfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXywgX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgIFwKKyAgKCAoKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX01PREVfXykgPT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PSVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJiYgKCAgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxXzApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM0XzApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTNV8wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzZfMCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFM3XzApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTOF8wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfTk9JU0VfTEZTUl9VTk1BU0tfQklUUzlfMCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX05PSVNFX0xGU1JfVU5NQVNLX0JJVFMxMF8wKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVRTMTFfMCkpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCgoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fTU9ERV9fKSA9PSBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fVFJJQU5HTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAmJiAoICAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV83KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzMxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV82MykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTI3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzI1NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV81MTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB8fCAoKF9fV0FWRV9BVVRPX0dFTkVSQVRJT05fQ09ORklHX18pID09IExMX0RBQ19UUklBTkdMRV9BTVBMSVRVREVfMTAyMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfHwgKChfX1dBVkVfQVVUT19HRU5FUkFUSU9OX0NPTkZJR19fKSA9PSBMTF9EQUNfVFJJQU5HTEVfQU1QTElUVURFXzIwNDcpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHx8ICgoX19XQVZFX0FVVE9fR0VORVJBVElPTl9DT05GSUdfXykgPT0gTExfREFDX1RSSUFOR0xFX0FNUExJVFVERV80MDk1KSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9EQUNfT1VUUFVUX0JVRkZFUihfX09VVFBVVF9CVUZGRVJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19PVVRQVVRfQlVGRkVSX18pID09IExMX0RBQ19PVVRQVVRfQlVGRkVSX0VOQUJMRSkgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JVRkZFUl9fKSA9PSBMTF9EQUNfT1VUUFVUX0JVRkZFUl9ESVNBQkxFKSAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfREFDX09VVFBVVF9DT05ORUNUSU9OKF9fT1VUUFVUX0NPTk5FQ1RJT05fXykgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fT1VUUFVUX0NPTk5FQ1RJT05fXykgPT0gTExfREFDX09VVFBVVF9DT05ORUNUX0dQSU8pICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9DT05ORUNUSU9OX18pID09IExMX0RBQ19PVVRQVVRfQ09OTkVDVF9JTlRFUk5BTCkgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0RBQ19PVVRQVVRfTU9ERShfX09VVFBVVF9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX09VVFBVVF9NT0RFX18pID09IExMX0RBQ19PVVRQVVRfTU9ERV9OT1JNQUwpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfTU9ERV9fKSA9PSBMTF9EQUNfT1VUUFVUX01PREVfU0FNUExFX0FORF9IT0xEKSAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIERBQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgREFDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIHRoZSBzZWxlY3RlZCBEQUMgaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgREFDeCBEQUMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogREFDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfREFDX0RlSW5pdChEQUNfVHlwZURlZiAqREFDeCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTExfSU5TVEFOQ0UoREFDeCkpOworCisgIC8qIEZvcmNlIHJlc2V0IG9mIERBQyBjbG9jayAqLworICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0RBQzEpOworCisgIC8qIFJlbGVhc2UgcmVzZXQgb2YgREFDIGNsb2NrICovCisgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9EQUMxKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgREFDIGNoYW5uZWwuCisgICogQG5vdGUgICBAcmVmIExMX0RBQ19Jbml0KCkgYWltcyB0byBlYXNlIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgYSBEQUMgY2hhbm5lbC4KKyAgKiAgICAgICAgIExlYXZpbmcgaXQgcmVhZHkgdG8gYmUgZW5hYmxlZCBhbmQgb3V0cHV0OgorICAqICAgICAgICAgYSBsZXZlbCBieSBjYWxsaW5nIG9uZSBvZgorICAqICAgICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YTEyUmlnaHRBbGlnbmVkCisgICogICAgICAgICAgIEByZWYgTExfREFDX0NvbnZlcnREYXRhMTJMZWZ0QWxpZ25lZAorICAqICAgICAgICAgICBAcmVmIExMX0RBQ19Db252ZXJ0RGF0YThSaWdodEFsaWduZWQKKyAgKiAgICAgICAgIG9yIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGF1dG9nZW5lcmF0ZWQgd2F2ZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAgLSBPdXRwdXQgbW9kZQorICAqICAgICAgICAgIC0gVHJpZ2dlcgorICAqICAgICAgICAgIC0gV2F2ZSBnZW5lcmF0aW9uCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEByZWYgTExfREFDX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gREFDIHN0YXRlOgorICAqICAgICAgICAgREFDIGNoYW5uZWwgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIERBQ3ggREFDIGluc3RhbmNlCisgICogQHBhcmFtICBEQUNfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RBQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQUNfQ0hBTk5FTF8yCisgICogQHBhcmFtICBEQUNfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9EQUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IERBQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogREFDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9EQUNfSW5pdChEQUNfVHlwZURlZiAqREFDeCwgdWludDMyX3QgREFDX0NoYW5uZWwsIExMX0RBQ19Jbml0VHlwZURlZiAqREFDX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RBQ19BTExfSU5TVEFOQ0UoREFDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX0NIQU5ORUwoREFDX0NoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19UUklHR0VSX1NPVVJDRShEQUNfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX09VVFBVVF9CVUZGRVIoREFDX0luaXRTdHJ1Y3QtPk91dHB1dEJ1ZmZlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfREFDX09VVFBVVF9DT05ORUNUSU9OKERBQ19Jbml0U3RydWN0LT5PdXRwdXRDb25uZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9EQUNfT1VUUFVUX01PREUoREFDX0luaXRTdHJ1Y3QtPk91dHB1dE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfTU9ERShEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uKSk7CisgIGlmIChEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uICE9IExMX0RBQ19XQVZFX0FVVE9fR0VORVJBVElPTl9OT05FKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0RBQ19XQVZFX0FVVE9fR0VORVJfQ09ORklHKERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb25Db25maWcpKTsKKyAgfQorCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pICAgICAgICAqLworICAvKiAgICAgICBEQUMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0RBQ19Jc0VuYWJsZWQoREFDeCwgREFDX0NoYW5uZWwpID09IDBVKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBEQUMgY2hhbm5lbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFRyaWdnZXJTb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBXYXZlQXV0b0dlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0QnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE91dHB1dENvbm5lY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBPdXRwdXRNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKERBQ19Jbml0U3RydWN0LT5XYXZlQXV0b0dlbmVyYXRpb24gIT0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkUpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhEQUN4LT5DUiwKKyAgICAgICAgICAgICAgICAgKERBQ19DUl9UU0VMMQorICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfV0FWRTEKKyAgICAgICAgICAgICAgICAgIHwgREFDX0NSX01BTVAxCisgICAgICAgICAgICAgICAgICkgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAoREFDX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgICAgIHwgREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgfCBEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uQ29uZmlnCisgICAgICAgICAgICAgICAgICkgPDwgKERBQ19DaGFubmVsICYgREFDX0NSX0NIWF9CSVRPRkZTRVRfTUFTSykKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTU9ESUZZX1JFRyhEQUN4LT5DUiwKKyAgICAgICAgICAgICAgICAgKERBQ19DUl9UU0VMMQorICAgICAgICAgICAgICAgICAgfCBEQUNfQ1JfV0FWRTEKKyAgICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIChEQUNfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgICAgfCBMTF9EQUNfV0FWRV9BVVRPX0dFTkVSQVRJT05fTk9ORQorICAgICAgICAgICAgICAgICApIDw8IChEQUNfQ2hhbm5lbCAmIERBQ19DUl9DSFhfQklUT0ZGU0VUX01BU0spCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgTU9ESUZZX1JFRyhEQUN4LT5NQ1IsCisgICAgICAgICAgICAgICAoREFDX01DUl9NT0RFMV8xCisgICAgICAgICAgICAgICAgfCBEQUNfTUNSX01PREUxXzAKKyAgICAgICAgICAgICAgICB8IERBQ19NQ1JfTU9ERTFfMgorICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgKERBQ19Jbml0U3RydWN0LT5PdXRwdXRCdWZmZXIKKyAgICAgICAgICAgICAgICB8IERBQ19Jbml0U3RydWN0LT5PdXRwdXRDb25uZWN0aW9uCisgICAgICAgICAgICAgICAgfCBEQUNfSW5pdFN0cnVjdC0+T3V0cHV0TW9kZQorICAgICAgICAgICAgICAgKSA8PCAoREFDX0NoYW5uZWwgJiBEQUNfQ1JfQ0hYX0JJVE9GRlNFVF9NQVNLKQorICAgICAgICAgICAgICApOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBEQUMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9EQUNfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gREFDX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfREFDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0RBQ19TdHJ1Y3RJbml0KExMX0RBQ19Jbml0VHlwZURlZiAqREFDX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBEQUNfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgREFDX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgICAgICAgICA9IExMX0RBQ19UUklHX1NPRlRXQVJFOworICBEQUNfSW5pdFN0cnVjdC0+V2F2ZUF1dG9HZW5lcmF0aW9uICAgICAgID0gTExfREFDX1dBVkVfQVVUT19HRU5FUkFUSU9OX05PTkU7CisgIC8qIE5vdGU6IFBhcmFtZXRlciBkaXNjYXJkZWQgaWYgd2F2ZSBhdXRvIGdlbmVyYXRpb24gaXMgZGlzYWJsZWQsICAgICAgICAgICAqLworICAvKiAgICAgICBzZXQgYW55d2F5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREFDX0luaXRTdHJ1Y3QtPldhdmVBdXRvR2VuZXJhdGlvbkNvbmZpZyA9IExMX0RBQ19OT0lTRV9MRlNSX1VOTUFTS19CSVQwOworICBEQUNfSW5pdFN0cnVjdC0+T3V0cHV0QnVmZmVyICAgICAgICAgICAgID0gTExfREFDX09VVFBVVF9CVUZGRVJfRU5BQkxFOworICBEQUNfSW5pdFN0cnVjdC0+T3V0cHV0Q29ubmVjdGlvbiAgICAgICAgID0gTExfREFDX09VVFBVVF9DT05ORUNUX0dQSU87CisgIERBQ19Jbml0U3RydWN0LT5PdXRwdXRNb2RlICAgICAgICAgICAgICAgPSBMTF9EQUNfT1VUUFVUX01PREVfTk9STUFMOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogREFDMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX2RtYS5jIGIvU3JjL3N0bTMyZzB4eF9sbF9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg2MmMyCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9kbWEuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9kbWEuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9kbWEuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChETUExKQorCisvKiogQGRlZmdyb3VwIERNQV9MTCBETUEKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIERNQV9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0xMX0RNQV9ESVJFQ1RJT04oX19WQUxVRV9fKSAgICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fTUVNT1JZKSkKKworI2RlZmluZSBJU19MTF9ETUFfTU9ERShfX1ZBTFVFX18pICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTU9ERV9OT1JNQUwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX01PREVfQ0lSQ1VMQVIpKQorCisjZGVmaW5lIElTX0xMX0RNQV9QRVJJUEhJTkNNT0RFKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQpKQorCisjZGVmaW5lIElTX0xMX0RNQV9NRU1PUllJTkNNT0RFKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9NRU1PUllfSU5DUkVNRU5UKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQpKQorCisjZGVmaW5lIElTX0xMX0RNQV9QRVJJUEhEQVRBU0laRShfX1ZBTFVFX18pICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9QREFUQUFMSUdOX0JZVEUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BEQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfTExfRE1BX01FTU9SWURBVEFTSVpFKF9fVkFMVUVfXykgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX01EQVRBQUxJR05fQllURSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTURBVEFBTElHTl9XT1JEKSkKKworI2RlZmluZSBJU19MTF9ETUFfTkJEQVRBKF9fVkFMVUVfXykgICAgICAgICAgICAgKChfX1ZBTFVFX18pICA8PSAweDAwMDBGRkZGVSkKKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpfHxkZWZpbmVkKFNUTTMyRzA3MXh4KQorI2RlZmluZSBJU19MTF9ETUFfUEVSSVBIUkVRVUVTVChfX1ZBTFVFX18pICAgICAgKChfX1ZBTFVFX18pIDw9IExMX0RNQU1VWF9SRVFfVUNQRDJfVFgpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzA3MHh4KQorI2RlZmluZSBJU19MTF9ETUFfUEVSSVBIUkVRVUVTVChfX1ZBTFVFX18pICAgICAgKChfX1ZBTFVFX18pIDw9IExMX0RNQU1VWF9SRVFfVVNBUlQ0X1RYKQorI2VsaWYgZGVmaW5lZChTVE0zMkcwNDF4eCl8fGRlZmluZWQoU1RNMzJHMDMxeHgpfHxkZWZpbmVkKFNUTTMyRzAzMHh4KQorI2RlZmluZSBJU19MTF9ETUFfUEVSSVBIUkVRVUVTVChfX1ZBTFVFX18pICAgICAgKChfX1ZBTFVFX18pIDw9IExMX0RNQU1VWF9SRVFfVVNBUlQyX1RYKQorI2VuZGlmCisKKyNkZWZpbmUgSVNfTExfRE1BX1BSSU9SSVRZKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX0xPVykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QUklPUklUWV9ISUdIKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX1ZFUllISUdIKSkKKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8ICBkZWZpbmVkKFNUTTMyRzA3MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MHh4KQorI2RlZmluZSBJU19MTF9ETUFfQUxMX0NIQU5ORUxfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpICAoKCgoSU5TVEFOQ0UpID09IERNQTEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzcpKSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCAgZGVmaW5lZChTVE0zMkcwMzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwMzB4eCkKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSkpKQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIERNQV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIERNQSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfQUxMCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IERNQSByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogRE1BIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9ETUFfRGVJbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSB8fCAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpKTsKKworICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpCisgIHsKKyAgICBpZiAoRE1BeCA9PSBETUExKQorICAgIHsKKyAgICAgIC8qIEZvcmNlIHJlc2V0IG9mIERNQSBjbG9jayAqLworICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKworICAgICAgLyogUmVsZWFzZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKyAgICB9CisjaWYgZGVmaW5lZChETUEyKQorICAgIGVsc2UgaWYgKERNQXggPT0gRE1BMikKKyAgICB7CisgICAgICAvKiBGb3JjZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisKKyAgICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgRE1BIGNsb2NrICovCisgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBETUFfQ2hhbm5lbF9UeXBlRGVmICp0bXA7CisKKyAgICB0bXAgPSAoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUF4X0NoYW5uZWx5ICovCisgICAgQ0xFQVJfQklUKHRtcC0+Q0NSLCBETUFfQ0NSX0VOKTsKKworICAgIC8qIFJlc2V0IERNQXhfQ2hhbm5lbHkgY29udHJvbCByZWdpc3RlciAqLworICAgIFdSSVRFX1JFRyh0bXAtPkNDUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSByZW1haW5pbmcgYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICBXUklURV9SRUcodG1wLT5DTkRUUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSBwZXJpcGhlcmFsIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyAgICBXUklURV9SRUcodG1wLT5DUEFSLCAwVSk7CisKKyAgICAvKiBSZXNldCBETUF4X0NoYW5uZWx5IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKHRtcC0+Q01BUiwgMFUpOworCisgICAgLyogUmVzZXQgUmVxdWVzdCByZWdpc3RlciBmaWVsZCBmb3IgRE1BeCBDaGFubmVsICovCisgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QoRE1BeCwgQ2hhbm5lbCwgTExfRE1BTVVYX1JFUV9NRU0yTUVNKTsKKworICAgIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzEpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsMSAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTEoRE1BeCk7CisgICAgfQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfMikKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWwyICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMihETUF4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF8zKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDMgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kzKERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzQpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNCAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTQoRE1BeCk7CisgICAgfQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfNSkKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWw1ICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNShETUF4KTsKKyAgICB9CisjaWYgZGVmaW5lZChMTF9ETUFfQ0hBTk5FTF82KQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfNikKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWw2ICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNihETUF4KTsKKyAgICB9CisjZW5kaWYgLyogTExfRE1BX0NIQU5ORUxfNiAqLworI2lmIGRlZmluZWQoTExfRE1BX0NIQU5ORUxfNykKKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzcpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNyAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcoRE1BeCk7CisgICAgfQorI2VuZGlmIC8qIExMX0RNQV9DSEFOTkVMXzcgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gRE1BX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBUbyBjb252ZXJ0IERNQXhfQ2hhbm5lbHkgSW5zdGFuY2UgdG8gRE1BeCBJbnN0YW5jZSBhbmQgQ2hhbm5lbHksIHVzZSBoZWxwZXIgbWFjcm9zIDoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBfX0xMX0RNQV9HRVRfQ0hBTk5FTAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgRE1BX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogRE1BIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBOb3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfRE1BX0luaXQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIExMX0RNQV9Jbml0VHlwZURlZiAqRE1BX0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgLyogQ2hlY2sgdGhlIERNQSBwYXJhbWV0ZXJzIGZyb20gRE1BX0luaXRTdHJ1Y3QgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9ESVJFQ1RJT04oRE1BX0luaXRTdHJ1Y3QtPkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01PREUoRE1BX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QRVJJUEhJTkNNT0RFKERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0luY01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9NRU1PUllJTkNNT0RFKERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEluY01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QRVJJUEhEQVRBU0laRShETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01FTU9SWURBVEFTSVpFKERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdERhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTkJEQVRBKERNQV9Jbml0U3RydWN0LT5OYkRhdGEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QRVJJUEhSRVFVRVNUKERNQV9Jbml0U3RydWN0LT5QZXJpcGhSZXF1ZXN0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfUFJJT1JJVFkoRE1BX0luaXRTdHJ1Y3QtPlByaW9yaXR5KSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXggQ0NSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSBETUF4X0NoYW5uZWx5OiBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiwgZGF0YSB0cmFuc2ZlciBtb2RlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbCBhbmQgbWVtb3J5IGluY3JlbWVudCBtb2RlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzaXplIGFsaWdubWVudCBhbmQgIHByaW9yaXR5IGxldmVsIHdpdGggcGFyYW1ldGVycyA6CisgICAqIC0gRGlyZWN0aW9uOiAgICAgIERNQV9DQ1JfRElSIGFuZCBETUFfQ0NSX01FTTJNRU0gYml0cworICAgKiAtIE1vZGU6ICAgICAgICAgICBETUFfQ0NSX0NJUkMgYml0CisgICAqIC0gUGVyaXBoT3JNMk1TcmNJbmNNb2RlOiAgRE1BX0NDUl9QSU5DIGJpdAorICAgKiAtIE1lbW9yeU9yTTJNRHN0SW5jTW9kZTogIERNQV9DQ1JfTUlOQyBiaXQKKyAgICogLSBQZXJpcGhPck0yTVNyY0RhdGFTaXplOiBETUFfQ0NSX1BTSVpFWzE6MF0gYml0cworICAgKiAtIE1lbW9yeU9yTTJNRHN0RGF0YVNpemU6IERNQV9DQ1JfTVNJWkVbMTowXSBiaXRzCisgICAqIC0gUHJpb3JpdHk6ICAgICAgICAgICAgICAgRE1BX0NDUl9QTFsxOjBdIGJpdHMKKyAgICovCisgIExMX0RNQV9Db25maWdUcmFuc2ZlcihETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+RGlyZWN0aW9uICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjSW5jTW9kZSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RJbmNNb2RlICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0RhdGFTaXplIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0RGF0YVNpemUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDTUFSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIG1lbW9yeSBvciBkZXN0aW5hdGlvbiBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIE1lbW9yeU9yTTJNRHN0QWRkcmVzczogRE1BX0NNQVJfTUFbMzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0QWRkcmVzcyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF4IENQQVIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbCBvciBzb3VyY2UgYmFzZSBhZGRyZXNzIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBQZXJpcGhPck0yTVNyY0FkZHJlc3M6IERNQV9DUEFSX1BBWzMxOjBdIGJpdHMKKyAgICovCisgIExMX0RNQV9TZXRQZXJpcGhBZGRyZXNzKERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0FkZHJlc3MpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXggQ05EVFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBOYkRhdGE6IERNQV9DTkRUUl9ORFRbMTU6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldERhdGFMZW5ndGgoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPk5iRGF0YSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BTVVYeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgRE1BIHJlcXVlc3QgZm9yIERNQSBDaGFubmVscyBvbiBETUFNVVggQ2hhbm5lbCB4IHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBQZXJpcGhSZXF1ZXN0OiBETUFfQ3hDUls3OjBdIGJpdHMKKyAgICovCisgIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5QZXJpcGhSZXF1ZXN0KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0RNQV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgRE1BX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IERNQV9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNBZGRyZXNzICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RBZGRyZXNzICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+RGlyZWN0aW9uICAgICAgICAgICAgICA9IExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgICAgICAgPSBMTF9ETUFfTU9ERV9OT1JNQUw7CisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0luY01vZGUgID0gTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVDsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0SW5jTW9kZSAgPSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UOworICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSA9IExMX0RNQV9QREFUQUFMSUdOX0JZVEU7CisgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdERhdGFTaXplID0gTExfRE1BX01EQVRBQUxJR05fQllURTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk5iRGF0YSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVTsKKyAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaFJlcXVlc3QgICAgICAgICAgPSBMTF9ETUFNVVhfUkVRX01FTTJNRU07CisgIERNQV9Jbml0U3RydWN0LT5Qcmlvcml0eSAgICAgICAgICAgICAgID0gTExfRE1BX1BSSU9SSVRZX0xPVzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIERNQTEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9leHRpLmMgYi9TcmMvc3RtMzJnMHh4X2xsX2V4dGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU1ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9leHRpLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfZXh0aS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFWFRJIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfZXh0aS5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRVhUSSkKKworLyoqIEBkZWZncm91cCBFWFRJX0xMIEVYVEkKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0VYVElfTElORV8wXzMxKF9fVkFMVUVfXykgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+TExfRVhUSV9MSU5FX0FMTF8wXzMxKSA9PSAweDAwMDAwMDAwVSkKKyNpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzA3MXh4KQorI2RlZmluZSBJU19MTF9FWFRJX0xJTkVfMzJfNjMoX19WQUxVRV9fKSAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfkxMX0VYVElfTElORV9BTExfMzJfNjMpID09IDB4MDAwMDAwMDBVKQorI2VuZGlmCisjZGVmaW5lIElTX0xMX0VYVElfTU9ERShfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9NT0RFX0lUKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX01PREVfRVZFTlQpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfTU9ERV9JVF9FVkVOVCkpCisKKworI2RlZmluZSBJU19MTF9FWFRJX1RSSUdHRVIoX19WQUxVRV9fKSAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0VYVElfVFJJR0dFUl9OT05FKSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9UUklHR0VSX1JJU0lORykgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORykgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRVhUSV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBFWFRJIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gMHgwMDogRVhUSSByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICovCit1aW50MzJfdCBMTF9FWFRJX0RlSW5pdCh2b2lkKQoreworICAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhJTVIxLCAgIDB4RkZGODAwMDBVKTsKKyAgLyogRXZlbnQgbWFzayByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhFTVIxLCAgIDB4MDAwMDAwMDBVKTsKKyAgLyogUmlzaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFJUU1IxLCAgMHgwMDAwMDAwMFUpOworICAvKiBGYWxsaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEZUU1IxLCAgMHgwMDAwMDAwMFUpOworICAvKiBTb2Z0d2FyZSBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoU1dJRVIxLCAweDAwMDAwMDAwVSk7CisgIC8qIFBlbmRpbmcgcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoUlBSMSwgICAgMHgwMDA3RkZGRlUpOworICBMTF9FWFRJX1dyaXRlUmVnKEZQUjEsICAgIDB4MDAwN0ZGRkZVKTsKKworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpCisgIC8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoSU1SMiwgICAgICAgIDB4MDAwMDAwMDNVKTsKKyAgLyogRXZlbnQgbWFzayByZWdpc3RlciAyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEVNUjIsICAgICAgICAweDAwMDAwMDAwVSk7CisjZW5kaWYKKworICByZXR1cm4gMHgwMHU7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgRVhUSSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBFWFRJX0luaXRTdHJ1Y3QuCisgICogQHBhcmFtICBFWFRJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfRVhUSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIDB4MDA6IEVYVEkgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gYW55IG90aGVyIGNhbHVlIDogd3JvbmcgY29uZmlndXJhdGlvbgorICAqLwordWludDMyX3QgTExfRVhUSV9Jbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3Qgc3RhdHVzID0gMHgwMHU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfTElORV8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKSk7CisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfTElORV8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpKTsKKyNlbmRpZgorICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVDb21tYW5kKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9FWFRJX01PREUoRVhUSV9Jbml0U3RydWN0LT5Nb2RlKSk7CisKKyAgLyogRU5BQkxFIExpbmVDb21tYW5kICovCisgIGlmIChFWFRJX0luaXRTdHJ1Y3QtPkxpbmVDb21tYW5kICE9IERJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfRVhUSV9UUklHR0VSKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlcikpOworCisgICAgLyogQ29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAwIHRvIDMxICovCisgICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxICE9IExMX0VYVElfTElORV9OT05FKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRVhUSV9Jbml0U3RydWN0LT5Nb2RlKQorICAgICAgeworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9JVDoKKyAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgLyogVGhlbiBFbmFibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9FVkVOVDoKKyAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIElUIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgLyogVGhlbiBFbmFibGUgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9JVF9FVkVOVDoKKyAgICAgICAgICAvKiBEaXJlY3RseSBFbmFibGUgSVQgJiBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzdGF0dXMgPSAweDAxdTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChFWFRJX0luaXRTdHJ1Y3QtPlRyaWdnZXIgIT0gTExfRVhUSV9UUklHR0VSX05PTkUpCisgICAgICB7CisgICAgICAgIHN3aXRjaCAoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HOgorICAgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBGYWxsaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgLyogVGhlbiBFbmFibGUgUmlzaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTExfRVhUSV9UUklHR0VSX0ZBTExJTkc6CisgICAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIFJpc2luZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgLyogVGhlbiBFbmFibGUgRmFsbGluZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkc6CisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyB8PSAweDAydTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpCisgICAgLyogQ29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAzMiB0byA2MyAqLworICAgIGlmIChFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMgIT0gTExfRVhUSV9MSU5FX05PTkUpCisgICAgeworICAgICAgc3dpdGNoIChFWFRJX0luaXRTdHJ1Y3QtPk1vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0lUOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIElUIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9FVkVOVDoKKyAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIElUIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfSVRfRVZFTlQ6CisgICAgICAgICAgLyogRGlyZWN0bHkgRW5hYmxlIElUICYgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0YXR1cyB8PSAweDA0dTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorICAvKiBESVNBQkxFIExpbmVDb21tYW5kICovCisgIGVsc2UKKyAgeworICAgIC8qIERlLWNvbmZpZ3VyZSBFWFRJIExpbmVzIGluIHJhbmdlIGZyb20gMCB0byAzMSAqLworICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpCisgICAgLyogRGUtY29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAzMiB0byA2MyAqLworICAgIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0VYVElfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEVYVElfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9FWFRJX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfRVhUSV9TdHJ1Y3RJbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCkKK3sKKyAgRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEgICAgICA9IExMX0VYVElfTElORV9OT05FOworI2lmIGRlZmluZWQoU1RNMzJHMDgxeHgpIHx8IGRlZmluZWQoU1RNMzJHMDcxeHgpCisgIEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82MyAgICAgPSBMTF9FWFRJX0xJTkVfTk9ORTsKKyNlbmRpZgorICBFWFRJX0luaXRTdHJ1Y3QtPkxpbmVDb21tYW5kICAgID0gRElTQUJMRTsKKyAgRVhUSV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICA9IExMX0VYVElfTU9ERV9JVDsKKyAgRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyICAgICAgICA9IExMX0VYVElfVFJJR0dFUl9GQUxMSU5HOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoRVhUSSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9ncGlvLmMgYi9TcmMvc3RtMzJnMHh4X2xsX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdhOTQzCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9ncGlvLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfZ3Bpby5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBHUElPIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9ncGlvLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9GKQorCisvKiogQGFkZHRvZ3JvdXAgR1BJT19MTAorICAqIEB7CisgICovCisvKiogTUlTUkEgQzoyMDEyIGRldmlhdGlvbiBydWxlIGhhcyBiZWVuIGdyYW50ZWQgZm9yIGZvbGxvd2luZyBydWxlczoKKyAgKiBSdWxlLTEyLjIgLSBNZWRpdW06IFJIUyBhcmd1bWVudCBpcyBpbiBpbnRlcnZhbCBbMCxJTkZdIHdoaWNoIGlzIG91dCBvZgorICAqIHJhbmdlIG9mIHRoZSBzaGlmdCBvcGVyYXRvciBpbiBmb2xsb3dpbmcgQVBJIDoKKyAgKiBMTF9HUElPX0luaXQKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfR1BJT19QSU4oX19WQUxVRV9fKSAgICAgICAgICAoKCgweDAwdSkgPCAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IChMTF9HUElPX1BJTl9BTEwpKSkKKworI2RlZmluZSBJU19MTF9HUElPX01PREUoX19WQUxVRV9fKSAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0lOUFVUKSAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0FOQUxPRykpCisKKyNkZWZpbmUgSVNfTExfR1BJT19PVVRQVVRfVFlQRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4pKQorCisjZGVmaW5lIElTX0xMX0dQSU9fU1BFRUQoX19WQUxVRV9fKSAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfTE9XKSAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0pICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19TUEVFRF9GUkVRX0hJR0gpICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9HUElPX1BVTEwoX19WQUxVRV9fKSAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX05PKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX1VQKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19QVUxMX0RPV04pKQorCisjZGVmaW5lIElTX0xMX0dQSU9fQUxURVJOQVRFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzAgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMSAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8yICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzMgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNCAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl81ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzYgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNyApKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgR1BJTyByZWdpc3RlcnMgKFJlZ2lzdGVycyByZXN0b3JlZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcykuCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogR1BJTyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogICBXcm9uZyBHUElPIFBvcnQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisKKyAgLyogRm9yY2UgYW5kIFJlbGVhc2UgcmVzZXQgb24gY2xvY2sgb2YgR1BJT3ggUG9ydCAqLworICBpZiAoR1BJT3ggPT0gR1BJT0EpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQSk7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQSk7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0IpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQik7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQik7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0MpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQyk7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPQyk7CisgIH0KKyNpZiBkZWZpbmVkKEdQSU9EKQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPRCkKKyAgeworICAgIExMX0lPUF9HUlAxX0ZvcmNlUmVzZXQoTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgICBMTF9JT1BfR1JQMV9SZWxlYXNlUmVzZXQoTExfSU9QX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgfQorI2VuZGlmIC8qIEdQSU9EICovCisjaWYgZGVmaW5lZChHUElPRikKKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0YpCisgIHsKKyAgICBMTF9JT1BfR1JQMV9Gb3JjZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPRik7CisgICAgTExfSU9QX0dSUDFfUmVsZWFzZVJlc2V0KExMX0lPUF9HUlAxX1BFUklQSF9HUElPRik7CisgIH0KKyNlbmRpZiAvKiBHUElPRiAqLworICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIEdQSU8gcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gR1BJT19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtIEdQSU9fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9HUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBHUElPIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEdQSU8gcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBhY2NvcmRpbmcgdG8gR1BJT19Jbml0U3RydWN0IGNvbnRlbnQKKyAgKiAgICAgICAgICAtIEVSUk9SOiAgIE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9HUElPX0luaXQoR1BJT19UeXBlRGVmICpHUElPeCwgTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KQoreworICB1aW50MzJfdCBwaW5wb3M7CisgIHVpbnQzMl90IGN1cnJlbnRwaW47CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fQUxMX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX1BJTihHUElPX0luaXRTdHJ1Y3QtPlBpbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19NT0RFKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19QVUxMKEdQSU9fSW5pdFN0cnVjdC0+UHVsbCkpOworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBJbml0aWFsaXplICBwaW5wb3Mgb24gZmlyc3QgcGluIHNldCAqLworICBwaW5wb3MgPSAwOworCisgIC8qIENvbmZpZ3VyZSB0aGUgcG9ydCBwaW5zICovCisgIHdoaWxlICgoKEdQSU9fSW5pdFN0cnVjdC0+UGluKSA+PiBwaW5wb3MpICE9IDB4MDB1KQorICB7CisgICAgLyogR2V0IGN1cnJlbnQgaW8gcG9zaXRpb24gKi8KKyAgICBjdXJyZW50cGluID0gKEdQSU9fSW5pdFN0cnVjdC0+UGluKSAmICgweDAwMDAwMDAxdUwgPDwgcGlucG9zKTsKKworICAgIGlmIChjdXJyZW50cGluICE9IDB4MDB1KQorICAgIHsKKyAgICAgIC8qIFBpbiBNb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIExMX0dQSU9fU2V0UGluTW9kZShHUElPeCwgY3VycmVudHBpbiwgR1BJT19Jbml0U3RydWN0LT5Nb2RlKTsKKworICAgICAgaWYgKChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX09VVFBVVCkgfHwgKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfQUxURVJOQVRFKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgU3BlZWQgbW9kZSBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX1NQRUVEKEdQSU9fSW5pdFN0cnVjdC0+U3BlZWQpKTsKKworICAgICAgICAvKiBTcGVlZCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgTExfR1BJT19TZXRQaW5TcGVlZChHUElPeCwgY3VycmVudHBpbiwgR1BJT19Jbml0U3RydWN0LT5TcGVlZCk7CisgICAgICB9CisKKyAgICAgIC8qIFB1bGwtdXAgUHVsbCBkb3duIHJlc2lzdG9yIGNvbmZpZ3VyYXRpb24qLworICAgICAgTExfR1BJT19TZXRQaW5QdWxsKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPlB1bGwpOworCisgICAgICBpZiAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIEFsdGVybmF0ZSBwYXJhbWV0ZXIgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fQUxURVJOQVRFKEdQSU9fSW5pdFN0cnVjdC0+QWx0ZXJuYXRlKSk7CisKKyAgICAgICAgLyogU3BlZWQgbW9kZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIGlmIChjdXJyZW50cGluIDwgTExfR1BJT19QSU5fOCkKKyAgICAgICAgeworICAgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1KEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcGlucG9zKys7CisgIH0KKworICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQorICB7CisgICAgLyogQ2hlY2sgT3V0cHV0IG1vZGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX09VVFBVVF9UWVBFKEdQSU9fSW5pdFN0cnVjdC0+T3V0cHV0VHlwZSkpOworCisgICAgLyogT3V0cHV0IG1vZGUgY29uZmlndXJhdGlvbiovCisgICAgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKEdQSU94LCBHUElPX0luaXRTdHJ1Y3QtPlBpbiwgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlKTsKKworICB9CisgIHJldHVybiAoU1VDQ0VTUyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gR1BJT19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KQoreworICAvKiBSZXNldCBHUElPIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovCisgIEdQSU9fSW5pdFN0cnVjdC0+UGluICAgICAgICA9IExMX0dQSU9fUElOX0FMTDsKKyAgR1BJT19Jbml0U3RydWN0LT5Nb2RlICAgICAgID0gTExfR1BJT19NT0RFX0FOQUxPRzsKKyAgR1BJT19Jbml0U3RydWN0LT5TcGVlZCAgICAgID0gTExfR1BJT19TUEVFRF9GUkVRX0xPVzsKKyAgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlID0gTExfR1BJT19PVVRQVVRfUFVTSFBVTEw7CisgIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCAgICAgICA9IExMX0dQSU9fUFVMTF9OTzsKKyAgR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUgID0gTExfR1BJT19BRl8wOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9GKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfaTJjLmMgYi9TcmMvc3RtMzJnMHh4X2xsX2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzBiODkKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2xsX2kyYy5jCkBAIC0wLDAgKzEsMjI3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2kyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJMkMgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9pMmMuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChJMkMxKSB8fCBkZWZpbmVkIChJMkMyKQorCisvKiogQGRlZmdyb3VwIEkyQ19MTCBJMkMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyQ19MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfSTJDX1BFUklQSEVSQUxfTU9ERShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJDX01PREVfSTJDKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX1NNQlVTX0hPU1QpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX01PREVfU01CVVNfREVWSUNFX0FSUCkpCisKKyNkZWZpbmUgSVNfTExfSTJDX0FOQUxPR19GSUxURVIoX19WQUxVRV9fKSAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19MTF9JMkNfRElHSVRBTF9GSUxURVIoX19WQUxVRV9fKSAgICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwMDAwMEZVKQorCisjZGVmaW5lIElTX0xMX0kyQ19PV05fQUREUkVTUzEoX19WQUxVRV9fKSAgICAgICAoKF9fVkFMVUVfXykgPD0gMHgwMDAwMDNGRlUpCisKKyNkZWZpbmUgSVNfTExfSTJDX1RZUEVfQUNLTk9XTEVER0UoX19WQUxVRV9fKSAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJDX0FDSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9JMkNfTkFDSykpCisKKyNkZWZpbmUgSVNfTExfSTJDX09XTl9BRERSU0laRShfX1ZBTFVFX18pICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJDX09XTkFERFJFU1MxXzdCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX09XTkFERFJFU1MxXzEwQklUKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBJMkMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEkyQyByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfSTJDX0RlSW5pdChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgSTJDIEluc3RhbmNlIEkyQ3ggKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoSTJDeCkpOworCisgIGlmIChJMkN4ID09IEkyQzEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBJMkMgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSk7CisgIH0KKyAgZWxzZSBpZiAoSTJDeCA9PSBJMkMyKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMyKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzIpOworCisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEkyQyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBJMkNfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgSTJDX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfSTJDX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogSTJDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBOb3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfSTJDX0luaXQoSTJDX1R5cGVEZWYgKkkyQ3gsIExMX0kyQ19Jbml0VHlwZURlZiAqSTJDX0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBJMkMgSW5zdGFuY2UgSTJDeCAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9JTlNUQU5DRShJMkN4KSk7CisKKyAgLyogQ2hlY2sgdGhlIEkyQyBwYXJhbWV0ZXJzIGZyb20gSTJDX0luaXRTdHJ1Y3QgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19QRVJJUEhFUkFMX01PREUoSTJDX0luaXRTdHJ1Y3QtPlBlcmlwaGVyYWxNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMkNfQU5BTE9HX0ZJTFRFUihJMkNfSW5pdFN0cnVjdC0+QW5hbG9nRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMkNfRElHSVRBTF9GSUxURVIoSTJDX0luaXRTdHJ1Y3QtPkRpZ2l0YWxGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19PV05fQUREUkVTUzEoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMkNfVFlQRV9BQ0tOT1dMRURHRShJMkNfSW5pdFN0cnVjdC0+VHlwZUFja25vd2xlZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMkNfT1dOX0FERFJTSVpFKEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyU2l6ZSkpOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQ3ggUGVyaXBoZXJhbCAqLworICBMTF9JMkNfRGlzYWJsZShJMkN4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBhbmFsb2cgYW5kIGRpZ2l0YWwgbm9pc2UgZmlsdGVycyB3aXRoIHBhcmFtZXRlcnMgOgorICAgKiAtIEFuYWxvZ0ZpbHRlcjogSTJDX0NSMV9BTkZPRkYgYml0CisgICAqIC0gRGlnaXRhbEZpbHRlcjogSTJDX0NSMV9ETkZbMzowXSBiaXRzCisgICAqLworICBMTF9JMkNfQ29uZmlnRmlsdGVycyhJMkN4LCBJMkNfSW5pdFN0cnVjdC0+QW5hbG9nRmlsdGVyLCBJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggVElNSU5HUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgU0RBIHNldHVwLCBob2xkIHRpbWUgYW5kIHRoZSBTQ0wgaGlnaCwgbG93IHBlcmlvZCB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gVGltaW5nOiBJMkNfVElNSU5HUl9QUkVTQ1szOjBdLCBJMkNfVElNSU5HUl9TQ0xERUxbMzowXSwgSTJDX1RJTUlOR1JfU0RBREVMWzM6MF0sCisgICAqICAgICAgICAgICBJMkNfVElNSU5HUl9TQ0xIWzc6MF0gYW5kIEkyQ19USU1JTkdSX1NDTExbNzowXSBiaXRzCisgICAqLworICBMTF9JMkNfU2V0VGltaW5nKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5UaW1pbmcpOworCisgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDeCBQZXJpcGhlcmFsICovCisgIExMX0kyQ19FbmFibGUoSTJDeCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggT0FSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIERpc2FibGUsIENvbmZpZ3VyZSBhbmQgRW5hYmxlIEkyQ3ggZGV2aWNlIG93biBhZGRyZXNzIDEgd2l0aCBwYXJhbWV0ZXJzIDoKKyAgICogLSBPd25BZGRyZXNzMTogIEkyQ19PQVIxX09BMVs5OjBdIGJpdHMKKyAgICogLSBPd25BZGRyU2l6ZTogIEkyQ19PQVIxX09BMU1PREUgYml0CisgICAqLworICBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MxKEkyQ3gpOworICBMTF9JMkNfU2V0T3duQWRkcmVzczEoSTJDeCwgSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxLCBJMkNfSW5pdFN0cnVjdC0+T3duQWRkclNpemUpOworCisgIC8qIE93bkFkcmVzczEgPT0gMCBpcyByZXNlcnZlZCBmb3IgR2VuZXJhbCBDYWxsIGFkZHJlc3MgKi8KKyAgaWYgKEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSAhPSAwVSkKKyAgeworICAgIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMShJMkN4KTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE1PREUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIENvbmZpZ3VyZSBJMkN4IHBlcmlwaGVyYWwgbW9kZSB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gUGVyaXBoZXJhbE1vZGU6IEkyQ19DUjFfU01CREVOIGFuZCBJMkNfQ1IxX1NNQkhFTiBiaXRzCisgICAqLworICBMTF9JMkNfU2V0TW9kZShJMkN4LCBJMkNfSW5pdFN0cnVjdC0+UGVyaXBoZXJhbE1vZGUpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIEFDS25vd2xlZGdlIG9yIE5vbiBBQ0tub3dsZWRnZSBjb25kaXRpb24KKyAgICogYWZ0ZXIgdGhlIGFkZHJlc3MgcmVjZWl2ZSBtYXRjaCBjb2RlIG9yIG5leHQgcmVjZWl2ZWQgYnl0ZSB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gVHlwZUFja25vd2xlZGdlOiBJMkNfQ1IyX05BQ0sgYml0CisgICAqLworICBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YShJMkN4LCBJMkNfSW5pdFN0cnVjdC0+VHlwZUFja25vd2xlZGdlKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0kyQ19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgSTJDX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfSTJDX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSTJDX1N0cnVjdEluaXQoTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IEkyQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBJMkNfSW5pdFN0cnVjdC0+UGVyaXBoZXJhbE1vZGUgID0gTExfSTJDX01PREVfSTJDOworICBJMkNfSW5pdFN0cnVjdC0+VGltaW5nICAgICAgICAgID0gMFU7CisgIEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIgICAgPSBMTF9JMkNfQU5BTE9HRklMVEVSX0VOQUJMRTsKKyAgSTJDX0luaXRTdHJ1Y3QtPkRpZ2l0YWxGaWx0ZXIgICA9IDBVOworICBJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEgICAgID0gMFU7CisgIEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UgPSBMTF9JMkNfTkFDSzsKKyAgSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJTaXplICAgICA9IExMX0kyQ19PV05BRERSRVNTMV83QklUOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSTJDMSB8fCBJMkMyICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfbHB0aW0uYyBiL1NyYy9zdG0zMmcweHhfbGxfbHB0aW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQ5NzhhCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9scHRpbS5jCkBAIC0wLDAgKzEsMTkzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2xwdGltLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIExQVElNIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfbHB0aW0uaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVElNMSkgfHwgZGVmaW5lZCAoTFBUSU0yKQorCisvKiogQGFkZHRvZ3JvdXAgTFBUSU1fTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExQVElNX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfTFBUSU1fQ0xPQ0tfU09VUkNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTCkpCisKKyNkZWZpbmUgSVNfTExfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVY0KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOCkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCkpCisKKyNkZWZpbmUgSVNfTExfTFBUSU1fV0FWRUZPUk0oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFKSkKKworI2RlZmluZSBJU19MTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgTFBUSU1fTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IExQVElNeCByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgTFBUSU14IExQIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogaW52YWxpZCBMUFRJTXggaW5zdGFuY2UKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKExQVElNeCkpOworCisgIGlmIChMUFRJTXggPT0gTFBUSU0xKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpOworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpOworICB9CisjaWYgZGVmaW5lZChMUFRJTTIpCisgIGVsc2UgaWYgKExQVElNeCA9PSBMUFRJTTIpCisgIHsKKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMik7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMik7CisgIH0KKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyAgZWxzZQorICB7CisgICAgcmVzdWx0ID0gRVJST1I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIGZpZWxkcyBvZiB0aGUgTFBUSU1fSW5pdFN0cnVjdCBzdHJ1Y3R1cmUgdG8gaXRzIGRlZmF1bHQKKyAgKiAgICAgICAgIHZhbHVlLgorICAqIEBwYXJhbSAgTFBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UgPSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMOworICBMUFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIgICA9IExMX0xQVElNX1BSRVNDQUxFUl9ESVYxOworICBMUFRJTV9Jbml0U3RydWN0LT5XYXZlZm9ybSAgICA9IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV007CisgIExQVElNX0luaXRTdHJ1Y3QtPlBvbGFyaXR5ICAgID0gTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMUFRJTXggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAqIEBub3RlIExMX0xQVElNX0luaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIExQVElNeCBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0Rpc2FibGUoKS4KKyAgKiBAcGFyYW0gIExQVElNeCBMUCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgTFBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTFBUSU14IGluc3RhbmNlIGhhcyBiZWVuIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogTFBUSU14IGluc3RhbmNlIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9MUFRJTV9Jbml0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYgKkxQVElNX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX0NMT0NLX1NPVVJDRShMUFRJTV9Jbml0U3RydWN0LT5DbG9ja1NvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKExQVElNX0luaXRTdHJ1Y3QtPlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fV0FWRUZPUk0oTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX09VVFBVVF9QT0xBUklUWShMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSkpOworCisgIC8qIFRoZSBMUFRJTXhfQ0ZHUiByZWdpc3RlciBtdXN0IG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGUgTFBUSU0gaXMgZGlzYWJsZWQKKyAgICAgKEVOQUJMRSBiaXQgaXMgcmVzZXQgdG8gMCkuCisgICovCisgIGlmIChMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU14KSA9PSAxVSkKKyAgeworICAgIHJlc3VsdCA9IEVSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBDS1NFTCBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gQ2xvY2tTb3VyY2UgdmFsdWUgKi8KKyAgICAvKiBTZXQgUFJFU0MgYml0ZmllbGQgYWNjb3JkaW5nIHRvIFByZXNjYWxlciB2YWx1ZSAqLworICAgIC8qIFNldCBXQVZFIGJpdGZpZWxkIGFjY29yZGluZyB0byBXYXZlZm9ybSB2YWx1ZSAqLworICAgIC8qIFNldCBXQVZFUE9MIGJpdGZpZWxkIGFjY29yZGluZyB0byBQb2xhcml0eSB2YWx1ZSAqLworICAgIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLAorICAgICAgICAgICAgICAgKExQVElNX0NGR1JfQ0tTRUwgfCBMUFRJTV9DRkdSX1BSRVNDIHwgTFBUSU1fQ0ZHUl9XQVZFIHwgTFBUSU1fQ0ZHUl9XQVZQT0wpLAorICAgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UgfCBcCisgICAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIgfCBcCisgICAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5XYXZlZm9ybSB8IFwKKyAgICAgICAgICAgICAgIExQVElNX0luaXRTdHJ1Y3QtPlBvbGFyaXR5KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBMUFRJTTEgfHwgTFBUSU0yICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfbHB1YXJ0LmMgYi9TcmMvc3RtMzJnMHh4X2xsX2xwdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2xsX2xwdWFydC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX2xwdWFydC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBMUFVBUlQgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9scHVhcnQuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcmNjLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBVQVJUMSkKKworLyoqIEBhZGR0b2dyb3VwIExQVUFSVF9MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFVBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBMUFVBUlQgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJU19MTF9MUFVBUlRfUFJFU0NBTEVSKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYpKQorCisvKiBfX0JBVURSQVRFX18gRGVwZW5kaW5nIG9uIGNvbnN0cmFpbnRzIGFwcGxpY2FibGUgZm9yIExQVUFSVCBCUlIgcmVnaXN0ZXIgICAqLworLyogICAgICAgICAgICAgIHZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgIC0gZmNrIG11c3QgYmUgaW4gdGhlIHJhbmdlIFszIHggYmF1ZHJhdGUsIDQwOTYgeCBiYXVkcmF0ZV0gICovCisvKiAgICAgICAgICAgICAgICAtIExQVUFSVF9CUlIgcmVnaXN0ZXIgdmFsdWUgc2hvdWxkIGJlID49IDB4MzAwICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgLSBMUFVBUlRfQlJSIHJlZ2lzdGVyIHZhbHVlIHNob3VsZCBiZSA8PSAweEZGRkZGICgyMCBiaXRzKSAgKi8KKy8qICAgICAgICAgICAgICBCYXVkcmF0ZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgc2hvdWxkIGJlbG9uZyB0byBbOCwgMjEzMDAwMDBdLiovCisjZGVmaW5lIElTX0xMX0xQVUFSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoKF9fQkFVRFJBVEVfXykgPD0gMjEzMDAwMDBVKSAmJiAoKF9fQkFVRFJBVEVfXykgPj0gOFUpKQorCisvKiBfX1ZBTFVFX18gQlJSIGNvbnRlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMHgzMDAuICovCisjZGVmaW5lIElTX0xMX0xQVUFSVF9CUlJfTUlOKF9fVkFMVUVfXykgICAoKF9fVkFMVUVfXykgPj0gMHgzMDBVKQorCisvKiBfX1ZBTFVFX18gQlJSIGNvbnRlbnQgbXVzdCBiZSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRkYuICovCisjZGVmaW5lIElTX0xMX0xQVUFSVF9CUlJfTUFYKF9fVkFMVUVfXykgICAoKF9fVkFMVUVfXykgPD0gMHgwMDBGRkZGRlUpCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX0RJUkVDVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RJUkVDVElPTl9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9ESVJFQ1RJT05fUlgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RJUkVDVElPTl9UWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYKSkKKworI2RlZmluZSBJU19MTF9MUFVBUlRfUEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUEFSSVRZX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BBUklUWV9FVkVOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QQVJJVFlfT0REKSkKKworI2RlZmluZSBJU19MTF9MUFVBUlRfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfREFUQVdJRFRIXzdCKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9EQVRBV0lEVEhfOEIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RBVEFXSURUSF85QikpCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX1NUT1BCSVRTKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfU1RPUEJJVFNfMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9TVE9QQklUU18yKSkKKworI2RlZmluZSBJU19MTF9MUFVBUlRfSFdDT05UUk9MKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfSFdDT05UUk9MX1JUUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFVBUlRfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIExQVUFSVF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIExQVUFSVCByZWdpc3RlcnMgKFJlZ2lzdGVycyByZXN0b3JlZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcykuCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBMUFVBUlQgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9MUFVBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9JTlNUQU5DRShMUFVBUlR4KSk7CisKKyAgaWYgKExQVUFSVHggPT0gTFBVQVJUMSkKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIExQVUFSVCBwZXJpcGhlcmFsICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFVBUlQxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgTFBVQVJUIHBlcmlwaGVyYWwgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBVQVJUMSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBMUFVBUlQgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIExQVUFSVF9Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIExQVUFSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIExQVUFSVCBpcyBkaXNhYmxlZCAoVVNBUlRfQ1IxX1VFIGJpdCA9MCksCisgICogICAgICAgICBMUFVBUlQgUGVyaXBoZXJhbCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBub3RlICAgQmF1ZCByYXRlIHZhbHVlIHN0b3JlZCBpbiBMUFVBUlRfSW5pdFN0cnVjdCBCYXVkUmF0ZSBmaWVsZCwgc2hvdWxkIGJlIHZhbGlkIChkaWZmZXJlbnQgZnJvbSAwKS4KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBMUFVBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFVBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIExQVUFSVCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBMUFVBUlQgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIExQVUFSVCBSZWdpc3RlcnMgaW5pdGlhbGl6YXRpb24KKyAgKi8KK0Vycm9yU3RhdHVzIExMX0xQVUFSVF9Jbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIExMX0xQVUFSVF9Jbml0VHlwZURlZiAqTFBVQVJUX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworICB1aW50MzJfdCBwZXJpcGhjbGs7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9JTlNUQU5DRShMUFVBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfUFJFU0NBTEVSKExQVUFSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0JBVURSQVRFKExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0RBVEFXSURUSChMUFVBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfU1RPUEJJVFMoTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfUEFSSVRZKExQVUFSVF9Jbml0U3RydWN0LT5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9ESVJFQ1RJT04oTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfSFdDT05UUk9MKExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sKSk7CisKKyAgLyogTFBVQVJUIG5lZWRzIHRvIGJlIGluIGRpc2FibGVkIHN0YXRlLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGJpdHMgaW4KKyAgICAgQ1J4IHJlZ2lzdGVycy4gT3RoZXJ3aXNlIChMUFVBUlQgbm90IGluIERpc2FibGVkIHN0YXRlKSA9PiByZXR1cm4gRVJST1IgKi8KKyAgaWYgKExMX0xQVUFSVF9Jc0VuYWJsZWQoTFBVQVJUeCkgPT0gMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIExQVUFSVHggQ1IxIChMUFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgVHJhbnNmZXIgRGlyZWN0aW9uIGJpdHMpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIERhdGFXaWR0aDogICAgICAgICAgVVNBUlRfQ1IxX00gYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB2YWx1ZQorICAgICAqIC0gUGFyaXR5OiAgICAgICAgICAgICBVU0FSVF9DUjFfUENFLCBVU0FSVF9DUjFfUFMgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSB2YWx1ZQorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBVU0FSVF9DUjFfVEUsIFVTQVJUX0NSMV9SRSBiaXRzIGFjY29yZGluZyB0byBMUFVBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gdmFsdWUKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwKKyAgICAgICAgICAgICAgIChVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUpLAorICAgICAgICAgICAgICAgKExQVUFSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggfCBMUFVBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHwgTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIExQVUFSVHggQ1IyIChTdG9wIGJpdHMpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFN0b3AgQml0czogICAgICAgICAgVVNBUlRfQ1IyX1NUT1AgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzIHZhbHVlLgorICAgICAqLworICAgIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aChMUFVBUlR4LCBMUFVBUlRfSW5pdFN0cnVjdC0+U3RvcEJpdHMpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBMUFVBUlR4IENSMyAoSGFyZHdhcmUgRmxvdyBDb250cm9sKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBIYXJkd2FyZUZsb3dDb250cm9sOiBVU0FSVF9DUjNfUlRTRSwgVVNBUlRfQ1IzX0NUU0UgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUuCisgICAgICovCisgICAgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoTFBVQVJUeCwgTFBVQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHJpZXZlIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBMUFVBUlQgUGVyaXBoZXJhbAorICAgICAqLworICAgIHBlcmlwaGNsayA9IExMX1JDQ19HZXRMUFVBUlRDbG9ja0ZyZXEoTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgTFBVQVJUIEJhdWQgUmF0ZSA6CisgICAgICAgLSBwcmVzY2FsZXIgdmFsdWUgaXMgcmVxdWlyZWQKKyAgICAgICAtIHZhbGlkIGJhdWQgcmF0ZSB2YWx1ZSAoZGlmZmVyZW50IGZyb20gMCkgaXMgcmVxdWlyZWQKKyAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2sgYXMgcmV0dXJuZWQgYnkgUkNDIHNlcnZpY2UsIHNob3VsZCBiZSB2YWxpZCAoZGlmZmVyZW50IGZyb20gMCkuCisgICAgKi8KKyAgICBpZiAoKHBlcmlwaGNsayAhPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTykKKyAgICAgICAgJiYgKExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAhPSAwVSkpCisgICAgeworICAgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgICAgIExMX0xQVUFSVF9TZXRCYXVkUmF0ZShMUFVBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlwaGNsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFVBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAweDMwMCAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9CUlJfTUlOKExQVUFSVHgtPkJSUikpOworCisgICAgICAvKiBDaGVjayBCUlIgaXMgbG93ZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkZGICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0JSUl9NQVgoTFBVQVJUeC0+QlJSKSk7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBQUkVTQyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIExQVUFSVHggUFJFU0MgKFByZXNjYWxlcikgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gUHJlc2NhbGVyVmFsdWU6IExQVUFSVF9QUkVTQ19QUkVTQ0FMRVIgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlByZXNjYWxlclZhbHVlIHZhbHVlLgorICAgICAqLworICAgIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoTFBVQVJUeCwgTFBVQVJUX0luaXRTdHJ1Y3QtPlByZXNjYWxlclZhbHVlKTsKKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfTFBVQVJUX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtIExQVUFSVF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0xQVUFSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworCit2b2lkIExMX0xQVUFSVF9TdHJ1Y3RJbml0KExMX0xQVUFSVF9Jbml0VHlwZURlZiAqTFBVQVJUX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBMUFVBUlRfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlByZXNjYWxlclZhbHVlICAgICAgPSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE7CisgIExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAgICAgICAgICAgID0gOTYwMFU7CisgIExQVUFSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggICAgICAgICAgID0gTExfTFBVQVJUX0RBVEFXSURUSF84QjsKKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzICAgICAgICAgICAgPSBMTF9MUFVBUlRfU1RPUEJJVFNfMTsKKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSAgICAgICAgICAgICAgPSBMTF9MUFVBUlRfUEFSSVRZX05PTkUgOworICBMUFVBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gICA9IExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlg7CisgIExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sID0gTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoTFBVQVJUMSkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX3B3ci5jIGIvU3JjL3N0bTMyZzB4eF9sbF9wd3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFiN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9wd3IuYwpAQCAtMCwwICsxLDg1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3B3ci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQV1IgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3B3ci5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9idXMuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1IpCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUFdSX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFBXUiByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFBXUiByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1BXUl9EZUluaXQodm9pZCkKK3sKKyAgLyogRm9yY2UgcmVzZXQgb2YgUFdSIGNsb2NrICovCisgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICAvKiBSZWxlYXNlIHJlc2V0IG9mIFBXUiBjbG9jayAqLworICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfUFdSKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfcmNjLmMgYi9TcmMvc3RtMzJnMHh4X2xsX3JjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzk2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2xsX3JjYy5jCkBAIC0wLDAgKzEsMTAwMCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9yY2MuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUkNDIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcmNjLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSQ0MpCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkcwODF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzF4eCkgfHwgZGVmaW5lZChTVE0zMkcwNzB4eCkKKyNkZWZpbmUgSVNfTExfUkNDX1VTQVJUX0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRSkpCisjZWxpZiBkZWZpbmVkKFNUTTMyRzA0MXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMXh4KSB8fCBkZWZpbmVkKFNUTTMyRzAzMHh4KQorI2RlZmluZSBJU19MTF9SQ0NfVVNBUlRfQ0xLU09VUkNFKF9fVkFMVUVfXykgICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMUFVBUlQxKQorI2RlZmluZSBJU19MTF9SQ0NfTFBVQVJUX0NMS1NPVVJDRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX0xMX1JDQ19JMkNfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UpCisKKyNpZiBkZWZpbmVkKExQVElNMSkgfHwgZGVmaW5lZChMUFRJTTIpCisjZGVmaW5lIElTX0xMX1JDQ19MUFRJTV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFJORykKKyNkZWZpbmUgSVNfTExfUkNDX1JOR19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19STkdfQ0xLU09VUkNFKSkKKyNlbmRpZgorCisjZGVmaW5lIElTX0xMX1JDQ19BRENfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQURDX0NMS1NPVVJDRSkpCisKKworI2RlZmluZSBJU19MTF9SQ0NfSTJTX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0kyUzFfQ0xLU09VUkNFKSkKKworI2lmIGRlZmluZWQoQ0VDKQorI2RlZmluZSBJU19MTF9SQ0NfQ0VDX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0NFQ19DTEtTT1VSQ0UpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKSAmJiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xNVNFTCkKKyNkZWZpbmUgSVNfTExfUkNDX1RJTV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19USU0xX0NMS1NPVVJDRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTE1X0NMS1NPVVJDRSkpCisjZWxpZiBkZWZpbmVkKFJDQ19DQ0lQUl9USU0xU0VMKQorI2RlZmluZSBJU19MTF9SQ0NfVElNX0NMS1NPVVJDRShfX1ZBTFVFX18pICAgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1RJTTFfQ0xLU09VUkNFKSkKKyNlbmRpZgorCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfRnVuY3Rpb25zIFJDQyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCit1aW50MzJfdCBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKHZvaWQpOwordWludDMyX3QgUkNDX0dldEhDTEtDbG9ja0ZyZXEodWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSk7Cit1aW50MzJfdCBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEodWludDMyX3QgSENMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUyh2b2lkKTsKK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9BREModm9pZCk7Cit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fSTJTMSh2b2lkKTsKK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9STkcodm9pZCk7Cit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fVElNMSh2b2lkKTsKK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9USU0xNSh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgUkNDIGNsb2NrIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUuCisgICogQG5vdGUgICBUaGUgZGVmYXVsdCByZXNldCBzdGF0ZSBvZiB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBiZWxvdzoKKyAgKiAgICAgICAgIC0gSFNJIE9OIGFuZCB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiAgICAgICAgIC0gSFNFIGFuZCBQTEwgT0ZGCisgICogICAgICAgICAtIEFIQiBhbmQgQVBCMSBwcmVzY2FsZXIgc2V0IHRvIDEuCisgICogICAgICAgICAtIENTUywgTUNPIE9GRgorICAqICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlCisgICogICAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2tzCisgICogICAgICAgICAtIExTSSwgTFNFIGFuZCBSVEMgY2xvY2tzCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJDQyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JDQ19EZUluaXQodm9pZCkKK3sKKyAgLyogU2V0IEhTSU9OIGJpdCBhbmQgd2FpdCBmb3IgSFNJIFJFQURZIGJpdCAqLworICBMTF9SQ0NfSFNJX0VuYWJsZSgpOworICB3aGlsZSAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMVUpCisgIHt9CisKKyAgLyogU2V0IEhTSVRSSU0gYml0cyB0byByZXNldCB2YWx1ZSovCisgIExMX1JDQ19IU0lfU2V0Q2FsaWJUcmltbWluZygweDQwVSk7CisKKyAgLyogUmVzZXQgQ0ZHUiByZWdpc3RlciAqLworICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgMHgwMDAwMDAwMFUpOworCisgIC8qIFJlc2V0IHdob2xlIENSIHJlZ2lzdGVyIGJ1dCBIU0kgaW4gMiBzdGVwcyBpbiBjYXNlIEhTRUJZUCBpcyBzZXQgKi8KKyAgTExfUkNDX1dyaXRlUmVnKENSLCBSQ0NfQ1JfSFNJT04pOworICB3aGlsZSAoTExfUkNDX0hTRV9Jc1JlYWR5KCkgIT0gMFUpCisgIHt9CisgIExMX1JDQ19Xcml0ZVJlZyhDUiwgUkNDX0NSX0hTSU9OKTsKKworICAvKiBXYWl0IGZvciBQTEwgUkVBRFkgYml0IHRvIGJlIHJlc2V0ICovCisgIHdoaWxlIChMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkKKyAge30KKworICAvKiBSZXNldCBQTExDRkdSIHJlZ2lzdGVyICovCisgIExMX1JDQ19Xcml0ZVJlZyhQTExDRkdSLCAxNlUgPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworCisgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyAgTExfUkNDX1dyaXRlUmVnKENJRVIsIDB4MDAwMDAwMDBVKTsKKworICAvKiBDbGVhciBhbGwgaW50ZXJydXB0cyBmbGFncyAqLworICBMTF9SQ0NfV3JpdGVSZWcoQ0lDUiwgMHhGRkZGRkZGRlUpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX0VGX0dldF9GcmVxCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGZyZXF1ZW5jaWVzIG9mIGRpZmZlcmVudCBvbiBjaGlwIGNsb2NrczsgIFN5c3RlbSwgQUhCIGFuZCBBUEIxIGJ1c2VzIGNsb2NrcworICAqICAgICAgICAgYW5kIGRpZmZlcmVudCBwZXJpcGhlcmFsIGNsb2NrcyBhdmFpbGFibGUgb24gdGhlIGRldmljZS4KKyAgKiBAbm90ZSAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNJLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0lfVkFMVUUgZGl2aWRlZCBieSBIU0kgZGl2aXNpb24gZmFjdG9yKCoqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKiopCisgICogQG5vdGUgICBJZiBTWVNDTEsgc291cmNlIGlzIFBMTCwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gSFNFX1ZBTFVFKCoqKikKKyAgKiAgICAgICAgIG9yIEhTSV9WQUxVRSgqKikgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4KKyAgKiBAbm90ZSAgICgqKikgSFNJX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKGRlZmF1bHQgdmFsdWUKKyAgKiAgICAgICAgICAgICAgMTYgTUh6KSBidXQgdGhlIHJlYWwgdmFsdWUgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zCisgICogICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLgorICAqIEBub3RlICAgKCoqKikgSFNFX1ZBTFVFIGlzIGEgY29uc3RhbnQgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKGRlZmF1bHQgdmFsdWUKKyAgKiAgICAgICAgICAgICAgIDggTUh6KSwgdXNlciBoYXMgdG8gZW5zdXJlIHRoYXQgSFNFX1ZBTFVFIGlzIHNhbWUgYXMgdGhlIHJlYWwKKyAgKiAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCB1c2VkLiBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gbWF5CisgICogICAgICAgICAgICAgICBoYXZlIHdyb25nIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBpbmNvcnJlY3Qgd2hlbiB1c2luZyBmcmFjdGlvbmFsCisgICogICAgICAgICB2YWx1ZSBmb3IgSFNFIGNyeXN0YWwuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbXB1dGUgdGhlCisgICogICAgICAgICBiYXVkLXJhdGUgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzIG9yIGNvbmZpZ3VyZSBvdGhlciBwYXJhbWV0ZXJzLgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBmcmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgb24gY2hpcCBjbG9ja3M7ICBTeXN0ZW0sIEFIQiBhbmQgQVBCMSBidXNlcyBjbG9ja3MKKyAgKiBAbm90ZSAgIEVhY2ggdGltZSBTWVNDTEssIEhDTEsgYW5kL29yIFBDTEsxIGNsb2NrIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24KKyAgKiAgICAgICAgIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSBzdHJ1Y3R1cmUgZmllbGRzLiBPdGhlcndpc2UsIGFueQorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqIEBwYXJhbSAgUkNDX0Nsb2NrcyBwb2ludGVyIHRvIGEgQHJlZiBMTF9SQ0NfQ2xvY2tzVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBob2xkIHRoZSBjbG9ja3MgZnJlcXVlbmNpZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoTExfUkNDX0Nsb2Nrc1R5cGVEZWYgKlJDQ19DbG9ja3MpCit7CisgIC8qIEdldCBTWVNDTEsgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisKKyAgLyogSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgUkNDX0Nsb2Nrcy0+SENMS19GcmVxdWVuY3kgICA9IFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kpOworCisgIC8qIFBDTEsxIGNsb2NrIGZyZXF1ZW5jeSAqLworICBSQ0NfQ2xvY2tzLT5QQ0xLMV9GcmVxdWVuY3kgID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19DbG9ja3MtPkhDTEtfRnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gVVNBUlR4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVVNBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRQorICAqIEByZXR2YWwgVVNBUlQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0VVNBUlRDbG9ja0ZyZXEodWludDMyX3QgVVNBUlR4U291cmNlKQoreworICB1aW50MzJfdCB1c2FydF9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19VU0FSVF9DTEtTT1VSQ0UoVVNBUlR4U291cmNlKSk7CisKKyAgaWYgKFVTQVJUeFNvdXJjZSA9PSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIFVTQVJUMUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKFVTQVJUeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEs6IC8qIFVTQVJUMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0k6ICAgIC8qIFVTQVJUMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFOiAgICAvKiBVU0FSVDEgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsxOiAgLyogVVNBUlQxIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoUkNDX0NDSVBSX1VTQVJUMlNFTCkKKyAgZWxzZSBpZiAoVVNBUlR4U291cmNlID09IExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKQorICB7CisgICAgLyogVVNBUlQyQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UoVVNBUlR4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX1NZU0NMSzogLyogVVNBUlQyIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFX0hTSTogICAgLyogVVNBUlQyIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQyX0NMS1NPVVJDRV9MU0U6ICAgIC8qIFVTQVJUMiBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICB1c2FydF9mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMl9DTEtTT1VSQ0VfUENMSzE6ICAvKiBVU0FSVDIgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMS0Nsb2NrRnJlcShSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZQorICB7CisgIH0KKyAgcmV0dXJuIHVzYXJ0X2ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSTJDeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIEkyQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIEkyQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBIU0kgb3NjaWxsYXRvciBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRJMkNDbG9ja0ZyZXEodWludDMyX3QgSTJDeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgaTJjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoSTJDeFNvdXJjZSkpOworCisgIGlmIChJMkN4U291cmNlID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIEkyQzEgQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKEkyQ3hTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSzogLyogSTJDMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSTogICAgLyogSTJDMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMTogIC8qIEkyQzEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGkyY19mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgfQorCisgIHJldHVybiBpMmNfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBJMlN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgSTJTeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMlMxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgSTJTIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgICBAYXJnIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PIGluZGljYXRlcyB0aGF0IG9zY2lsbGF0b3IgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0STJTQ2xvY2tGcmVxKHVpbnQzMl90IEkyU3hTb3VyY2UpCit7CisgIHVpbnQzMl90IGkyc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19JMlNfQ0xLU09VUkNFKEkyU3hTb3VyY2UpKTsKKworICBpZiAoSTJTeFNvdXJjZSA9PSBMTF9SQ0NfSTJTMV9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBJMlMxIENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRJMlNDbG9ja1NvdXJjZShJMlN4U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9IU0k6ICAgIC8qIEkyUzEgQ2xvY2sgaXMgSFNJICovCisgICAgICAgIGkyc19mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9QTEw6ICAgIC8qIEkyUzEgQ2xvY2sgaXMgUExMIlAiICovCisgICAgICAgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGkyc19mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fSTJTMSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgTExfUkNDX0kyUzFfQ0xLU09VUkNFX1BJTjogICAgICAgICAgLyogSTJTMSBDbG9jayBpcyBFeHRlcm5hbCBjbG9jayAqLworICAgICAgICBpMnNfZnJlcXVlbmN5ID0gRVhURVJOQUxfQ0xPQ0tfVkFMVUU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19JMlMxX0NMS1NPVVJDRV9TWVNDTEs6IC8qIEkyUzEgQ2xvY2sgaXMgU3lzdGVtIENsb2NrICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBpMnNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gaTJzX2ZyZXF1ZW5jeTsKK30KKworI2lmIGRlZmluZWQoTFBVQVJUMSkKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExQVUFSVHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBMUFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFCisgICogQHJldHZhbCBMUFVBUlQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIEBhcmcgQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpCit7CisgIHVpbnQzMl90IGxwdWFydF9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19MUFVBUlRfQ0xLU09VUkNFKExQVUFSVHhTb3VyY2UpKTsKKworICAvKiBMUFVBUlQxQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZShMUFVBUlR4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSzogLyogTFBVQVJUMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0hTSTogICAgLyogTFBVQVJUMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBscHVhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0U6ICAgIC8qIExQVUFSVDEgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgbHB1YXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzE6ICAvKiBMUFVBUlQxIENsb2NrIGlzIFBDTEsxICovCisgICAgZGVmYXVsdDoKKyAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBscHVhcnRfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIExQVUFSVDEgKi8KKworI2lmIGRlZmluZWQoTFBUSU0xKSAmJiBkZWZpbmVkKExQVElNMikKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExQVElNeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIExQVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIExQVElNIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogICAgICAgICAtIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PIGluZGljYXRlcyB0aGF0IG9zY2lsbGF0b3IgKEhTSSwgTFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0TFBUSU1DbG9ja0ZyZXEodWludDMyX3QgTFBUSU14U291cmNlKQoreworICB1aW50MzJfdCBscHRpbV9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19MUFRJTV9DTEtTT1VSQ0UoTFBUSU14U291cmNlKSk7CisKKyAgaWYgKExQVElNeFNvdXJjZSA9PSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIExQVElNMUNMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlKExQVElNeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0k6ICAgIC8qIExQVElNMSBDbG9jayBpcyBMU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBMU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBMUFRJTTEgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRTogICAgLyogTFBUSU0xIENsb2NrIGlzIExTRSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGxwdGltX2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMTogIC8qIExQVElNMSBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTFBUSU0yQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTFBUSU14U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSTogICAgLyogTFBUSU0yIENsb2NrIGlzIExTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfTFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGxwdGltX2ZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9IU0k6ICAgIC8qIExQVElNMiBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNFOiAgICAvKiBMUFRJTTIgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX1BDTEsxOiAgLyogTFBUSU0yIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBscHRpbV9mcmVxdWVuY3k7Cit9CisjZW5kaWYgLyogTFBUSU0xICYmIExQVElNMiAqLworCisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVElNMVNFTCkgfHwgZGVmaW5lZChSQ0NfQ0NJUFJfVElNMTVTRUwpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBUSU14IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgVElNeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xX0NMS1NPVVJDRQorICAqIEBpZiBkZWZpbmVkKFNUTTMyRzA4MXh4KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19USU0xNV9DTEtTT1VSQ0UKKyAgKiBAZW5kaWYKKyAgKiBAcmV0dmFsIFRJTXggY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0VElNQ2xvY2tGcmVxKHVpbnQzMl90IFRJTXhTb3VyY2UpCit7CisgIHVpbnQzMl90IHRpbV9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19USU1fQ0xLU09VUkNFKFRJTXhTb3VyY2UpKTsKKworICBpZiAoVElNeFNvdXJjZSA9PSBMTF9SQ0NfVElNMV9DTEtTT1VSQ0UpCisgIHsKKyAgICAvKiBUSU0xQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldFRJTUNsb2NrU291cmNlKFRJTXhTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX1RJTTFfQ0xLU09VUkNFX1BMTDogICAgLyogVElNMSBDbG9jayBpcyBQTExRICovCisgICAgICAgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fVElNMSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19USU0xX0NMS1NPVVJDRV9QQ0xLMTogIC8qIFRJTTEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEtDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoVElNMTUpCisgIGVsc2UKKyAgeworICAgIGlmIChUSU14U291cmNlID09IExMX1JDQ19USU0xNV9DTEtTT1VSQ0UpCisgICAgeworICAgICAgLyogVElNMTVDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgICBzd2l0Y2ggKExMX1JDQ19HZXRUSU1DbG9ja1NvdXJjZShUSU14U291cmNlKSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BMTDogICAgLyogVElNMSBDbG9jayBpcyBQTExRICovCisgICAgICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRpbV9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fVElNMTUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTF9SQ0NfVElNMTVfQ0xLU09VUkNFX1BDTEsxOiAgLyogVElNMTUgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aW1fZnJlcXVlbmN5ID0gUkNDX0dldFBDTEsxQ2xvY2tGcmVxKFJDQ19HZXRIQ0xLQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiB0aW1fZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIFJDQ19DQ0lQUl9USU0xU0VMICYmIFJDQ19DQ0lQUl9USU0xNVNFTCAqLworCisKKyNpZiBkZWZpbmVkKFJORykKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFJOR3ggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBSTkd4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJORyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0kpIG9yIFBMTCBpcyBub3QgcmVhZHkKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkEgaW5kaWNhdGVzIHRoYXQgbm8gY2xvY2sgc291cmNlIHNlbGVjdGVkCisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0Uk5HQ2xvY2tGcmVxKHVpbnQzMl90IFJOR3hTb3VyY2UpCit7CisgIHVpbnQzMl90IHJuZ19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKyAgdWludDMyX3Qgcm5nZGl2OworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX1JOR19DTEtTT1VSQ0UoUk5HeFNvdXJjZSkpOworCisgIC8qIFJOR0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgc3dpdGNoIChMTF9SQ0NfR2V0Uk5HQ2xvY2tTb3VyY2UoUk5HeFNvdXJjZSkpCisgIHsKKyAgICBjYXNlIExMX1JDQ19STkdfQ0xLU09VUkNFX1BMTDogICAgICAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIFJORyBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgcm5nX2ZyZXF1ZW5jeSA9IFJDQ19QTExfR2V0RnJlcURvbWFpbl9STkcoKTsKKyAgICAgICAgcm5nZGl2ID0gKDFVTCA8PCAoKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdESVYpKSA+PiBSQ0NfQ0NJUFJfUk5HRElWX1BvcykpOworICAgICAgICBybmdfZnJlcXVlbmN5ID0gKHJuZ19mcmVxdWVuY3kgLyBybmdkaXYpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19STkdfQ0xLU09VUkNFX0hTSV9ESVY4OiAgICAgIC8qIEhTSSBjbG9jayBkaXZpZGVkIGJ5IDggdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgICAgICBybmdfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFIC8gOFU7CisgICAgICBybmdkaXYgPSAoMVVMIDw8ICgoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX1JOR0RJVikpID4+IFJDQ19DQ0lQUl9STkdESVZfUG9zKSk7CisgICAgICBybmdfZnJlcXVlbmN5ID0gKHJuZ19mcmVxdWVuY3kgLyBybmdkaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAvKiBTWVNDTEsgY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgICAgICBybmdfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgcm5nZGl2ID0gKDFVTCA8PCAoKFJFQURfQklUKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdESVYpKSA+PiBSQ0NfQ0NJUFJfUk5HRElWX1BvcykpOworICAgICAgcm5nX2ZyZXF1ZW5jeSA9IChybmdfZnJlcXVlbmN5IC8gcm5nZGl2KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9OT05FOiAgICAgICAgICAvKiBObyBjbG9jayB1c2VkIGFzIFJORyBjbG9jayBzb3VyY2UgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcm5nX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BOworICAgICAgYnJlYWs7CisKKyAgfQorCisgIHJldHVybiBybmdfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIFJORyAqLworCisjaWYgZGVmaW5lZChDRUMpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBDRUMgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBDRUN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NFQ19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIENFQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0kgb3IgTFNFKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRDRUNDbG9ja0ZyZXEodWludDMyX3QgQ0VDeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgY2VjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0NFQ19DTEtTT1VSQ0UoQ0VDeFNvdXJjZSkpOworCisgIC8qIENFQ0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgc3dpdGNoIChMTF9SQ0NfR2V0Q0VDQ2xvY2tTb3VyY2UoQ0VDeFNvdXJjZSkpCisgIHsKKyAgICBjYXNlIExMX1JDQ19DRUNfQ0xLU09VUkNFX0xTRTogICAgICAgICAgIC8qIENFQyBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBjZWNfZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19DRUNfQ0xLU09VUkNFX0hTSV9ESVY0ODg6ICAgIC8qIENFQyBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGNlY19mcmVxdWVuY3kgPSAoSFNJX1ZBTFVFIC8gNDg4VSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBjZWNfZnJlcXVlbmN5OworfQorI2VuZGlmIC8qIENFQyAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBBREN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgQURDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFCisgICogQHJldHZhbCBBREMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJKSBvciBQTEwgaXMgbm90IHJlYWR5CisgICogICAgICAgICAtIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldEFEQ0Nsb2NrRnJlcSh1aW50MzJfdCBBREN4U291cmNlKQoreworICB1aW50MzJfdCBhZGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfQURDX0NMS1NPVVJDRShBREN4U291cmNlKSk7CisKKyAgLyogQURDQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZShBREN4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0FEQ19DTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgLyogU1lTQ0xLIGNsb2NrIHVzZWQgYXMgQURDIGNsb2NrIHNvdXJjZSAqLworICAgICAgYWRjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfUkNDX0FEQ19DTEtTT1VSQ0VfSFNJICA6ICAgICAgICAvKiBIU0kgY2xvY2sgdXNlZCBhcyBBREMgY2xvY2sgc291cmNlICovCisgICAgICBhZGNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTDogICAgICAgICAvKiBQTExQIGNsb2NrIHVzZWQgYXMgQURDIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBhZGNfZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX0FEQygpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFkY19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGFkY19mcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFJUQyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIFJUQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9ycyAoTFNJLCBMU0Ugb3IgSFNFKSBhcmUgbm90IHJlYWR5CisgICogICAgICAgICAtIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldFJUQ0Nsb2NrRnJlcSh2b2lkKQoreworICB1aW50MzJfdCBydGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogUlRDQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRSVENDbG9ja1NvdXJjZSgpKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0U6ICAgICAgIC8qIExTRSBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgcnRjX2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0k6ICAgICAgIC8qIExTSSBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfTFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgcnRjX2ZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzI6ICAgICAgICAvKiBIU0UgY2xvY2sgdXNlZCBhcyBBREMgY2xvY2sgc291cmNlICovCisgICAgICBydGNfZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMzJVOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkU6ICAgICAgICAgIC8qIE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBydGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkE7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBydGNfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gU1lTVEVNIGNsb2NrIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgU1lTVEVNIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IGZyZXF1ZW5jeTsKKyAgdWludDMyX3QgaHNpZGl2OworCisgIC8qIEdldCBTWVNDTEsgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBzd2l0Y2ggKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRTogIC8qIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBIU0VfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX1BMTDogIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTSTogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIGhzaWRpdiA9ICgxVUwgPDwgKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJRElWKSkgPj4gUkNDX0NSX0hTSURJVl9Qb3MpKTsKKyAgICAgIGZyZXF1ZW5jeSA9IChIU0lfVkFMVUUgLyBoc2lkaXYpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgU1lTQ0xLX0ZyZXF1ZW5jeSBTWVNDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0SENMS0Nsb2NrRnJlcSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5KQoreworICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoU1lTQ0xLX0ZyZXF1ZW5jeSwgTExfUkNDX0dldEFIQlByZXNjYWxlcigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUENMSzEgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBIQ0xLX0ZyZXF1ZW5jeSBIQ0xLIGNsb2NrIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgUENMSzEgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSkKK3sKKyAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoSENMS19GcmVxdWVuY3ksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpOworfQorLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBzeXN0ZW0gZG9tYWluCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9TWVModm9pZCkKK3sKKyAgdWludDMyX3QgcGxsaW5wdXRmcmVxLCBwbGxzb3VyY2U7CisKKyAgLyogUExMX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFIC8gUExMTSkgKiBQTExOCisgICAgIFNZU0NMSyA9IFBMTF9WQ08gLyBQTExSCisgICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTENMS19GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFIoKSk7Cit9CisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTEwgY2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIEFEQyBkb21haW4KKyAgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX0FEQyh2b2lkKQoreworICB1aW50MzJfdCBwbGxpbnB1dGZyZXEsIHBsbHNvdXJjZTsKKworICAvKiBQTExfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgLyBQTExNKSAqIFBMTE4KKyAgICAgQURDIERvbWFpbiBjbG9jayA9IFBMTF9WQ08gLyBQTExQCisgICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX0FEQ19GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMX0dldE4oKSwgTExfUkNDX1BMTF9HZXRQKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTEwgY2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIEkyUzEgZG9tYWluCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9JMlMxKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTE0pICogUExMTgorICAgICBJMlMxIERvbWFpbiBjbG9jayA9IFBMTF9WQ08gLyBQTExQCisgICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX0kyUzFfRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFAoKSk7Cit9CisKKyNpZiBkZWZpbmVkKFJORykKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBMTCBjbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgUk5HIGRvbWFpbgorICAqIEByZXR2YWwgUExMIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fUk5HKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTE0gKSAqIFBMTE4KKworICAgICBSTkcgRG9tYWluIGNsb2NrID0gUExMX1ZDTyAvIFBMTFEKKyAgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNFOiAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExDTEtfUk5HX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFEoKSk7Cit9CisjZW5kaWYgLyogUk5HICovCisKKyNpZiBkZWZpbmVkKFJDQ19QTExRX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTEwgY2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFRJTTEgZG9tYWluCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9USU0xKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTE0gKSAqIFBMTE4KKworICAgICBUSU0xIERvbWFpbiBjbG9jayA9IFBMTF9WQ08gLyBQTExRCisgICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX1RJTTFfRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFEoKSk7Cit9CisjZW5kaWYgLyogUkNDX1BMTFFfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSQ0NfUExMUV9TVVBQT1JUKSAmJiBkZWZpbmVkKFRJTTE1KQorLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBUSU0xNSBkb21haW4KKyAgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1RJTTE1KHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSAvIFBMTE0gKSAqIFBMTE4KKworICAgICBUSU0xNSBEb21haW4gY2xvY2sgPSBQTExfVkNPIC8gUExMUQorICAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0k6ICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTENMS19USU0xNV9GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFEoKSk7Cit9CisjZW5kaWYgLyogUkNDX1BMTFFfU1VQUE9SVCAmJiBUSU0xNSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUkNDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX3JuZy5jIGIvU3JjL3N0bTMyZzB4eF9sbF9ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg3NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF9ybmcuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF9ybmcuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUk5HIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9ybmcuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFJORykKKworLyoqIEBhZGR0b2dyb3VwIFJOR19MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9Qcml2YXRlX01hY3JvcyBSTkcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9STkdfQ0VEKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gTExfUk5HX0NFRF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IExMX1JOR19DRURfRElTQUJMRSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUk5HX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBSTkcgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUk5HIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUk5HX0RlSW5pdChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JOR19BTExfSU5TVEFOQ0UoUk5HeCkpOworCisgIC8qIEVuYWJsZSBSTkcgcmVzZXQgc3RhdGUgKi8KKyAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9STkcpOworCisgIC8qIFJlbGVhc2UgUk5HIGZyb20gcmVzZXQgc3RhdGUgKi8KKyAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX1JORyk7CisKKyAgcmV0dXJuIChTVUNDRVNTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIFJORyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBSTkdfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHBhcmFtICBSTkdfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIExMX1JOR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgUk5HIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJORyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBSTkdfSW5pdFN0cnVjdCBjb250ZW50CisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JOR19Jbml0KFJOR19UeXBlRGVmICpSTkd4LCBMTF9STkdfSW5pdFR5cGVEZWYgKlJOR19Jbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUk5HX0FMTF9JTlNUQU5DRShSTkd4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9STkdfQ0VEKFJOR19Jbml0U3RydWN0LT5DbG9ja0Vycm9yRGV0ZWN0aW9uKSk7CisKKyAgLyogQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhSTkd4LT5DUiwgUk5HX0NSX0NFRCwgUk5HX0luaXRTdHJ1Y3QtPkNsb2NrRXJyb3JEZXRlY3Rpb24pOworCisgIHJldHVybiAoU1VDQ0VTUyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX1JOR19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBSTkdfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9STkdfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUk5HX1N0cnVjdEluaXQoTExfUk5HX0luaXRUeXBlRGVmICpSTkdfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFJOR19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBSTkdfSW5pdFN0cnVjdC0+Q2xvY2tFcnJvckRldGVjdGlvbiA9IExMX1JOR19DRURfRU5BQkxFOworCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChSTkcpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9ydGMuYyBiL1NyYy9zdG0zMmcweHhfbGxfcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMWZjYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfbGxfcnRjLmMKQEAgLTAsMCArMSw4NzMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfcnRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJUQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcnRjLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2NvcnRleC5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChSVEMpCisKKy8qKiBAYWRkdG9ncm91cCBSVENfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIERlZmF1bHQgdmFsdWVzIHVzZWQgZm9yIHByZXNjYWxlciAqLworI2RlZmluZSBSVENfQVNZTkNIX1BSRVNDX0RFRkFVTFQgICAgIDB4MDAwMDAwN0ZVCisjZGVmaW5lIFJUQ19TWU5DSF9QUkVTQ19ERUZBVUxUICAgICAgMHgwMDAwMDBGRlUKKworLyogVmFsdWVzIHVzZWQgZm9yIHRpbWVvdXQgKi8KKyNkZWZpbmUgUlRDX0lOSVRNT0RFX1RJTUVPVVQgICAgICAgICAxMDAwVSAvKiAxcyB3aGVuIHRpY2sgc2V0IHRvIDFtcyAqLworI2RlZmluZSBSVENfU1lOQ0hST19USU1FT1VUICAgICAgICAgIDEwMDBVIC8qIDFzIHdoZW4gdGljayBzZXQgdG8gMW1zICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfUlRDX0hPVVJGT1JNQVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0hPVVJGT1JNQVRfQU1QTSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FTWU5DSF9QUkVESVYoX19WQUxVRV9fKSAgICgoX19WQUxVRV9fKSA8PSAweDdGVSkKKworI2RlZmluZSBJU19MTF9SVENfU1lOQ0hfUFJFRElWKF9fVkFMVUVfXykgICAgKChfX1ZBTFVFX18pIDw9IDB4N0ZGRlUpCisKKyNkZWZpbmUgSVNfTExfUlRDX0ZPUk1BVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0ZPUk1BVF9CSU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0ZPUk1BVF9CQ0QpKQorCisjZGVmaW5lIElTX0xMX1JUQ19USU1FX0ZPUk1BVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1RJTUVfRk9STUFUX1BNKSkKKworI2RlZmluZSBJU19MTF9SVENfSE9VUjEyKF9fSE9VUl9fKSAgICAgICAgICAgICgoKF9fSE9VUl9fKSA+IDBVKSAmJiAoKF9fSE9VUl9fKSA8PSAxMlUpKQorI2RlZmluZSBJU19MTF9SVENfSE9VUjI0KF9fSE9VUl9fKSAgICAgICAgICAgICgoX19IT1VSX18pIDw9IDIzVSkKKyNkZWZpbmUgSVNfTExfUlRDX01JTlVURVMoX19NSU5VVEVTX18pICAgICAgICAoKF9fTUlOVVRFU19fKSA8PSA1OVUpCisjZGVmaW5lIElTX0xMX1JUQ19TRUNPTkRTKF9fU0VDT05EU19fKSAgICAgICAgKChfX1NFQ09ORFNfXykgPD0gNTlVKQorCisjZGVmaW5lIElTX0xMX1JUQ19XRUVLREFZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9NT05EQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1RVRVNEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX0ZSSURBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0RBWShfX0RBWV9fKSAgICAoKChfX0RBWV9fKSA+PSAxVSkgJiYgKChfX0RBWV9fKSA8PSAzMVUpKQorCisjZGVmaW5lIElTX0xMX1JUQ19NT05USChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0pBTlVBUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfRkVCUlVBUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTUFSQ0gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfQVBSSUwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTUFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0pVTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfSlVMWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9BVUdVU1QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfU0VQVEVNQkVSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX09DVE9CRVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfTk9WRU1CRVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfREVDRU1CRVIpKQorCisjZGVmaW5lIElTX0xMX1JUQ19ZRUFSKF9fWUVBUl9fKSAoKF9fWUVBUl9fKSA8PSA5OVUpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUFfTUFTSyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfREFURVdFRUtEQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19IT1VSUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX01JTlVURVMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19TRUNPTkRTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfQUxMKSkKKworI2RlZmluZSBJU19MTF9SVENfQUxNQl9NQVNLKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX0hPVVJTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfTUlOVVRFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19BTEwpKQorCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUFfREFURV9XRUVLREFZX1NFTChfX1NFTF9fKSAoKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxfXykgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfV0VFS0RBWSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX0FMTUJfREFURV9XRUVLREFZX1NFTChfX1NFTF9fKSAoKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxfXykgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfV0VFS0RBWSkpCisKKworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBSVEMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgUlRDIENsb2NrIHNvdXJjZSBhbmQgUlRDIEJhY2t1cCBEYXRhCisgICogICAgICAgICByZWdpc3RlcnMuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0RlSW5pdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBSZXNldCBUUiwgRFIgYW5kIENSIHJlZ2lzdGVycyAqLworICAgIFdSSVRFX1JFRyhSVEN4LT5UUiwgICAgICAgMHgwMDAwMDAwMFUpOworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorICAgIFdSSVRFX1JFRyhSVEN4LT5XVVRSLCAgICAgUlRDX1dVVFJfV1VUKTsKKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+RFIgICwgICAgIChSVENfRFJfV0RVXzAgfCBSVENfRFJfTVVfMCB8IFJUQ19EUl9EVV8wKSk7CisgICAgLyogUmVzZXQgQWxsIENSIGJpdHMgZXhjZXB0IENSWzI6MF0gKi8KKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKyAgICBXUklURV9SRUcoUlRDeC0+Q1IsIChSRUFEX1JFRyhSVEN4LT5DUikgJiBSVENfQ1JfV1VDS1NFTCkpOworI2Vsc2UKKyAgICBXUklURV9SRUcoUlRDeC0+Q1IsIDB4MDAwMDAwMDBVKTsKKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+UFJFUiwgICAgIChSVENfUFJFUl9QUkVESVZfQSB8IFJUQ19TWU5DSF9QUkVTQ19ERUZBVUxUKSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPkFMUk1BUiwgICAweDAwMDAwMDAwVSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPkFMUk1CUiwgICAweDAwMDAwMDAwVSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPlNISUZUUiwgICAweDAwMDAwMDAwVSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPkNBTFIsICAgICAweDAwMDAwMDAwVSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPkFMUk1BU1NSLCAweDAwMDAwMDAwVSk7CisgICAgV1JJVEVfUkVHKFJUQ3gtPkFMUk1CU1NSLCAweDAwMDAwMDAwVSk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQ3gpOworCisgICAgLyogV2FpdCB0aWxsIHRoZSBSVEMgUlNGIGZsYWcgaXMgc2V0ICovCisgICAgc3RhdHVzID0gTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ3gpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUlRDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiBSVENfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQG5vdGUgICBUaGUgUlRDIFByZXNjYWxlciByZWdpc3RlciBpcyB3cml0ZSBwcm90ZWN0ZWQgYW5kIGNhbiBiZSB3cml0dGVuIGluCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVJGT1JNQVQoUlRDX0luaXRTdHJ1Y3QtPkhvdXJGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BU1lOQ0hfUFJFRElWKFJUQ19Jbml0U3RydWN0LT5Bc3luY2hQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TWU5DSF9QUkVESVYoUlRDX0luaXRTdHJ1Y3QtPlN5bmNoUHJlc2NhbGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBTZXQgSG91ciBGb3JtYXQgKi8KKyAgICBMTF9SVENfU2V0SG91ckZvcm1hdChSVEN4LCBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCk7CisKKyAgICAvKiBDb25maWd1cmUgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yICovCisgICAgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyKFJUQ3gsIFJUQ19Jbml0U3RydWN0LT5TeW5jaFByZXNjYWxlcik7CisgICAgTExfUlRDX1NldEFzeW5jaFByZXNjYWxlcihSVEN4LCBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDeCk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIFJUQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFJUQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCAgICAgID0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSOworICBSVENfSW5pdFN0cnVjdC0+QXN5bmNoUHJlc2NhbGVyID0gUlRDX0FTWU5DSF9QUkVTQ19ERUZBVUxUOworICBSVENfSW5pdFN0cnVjdC0+U3luY2hQcmVzY2FsZXIgID0gUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgUlRDX1RpbWVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgVGltZSByZWdpc3RlciBpcyBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIFRpbWUgcmVnaXN0ZXIgaXMgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19USU1FX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19UaW1lVHlwZURlZiAqUlRDX1RpbWVTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworCisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChSVENfVGltZVN0cnVjdC0+SG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+SG91cnMpKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+U2Vjb25kcykpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ3gpICE9IEVSUk9SKQorICB7CisgICAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX1RJTUVfQ29uZmlnKFJUQ3gsIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0LCBSVENfVGltZVN0cnVjdC0+SG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMsIFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19USU1FX0NvbmZpZyhSVEN4LCBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19UaW1lU3RydWN0LT5NaW51dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMpKTsKKyAgICB9CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQyk7CisKKyAgICAvKiBJZiAgUlRDX0NSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmIChMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkKFJUQ3gpID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVEN4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1pbjowMHNlYykuCisgICogQHBhcmFtICBSVENfVGltZVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfVGltZVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCkKK3sKKyAgLyogVGltZSA9IDAwaDowMG1pbjowMHNlYyAqLworICBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCA9IExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNDsKKyAgUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzICAgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMgICAgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBjdXJyZW50IGRhdGUuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19EYXRlU3RydWN0IHBvaW50ZXIgdG8gYSBSVENfRGF0ZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUlRDLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgRGF5IHJlZ2lzdGVyIGlzIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgRGF5IHJlZ2lzdGVyIGlzIG5vdCBjb25maWd1cmVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfREFURV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfRk9STUFUKFJUQ19Gb3JtYXQpKTsKKworICBpZiAoKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pICYmICgoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoICYgMHgxMFUpID09IDB4MTBVKSkKKyAgeworICAgIFJUQ19EYXRlU3RydWN0LT5Nb250aCA9IChSVENfRGF0ZVN0cnVjdC0+TW9udGggJiAodWludDhfdCl+KDB4MTBVKSkgKyAweDBBVTsKKyAgfQorICBpZiAoUlRDX0Zvcm1hdCA9PSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfWUVBUihSVENfRGF0ZVN0cnVjdC0+WWVhcikpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTU9OVEgoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoUlRDX0RhdGVTdHJ1Y3QtPkRheSkpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfWUVBUihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0RhdGVTdHJ1Y3QtPlllYXIpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NT05USChfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoKSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfRGF0ZVN0cnVjdC0+RGF5KSkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSkpOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ3gpICE9IEVSUk9SKQorICB7CisgICAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX0RBVEVfQ29uZmlnKFJUQ3gsIFJUQ19EYXRlU3RydWN0LT5XZWVrRGF5LCBSVENfRGF0ZVN0cnVjdC0+RGF5LCBSVENfRGF0ZVN0cnVjdC0+TW9udGgsIFJUQ19EYXRlU3RydWN0LT5ZZWFyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19EQVRFX0NvbmZpZyhSVEN4LCBSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19EYXRlU3RydWN0LT5EYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfRGF0ZVN0cnVjdC0+TW9udGgpLCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0RhdGVTdHJ1Y3QtPlllYXIpKTsKKyAgICB9CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQyk7CisKKyAgICAvKiBJZiAgUlRDX0NSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmIChMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkKFJUQ3gpID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVEN4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfRGF0ZVR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoZGF0ZSA9IE1vbmRheSwgSmFudWFyeSAwMSB4eDAwKQorICAqIEBwYXJhbSAgUlRDX0RhdGVTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0RhdGVUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9SVENfREFURV9TdHJ1Y3RJbml0KExMX1JUQ19EYXRlVHlwZURlZiAqUlRDX0RhdGVTdHJ1Y3QpCit7CisgIC8qIE1vbmRheSwgSmFudWFyeSAwMSB4eDAwICovCisgIFJUQ19EYXRlU3RydWN0LT5XZWVrRGF5ID0gTExfUlRDX1dFRUtEQVlfTU9OREFZOworICBSVENfRGF0ZVN0cnVjdC0+RGF5ICAgICA9IDFVOworICBSVENfRGF0ZVN0cnVjdC0+TW9udGggICA9IExMX1JUQ19NT05USF9KQU5VQVJZOworICBSVENfRGF0ZVN0cnVjdC0+WWVhciAgICA9IDBVOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUlRDIEFsYXJtIEEuCisgICogQG5vdGUgICBUaGUgQWxhcm0gcmVnaXN0ZXIgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEFsYXJtCisgICogICAgICAgICBpcyBkaXNhYmxlZCAoVXNlIEByZWYgTExfUlRDX0FMTUFfRGlzYWJsZSBmdW5jdGlvbikuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19BbGFybVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGFsYXJtIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQUxBUk1BIHJlZ2lzdGVycyBhcmUgY29uZmlndXJlZAorICAqICAgICAgICAgIC0gRVJST1I6IEFMQVJNQSByZWdpc3RlcnMgYXJlIG5vdCBjb25maWd1cmVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfQUxNQV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUFfTUFTSyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUFfREFURV9XRUVLREFZX1NFTChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwpKTsKKworICBpZiAoUlRDX0Zvcm1hdCA9PSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIGlmIChMTF9SVENfR2V0SG91ckZvcm1hdChSVEN4KSAhPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMTIoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKSk7CisKKyAgICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2VsZWN0IHdlZWtkYXkgc2VsZWN0aW9uICovCisgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSkKKyAgeworICAgIC8qIFNldCB0aGUgZGF0ZSBmb3IgQUxBUk0gKi8KKyAgICBMTF9SVENfQUxNQV9EaXNhYmxlV2Vla2RheShSVEN4KTsKKyAgICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgICBMTF9SVENfQUxNQV9TZXREYXkoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19BTE1BX1NldERheShSVEN4LCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgd2VlayBkYXkgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUFfRW5hYmxlV2Vla2RheShSVEN4KTsKKyAgICBMTF9SVENfQUxNQV9TZXRXZWVrRGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHJlZ2lzdGVyICovCisgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpOworICB9CisgIGVsc2UKKyAgeworICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworICB9CisgIC8qIFNldCBBTEFSTSBtYXNrICovCisgIExMX1JUQ19BTE1BX1NldE1hc2soUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUlRDIEFsYXJtIEIuCisgICogQG5vdGUgICBUaGUgQWxhcm0gcmVnaXN0ZXIgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEFsYXJtCisgICogICAgICAgICBpcyBkaXNhYmxlZCAoQHJlZiBMTF9SVENfQUxNQl9EaXNhYmxlIGZ1bmN0aW9uKS4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JDRAorICAqIEBwYXJhbSAgUlRDX0FsYXJtU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgYWxhcm0gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBTEFSTUIgcmVnaXN0ZXJzIGFyZSBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogQUxBUk1CIHJlZ2lzdGVycyBhcmUgbm90IGNvbmZpZ3VyZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19BTE1CX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFJUQ19Gb3JtYXQsIExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0ZPUk1BVChSVENfRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfQUxNQl9NQVNLKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfQUxNQl9EQVRFX1dFRUtEQVlfU0VMKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworCisgIGlmIChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcykpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfU0VDT05EUyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSk7CisKKyAgICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGlmIChMTF9SVENfR2V0SG91ckZvcm1hdChSVEN4KSAhPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMTIoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIyNChfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgfQorCisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfU0VDT05EUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpKTsKKworICAgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZWxlY3Qgd2Vla2RheSBzZWxlY3Rpb24gKi8KKyAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICB7CisgICAgLyogU2V0IHRoZSBkYXRlIGZvciBBTEFSTSAqLworICAgIExMX1JUQ19BTE1CX0Rpc2FibGVXZWVrZGF5KFJUQ3gpOworICAgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICAgIHsKKyAgICAgIExMX1JUQ19BTE1CX1NldERheShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTExfUlRDX0FMTUJfU2V0RGF5KFJUQ3gsIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSB3ZWVrIGRheSBmb3IgQUxBUk0gKi8KKyAgICBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5KFJUQ3gpOworICAgIExMX1JUQ19BTE1CX1NldFdlZWtEYXkoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcywgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSk7CisgIH0KKyAgLyogU2V0IEFMQVJNIG1hc2sgKi8KKyAgTExfUlRDX0FMTUJfU2V0TWFzayhSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzayk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIG9mIEFMQVJNQSBmaWVsZCB0byBkZWZhdWx0IHZhbHVlIChUaW1lID0gMDBoOjAwbW46MDBzZWMgLworICAqICAgICAgICAgRGF5ID0gMXN0IGRheSBvZiB0aGUgbW9udGgvTWFzayA9IGFsbCBmaWVsZHMgYXJlIG1hc2tlZCkuCisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX0FMTUFfU3RydWN0SW5pdChMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIEFsYXJtIFRpbWUgU2V0dGluZ3MgOiBUaW1lID0gMDBoOjAwbW46MDBzZWMgKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX0FNOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyAgICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcyAgICA9IDBVOworCisgIC8qIEFsYXJtIERheSBTZXR0aW5ncyA6IERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSAgICA9IDFVOworCisgIC8qIEFsYXJtIE1hc2tzIFNldHRpbmdzIDogTWFzayA9ICBhbGwgZmllbGRzIGFyZSBub3QgbWFza2VkICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrICAgICAgICAgICA9IExMX1JUQ19BTE1BX01BU0tfTk9ORTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgb2YgQUxBUk1BIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUgKFRpbWUgPSAwMGg6MDBtbjowMHNlYyAvCisgICogICAgICAgICBEYXkgPSAxc3QgZGF5IG9mIHRoZSBtb250aC9NYXNrID0gYWxsIGZpZWxkcyBhcmUgbWFza2VkKS4KKyAgKiBAcGFyYW0gIFJUQ19BbGFybVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9SVENfQUxNQl9TdHJ1Y3RJbml0KExMX1JUQ19BbGFybVR5cGVEZWYgKlJUQ19BbGFybVN0cnVjdCkKK3sKKyAgLyogQWxhcm0gVGltZSBTZXR0aW5ncyA6IFRpbWUgPSAwMGg6MDBtbjowMHNlYyAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU07CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzICAgICAgPSAwVTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcyAgICA9IDBVOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzICAgID0gMFU7CisKKyAgLyogQWxhcm0gRGF5IFNldHRpbmdzIDogRGF5ID0gMXN0IGRheSBvZiB0aGUgbW9udGggKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5ICAgID0gMVU7CisKKyAgLyogQWxhcm0gTWFza3MgU2V0dGluZ3MgOiBNYXNrID0gIGFsbCBmaWVsZHMgYXJlIG5vdCBtYXNrZWQgKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2sgICAgICAgICAgID0gTExfUlRDX0FMTUJfTUFTS19OT05FOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVudGVycyB0aGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUuCisgICogQG5vdGUgICBUaGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgd3JpdGUgcHJvdGVjdGVkLCB1c2UgdGhlCisgICogICAgICAgICBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgaXMgaW4gSW5pdCBtb2RlCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIGlzIG5vdCBpbiBJbml0IG1vZGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBfX0lPIHVpbnQzMl90IHRpbWVvdXQgPSBSVENfSU5JVE1PREVfVElNRU9VVDsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIENoZWNrIGlmIHRoZSBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHNldCAqLworICBpZiAoTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ3gpID09IDBVKQorICB7CisgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX0VuYWJsZUluaXRNb2RlKFJUQ3gpOworCisgICAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQoUlRDeCk7CisgICAgd2hpbGUgKCh0aW1lb3V0ICE9IDBVKSAmJiAodG1wICE9IDFVKSkKKyAgICB7CisgICAgICBpZiAoTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHRpbWVvdXQgLS07CisgICAgICB9CisgICAgICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQoUlRDeCk7CisgICAgICBpZiAodGltZW91dCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRXhpdCB0aGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpcyBjb21wbGV0ZSwgdGhlIGNhbGVuZGFyIHJlc3RhcnRzCisgICogICAgICAgICBjb3VudGluZyBhZnRlciA0IFJUQ0NMSyBjeWNsZXMuCisgICogQG5vdGUgICBUaGUgUlRDIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgd3JpdGUgcHJvdGVjdGVkLCB1c2UgdGhlCisgICogICAgICAgICBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgZXhpdGVkIGZyb20gaW4gSW5pdCBtb2RlCisgICogICAgICAgICAgLSBFUlJPUjogTm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19FeGl0SW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIERpc2FibGUgaW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBMTF9SVENfRGlzYWJsZUluaXRNb2RlKFJUQ3gpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdhaXRzIHVudGlsIHRoZSBSVEMgVGltZSBhbmQgRGF5IHJlZ2lzdGVycyAoUlRDX1RSIGFuZCBSVENfRFIpIGFyZQorICAqICAgICAgICAgc3luY2hyb25pemVkIHdpdGggUlRDIEFQQiBjbG9jay4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgUmVzeW5jaHJvbml6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIKKyAgKiAgICAgICAgIGluaXRpYWxpemF0aW9uLCBjYWxlbmRhciB1cGRhdGUgb3IgYWZ0ZXIgd2FrZXVwIGZyb20gbG93IHBvd2VyIG1vZGVzCisgICogICAgICAgICB0aGUgc29mdHdhcmUgbXVzdCBmaXJzdCBjbGVhciB0aGUgUlNGIGZsYWcuCisgICogICAgICAgICBUaGUgc29mdHdhcmUgbXVzdCB0aGVuIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nCisgICogICAgICAgICB0aGUgY2FsZW5kYXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGVuZGFyIHJlZ2lzdGVycyBoYXZlIGJlZW4KKyAgKiAgICAgICAgIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUgUlRDX1RSIGFuZCBSVENfRFIgc2hhZG93IHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyByZWdpc3RlcnMgYXJlIHN5bmNocm9uaXNlZAorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyByZWdpc3RlcnMgYXJlIG5vdCBzeW5jaHJvbmlzZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0ID0gUlRDX1NZTkNIUk9fVElNRU9VVDsKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIENsZWFyIFJTRiBmbGFnICovCisgIExMX1JUQ19DbGVhckZsYWdfUlMoUlRDeCk7CisKKyAgLyogV2FpdCB0aGUgcmVnaXN0ZXJzIHRvIGJlIHN5bmNocm9uaXNlZCAqLworICB0bXAgPSBMTF9SVENfSXNBY3RpdmVGbGFnX1JTKFJUQ3gpOworICB3aGlsZSAoKHRpbWVvdXQgIT0gMFUpICYmICh0bXAgIT0gMFUpKQorICB7CisgICAgaWYgKExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZygpID09IDFVKQorICAgIHsKKyAgICAgIHRpbWVvdXQtLTsKKyAgICB9CisgICAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVEN4KTsKKyAgICBpZiAodGltZW91dCA9PSAwVSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAoc3RhdHVzICE9IEVSUk9SKQorICB7CisgICAgdGltZW91dCA9IFJUQ19TWU5DSFJPX1RJTUVPVVQ7CisgICAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVEN4KTsKKyAgICB3aGlsZSAoKHRpbWVvdXQgIT0gMFUpICYmICh0bXAgIT0gMVUpKQorICAgIHsKKyAgICAgIGlmIChMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgdGltZW91dC0tOworICAgICAgfQorICAgICAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVEN4KTsKKyAgICAgIGlmICh0aW1lb3V0ID09IDBVKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJUQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF9zcGkuYyBiL1NyYy9zdG0zMmcweHhfbGxfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNjhmMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfbGxfc3BpLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfc3BpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNQSSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3NwaS5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9idXMuaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcmNjLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpCisKKy8qKiBAYWRkdG9ncm91cCBTUElfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFNQSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBTUEkgcmVnaXN0ZXJzIE1hc2tzICovCisjZGVmaW5lIFNQSV9DUjFfQ0xFQVJfTUFTSyAgICAgICAgICAgICAgICAgKFNQSV9DUjFfQ1BIQSAgICB8IFNQSV9DUjFfQ1BPTCAgICAgfCBTUElfQ1IxX01TVFIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9CUiAgICAgIHwgU1BJX0NSMV9MU0JGSVJTVCB8IFNQSV9DUjFfU1NJICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IxX1NTTSAgICAgfCBTUElfQ1IxX1JYT05MWSAgIHwgU1BJX0NSMV9DUkNMICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQ1JDTkVYVCB8IFNQSV9DUjFfQ1JDRU4gICAgfCBTUElfQ1IxX0JJRElPRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9CSURJTU9ERSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9Qcml2YXRlX01hY3JvcyBTUEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9TUElfVFJBTlNGRVJfRElSRUNUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfRlVMTF9EVVBMRVgpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX1NJTVBMRVhfUlgpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9IQUxGX0RVUExFWF9SWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfSEFMRl9EVVBMRVhfVFgpKQorCisjZGVmaW5lIElTX0xMX1NQSV9NT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTU9ERV9NQVNURVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9NT0RFX1NMQVZFKSkKKworI2RlZmluZSBJU19MTF9TUElfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzRCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfNUJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF82QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzdCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfOEJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF85QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzEwQklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTFCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xMkJJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzEzQklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTRCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xNUJJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzE2QklUKSkKKworI2RlZmluZSBJU19MTF9TUElfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9QT0xBUklUWV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMUVER0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMkVER0UpKQorCisjZGVmaW5lIElTX0xMX1NQSV9OU1MoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9OU1NfU09GVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfTlNTX0hBUkRfSU5QVVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX05TU19IQVJEX09VVFBVVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JBVURSQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY2NCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI1NikpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JJVE9SREVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTFNCX0ZJUlNUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX01TQl9GSVJTVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0NSQ0NBTENVTEFUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA+PSAweDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFNQSSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBTUEkgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFNQSSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfU1BJX0RlSW5pdChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisjaWYgZGVmaW5lZChTUEkxKQorICBpZiAoU1BJeCA9PSBTUEkxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorI2VuZGlmIC8qIFNQSTEgKi8KKyNpZiBkZWZpbmVkKFNQSTIpCisgIGlmIChTUEl4ID09IFNQSTIpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMik7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisjZW5kaWYgLyogU1BJMiAqLworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIFNQSV9Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFNQSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFNQSSBpcyBkaXNhYmxlZCAoU1BJX0NSMV9TUEUgYml0ID0wKSwKKyAgKiAgICAgICAgIFNQSSBwZXJpcGhlcmFsIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWUuIChSZXR1cm4gYWx3YXlzIFNVQ0NFU1MpCisgICovCitFcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIFNQSSBJbnN0YW5jZSBTUEl4Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisgIC8qIENoZWNrIHRoZSBTUEkgcGFyYW1ldGVycyBmcm9tIFNQSV9Jbml0U3RydWN0Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9UUkFOU0ZFUl9ESVJFQ1RJT04oU1BJX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfTU9ERShTUElfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0RBVEFXSURUSChTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfUE9MQVJJVFkoU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9QSEFTRShTUElfSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX05TUyhTUElfSW5pdFN0cnVjdC0+TlNTKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQkFVRFJBVEUoU1BJX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQklUT1JERVIoU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQ1JDQ0FMQ1VMQVRJT04oU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uKSk7CisKKyAgaWYgKExMX1NQSV9Jc0VuYWJsZWQoU1BJeCkgPT0gMHgwMDAwMDAwMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgU1BJeCBDUjEgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBTUElfQ1IxX0JJRElNT0RFLCBTUElfQ1IxX0JJRElPRSBhbmQgU1BJX0NSMV9SWE9OTFkgYml0cworICAgICAqIC0gTWFzdGVyL1NsYXZlIE1vZGU6ICBTUElfQ1IxX01TVFIgYml0CisgICAgICogLSBDbG9ja1BvbGFyaXR5OiAgICAgIFNQSV9DUjFfQ1BPTCBiaXQKKyAgICAgKiAtIENsb2NrUGhhc2U6ICAgICAgICAgU1BJX0NSMV9DUEhBIGJpdAorICAgICAqIC0gTlNTIG1hbmFnZW1lbnQ6ICAgICBTUElfQ1IxX1NTTSBiaXQKKyAgICAgKiAtIEJhdWRSYXRlIHByZXNjYWxlcjogU1BJX0NSMV9CUlsyOjBdIGJpdHMKKyAgICAgKiAtIEJpdE9yZGVyOiAgICAgICAgICAgU1BJX0NSMV9MU0JGSVJTVCBiaXQKKyAgICAgKiAtIENSQ0NhbGN1bGF0aW9uOiAgICAgU1BJX0NSMV9DUkNFTiBiaXQKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkNSMSwKKyAgICAgICAgICAgICAgIFNQSV9DUjFfQ0xFQVJfTUFTSywKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiB8IFNQSV9Jbml0U3RydWN0LT5Nb2RlIHwKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwgU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgfAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPk5TUyB8IFNQSV9Jbml0U3RydWN0LT5CYXVkUmF0ZSB8CisgICAgICAgICAgICAgICBTUElfSW5pdFN0cnVjdC0+Qml0T3JkZXIgfCBTUElfSW5pdFN0cnVjdC0+Q1JDQ2FsY3VsYXRpb24pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1IyIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIERhdGFXaWR0aDogICAgICAgICAgRFNbMzowXSBiaXRzCisgICAgICogLSBOU1MgbWFuYWdlbWVudDogICAgIFNTT0UgYml0CisgICAgICovCisgICAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsCisgICAgICAgICAgICAgICBTUElfQ1IyX0RTIHwgU1BJX0NSMl9TU09FLAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB8IChTUElfSW5pdFN0cnVjdC0+TlNTID4+IDE2VSkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1JDUFIgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gQ1JDUG9seTogICAgICAgICAgICBDUkNQT0xZWzE1OjBdIGJpdHMKKyAgICAgKi8KKyAgICBpZiAoU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uID09IExMX1NQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChTUElfSW5pdFN0cnVjdC0+Q1JDUG9seSkpOworICAgICAgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJeCwgU1BJX0luaXRTdHJ1Y3QtPkNSQ1BvbHkpOworICAgIH0KKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisKKyNpZiBkZWZpbmVkIChTUElfSTJTX1NVUFBPUlQpCisgIC8qIEFjdGl2YXRlIHRoZSBTUEkgbW9kZSAoUmVzZXQgSTJTTU9EIGJpdCBpbiBJMlNDRkdSIHJlZ2lzdGVyKSAqLworICBDTEVBUl9CSVQoU1BJeC0+STJTQ0ZHUiwgU1BJX0kyU0NGR1JfSTJTTU9EKTsKKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1NQSV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFNQSV9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBTUElfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gPSBMTF9TUElfRlVMTF9EVVBMRVg7CisgIFNQSV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICAgICA9IExMX1NQSV9NT0RFX1NMQVZFOworICBTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoICAgICAgICAgPSBMTF9TUElfREFUQVdJRFRIXzhCSVQ7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1NQSV9QT0xBUklUWV9MT1c7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1NQSV9QSEFTRV8xRURHRTsKKyAgU1BJX0luaXRTdHJ1Y3QtPk5TUyAgICAgICAgICAgICAgID0gTExfU1BJX05TU19IQVJEX0lOUFVUOworICBTUElfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgPSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjsKKyAgU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyICAgICAgICAgID0gTExfU1BJX01TQl9GSVJTVDsKKyAgU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uICAgID0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7CisgIFNQSV9Jbml0U3RydWN0LT5DUkNQb2x5ICAgICAgICAgICA9IDdVOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTUElfSTJTX1NVUFBPUlQpCisvKiogQGFkZHRvZ3JvdXAgSTJTX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMlNfTExfUHJpdmF0ZV9Db25zdGFudHMgSTJTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIEkyUyByZWdpc3RlcnMgTWFza3MgKi8KKyNkZWZpbmUgSTJTX0kyU0NGR1JfQ0xFQVJfTUFTSyAgICAgICAgICAgICAoU1BJX0kyU0NGR1JfQ0hMRU4gICB8IFNQSV9JMlNDRkdSX0RBVExFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfQ0tQT0wgICB8IFNQSV9JMlNDRkdSX0kyU1NURCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTQ0ZHICB8IFNQSV9JMlNDRkdSX0kyU01PRCApCisKKyNkZWZpbmUgSTJTX0kyU1BSX0NMRUFSX01BU0sgICAgICAgICAgICAgICAweDAwMDJVCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJTX0xMX1ByaXZhdGVfTWFjcm9zIEkyUyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfSTJTX0RBVEFGT1JNQVQoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8xNkIpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8xNkJfRVhURU5ERUQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8yNEIpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfREFUQUZPUk1BVF8zMkIpKQorCisjZGVmaW5lIElTX0xMX0kyU19DUE9MKF9fVkFMVUVfXykgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfSTJTX1BPTEFSSVRZX0xPVykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfSTJTX1NUQU5EQVJEKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfU1RBTkRBUkRfUEhJTElQUykgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX01TQikgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19TVEFOREFSRF9MU0IpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfU1RBTkRBUkRfUENNX1NIT1JUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX1NUQU5EQVJEX1BDTV9MT05HKSkKKworI2RlZmluZSBJU19MTF9JMlNfTU9ERShfX1ZBTFVFX18pICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX1NMQVZFX1RYKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX1NMQVZFX1JYKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX01BU1RFUl9UWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19NT0RFX01BU1RFUl9SWCkpCisKKyNkZWZpbmUgSVNfTExfSTJTX01DTEtfT1VUUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfTUNMS19PVVRQVVRfRU5BQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfSTJTX01DTEtfT1VUUFVUX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0xMX0kyU19BVURJT19GUkVRKF9fVkFMVUVfXykgKCgoKF9fVkFMVUVfXykgPj0gTExfSTJTX0FVRElPRlJFUV84SykgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChfX1ZBTFVFX18pIDw9IExMX0kyU19BVURJT0ZSRVFfMTkySykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQpKQorCisjZGVmaW5lIElTX0xMX0kyU19QUkVTQ0FMRVJfTElORUFSKF9fVkFMVUVfXykgICgoX19WQUxVRV9fKSA+PSAweDJVKQorCisjZGVmaW5lIElTX0xMX0kyU19QUkVTQ0FMRVJfUEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9FVkVOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX09ERCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJTX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFNQSS9JMlMgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogU1BJIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBTUEkgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0kyU19EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiBMTF9TUElfRGVJbml0KFNQSXgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBTUEkvSTJTIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEkyU19Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFNQSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFNQSSBpcyBkaXNhYmxlZCAoU1BJX0NSMV9TUEUgYml0ID0wKSwKKyAgKiAgICAgICAgIFNQSSBwZXJpcGhlcmFsIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgSTJTX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfSTJTX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBTUEkgcmVnaXN0ZXJzIGFyZSBJbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFNQSSByZWdpc3RlcnMgYXJlIG5vdCBJbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfSTJTX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX0kyU19Jbml0VHlwZURlZiAqSTJTX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IGkyc2RpdiA9IDJVLCBpMnNvZGQgPSAwVSwgcGFja2V0bGVuZ3RoID0gMVU7CisgIHVpbnQzMl90IHRtcDsKKyAgTExfUkNDX0Nsb2Nrc1R5cGVEZWYgcmNjX2Nsb2NrczsKKyAgdWludDMyX3Qgc291cmNlY2xvY2s7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBJMlMgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FMTF9JTlNUQU5DRShTUEl4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfTU9ERShJMlNfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX1NUQU5EQVJEKEkyU19Jbml0U3RydWN0LT5TdGFuZGFyZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX0RBVEFGT1JNQVQoSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19NQ0xLX09VVFBVVChJMlNfSW5pdFN0cnVjdC0+TUNMS091dHB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX0FVRElPX0ZSRVEoSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJTX0NQT0woSTJTX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKworICBpZiAoTExfSTJTX0lzRW5hYmxlZChTUEl4KSA9PSAweDAwMDAwMDAwVSkKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IEkyU0NGR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBTUEl4IEkyU0NGR1Igd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gTW9kZTogICAgICAgICAgU1BJX0kyU0NGR1JfSTJTQ0ZHWzE6MF0gYml0CisgICAgICogLSBTdGFuZGFyZDogICAgICBTUElfSTJTQ0ZHUl9JMlNTVERbMTowXSBhbmQgU1BJX0kyU0NGR1JfUENNU1lOQyBiaXRzCisgICAgICogLSBEYXRhRm9ybWF0OiAgICBTUElfSTJTQ0ZHUl9DSExFTiBhbmQgU1BJX0kyU0NGR1JfREFUTEVOIGJpdHMKKyAgICAgKiAtIENsb2NrUG9sYXJpdHk6IFNQSV9JMlNDRkdSX0NLUE9MIGJpdAorICAgICAqLworCisgICAgLyogV3JpdGUgdG8gU1BJeCBJMlNDRkdSICovCisgICAgTU9ESUZZX1JFRyhTUEl4LT5JMlNDRkdSLAorICAgICAgICAgICAgICAgSTJTX0kyU0NGR1JfQ0xFQVJfTUFTSywKKyAgICAgICAgICAgICAgIEkyU19Jbml0U3RydWN0LT5Nb2RlIHwgSTJTX0luaXRTdHJ1Y3QtPlN0YW5kYXJkIHwKKyAgICAgICAgICAgICAgIEkyU19Jbml0U3RydWN0LT5EYXRhRm9ybWF0IHwgSTJTX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkgfAorICAgICAgICAgICAgICAgU1BJX0kyU0NGR1JfSTJTTU9EKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IEkyU1BSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBTUEl4IEkyU1BSIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIE1DTEtPdXRwdXQ6ICAgIFNQSV9JMlNQUl9NQ0tPRSBiaXQKKyAgICAgKiAtIEF1ZGlvRnJlcTogICAgIFNQSV9JMlNQUl9JMlNESVZbNzowXSBhbmQgU1BJX0kyU1BSX09ERCBiaXRzCisgICAgICovCisKKyAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGF1ZGlvIGZyZXF1ZW5jeSBpcyBub3QgdGhlIGRlZmF1bHQsIGNvbXB1dGUgdGhlIHByZXNjYWxlciAoaTJzb2RkLCBpMnNkaXYpCisgICAgICogZWxzZSwgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQ6ICBpMnNvZGQgPSAwVSwgaTJzZGl2ID0gMlUuCisgICAgICovCisgICAgaWYgKEkyU19Jbml0U3RydWN0LT5BdWRpb0ZyZXEgIT0gTExfSTJTX0FVRElPRlJFUV9ERUZBVUxUKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBmcmFtZSBsZW5ndGggKEZvciB0aGUgUHJlc2NhbGVyIGNvbXB1dGluZykKKyAgICAgICAqIERlZmF1bHQgdmFsdWU6IExMX0kyU19EQVRBRk9STUFUXzE2QiAocGFja2V0bGVuZ3RoID0gMVUpLgorICAgICAgICovCisgICAgICBpZiAoSTJTX0luaXRTdHJ1Y3QtPkRhdGFGb3JtYXQgIT0gTExfSTJTX0RBVEFGT1JNQVRfMTZCKQorICAgICAgeworICAgICAgICAvKiBQYWNrZXQgbGVuZ3RoIGlzIDMyIGJpdHMgKi8KKyAgICAgICAgcGFja2V0bGVuZ3RoID0gMlU7CisgICAgICB9CisKKyAgICAgIC8qIEkyUyBDbG9jayBzb3VyY2UgaXMgU3lzdGVtIGNsb2NrOiBHZXQgU3lzdGVtIENsb2NrIGZyZXF1ZW5jeSAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJnJjY19jbG9ja3MpOworCisgICAgICAvKiBHZXQgdGhlIHNvdXJjZSBjbG9jayB2YWx1ZTogYmFzZWQgb24gU3lzdGVtIENsb2NrIHZhbHVlICovCisgICAgICBzb3VyY2VjbG9jayA9IHJjY19jbG9ja3MuU1lTQ0xLX0ZyZXF1ZW5jeTsKKworICAgICAgLyogQ29tcHV0ZSB0aGUgUmVhbCBkaXZpZGVyIGRlcGVuZGluZyBvbiB0aGUgTUNMSyBvdXRwdXQgc3RhdGUgd2l0aCBhIGZsb2F0aW5nIHBvaW50ICovCisgICAgICBpZiAoSTJTX0luaXRTdHJ1Y3QtPk1DTEtPdXRwdXQgPT0gTExfSTJTX01DTEtfT1VUUFVUX0VOQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogTUNMSyBvdXRwdXQgaXMgZW5hYmxlZCAqLworICAgICAgICB0bXAgPSAoKCgoKHNvdXJjZWNsb2NrIC8gMjU2VSkgKiAxMFUpIC8gSTJTX0luaXRTdHJ1Y3QtPkF1ZGlvRnJlcSkpICsgNVUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBNQ0xLIG91dHB1dCBpcyBkaXNhYmxlZCAqLworICAgICAgICB0bXAgPSAoKCgoKHNvdXJjZWNsb2NrIC8gKDMyVSAqIHBhY2tldGxlbmd0aCkpICogMTBVKSAvIEkyU19Jbml0U3RydWN0LT5BdWRpb0ZyZXEpKSArIDVVKTsKKyAgICAgIH0KKworICAgICAgLyogUmVtb3ZlIHRoZSBmbG9hdGluZyBwb2ludCAqLworICAgICAgdG1wID0gdG1wIC8gMTBVOworCisgICAgICAvKiBDaGVjayB0aGUgcGFyaXR5IG9mIHRoZSBkaXZpZGVyICovCisgICAgICBpMnNvZGQgPSAodG1wICYgKHVpbnQxNl90KTB4MDAwMVUpOworCisgICAgICAvKiBDb21wdXRlIHRoZSBpMnNkaXYgcHJlc2NhbGVyICovCisgICAgICBpMnNkaXYgPSAoKHRtcCAtIGkyc29kZCkgLyAyVSk7CisKKyAgICAgIC8qIEdldCB0aGUgTWFzayBmb3IgdGhlIE9kZCBiaXQgKFNQSV9JMlNQUls4XSkgcmVnaXN0ZXIgKi8KKyAgICAgIGkyc29kZCA9IChpMnNvZGQgPDwgOFUpOworICAgIH0KKworICAgIC8qIFRlc3QgaWYgdGhlIGRpdmlkZXIgaXMgMSBvciAwIG9yIGdyZWF0ZXIgdGhhbiAweEZGICovCisgICAgaWYgKChpMnNkaXYgPCAyVSkgfHwgKGkyc2RpdiA+IDB4RkZVKSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzICovCisgICAgICBpMnNkaXYgPSAyVTsKKyAgICAgIGkyc29kZCA9IDBVOworICAgIH0KKworICAgIC8qIFdyaXRlIHRvIFNQSXggSTJTUFIgcmVnaXN0ZXIgdGhlIGNvbXB1dGVkIHZhbHVlICovCisgICAgV1JJVEVfUkVHKFNQSXgtPkkyU1BSLCBpMnNkaXYgfCBpMnNvZGQgfCBJMlNfSW5pdFN0cnVjdC0+TUNMS091dHB1dCk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9JMlNfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEkyU19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0kyU19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSTJTX1N0cnVjdEluaXQoTExfSTJTX0luaXRUeXBlRGVmICpJMlNfSW5pdFN0cnVjdCkKK3sKKyAgLyotLS0tLS0tLS0tLS0tLS0gUmVzZXQgSTJTIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgSTJTX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgID0gTExfSTJTX01PREVfU0xBVkVfVFg7CisgIEkyU19Jbml0U3RydWN0LT5TdGFuZGFyZCAgICAgICAgICA9IExMX0kyU19TVEFOREFSRF9QSElMSVBTOworICBJMlNfSW5pdFN0cnVjdC0+RGF0YUZvcm1hdCAgICAgICAgPSBMTF9JMlNfREFUQUZPUk1BVF8xNkI7CisgIEkyU19Jbml0U3RydWN0LT5NQ0xLT3V0cHV0ICAgICAgICA9IExMX0kyU19NQ0xLX09VVFBVVF9ESVNBQkxFOworICBJMlNfSW5pdFN0cnVjdC0+QXVkaW9GcmVxICAgICAgICAgPSBMTF9JMlNfQVVESU9GUkVRX0RFRkFVTFQ7CisgIEkyU19Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX0kyU19QT0xBUklUWV9MT1c7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGxpbmVhciBhbmQgcGFyaXR5IHByZXNjYWxlci4KKyAgKiBAbm90ZSAgIFRvIGNhbGN1bGF0ZSB2YWx1ZSBvZiBQcmVzY2FsZXJMaW5lYXIoSTJTRElWWzc6MF0gYml0cykgYW5kIFByZXNjYWxlclBhcml0eShPREQgYml0KVxuCisgICogICAgICAgICBDaGVjayBBdWRpbyBmcmVxdWVuY3kgdGFibGUgYW5kIGZvcm11bGFzIGluc2lkZSBSZWZlcmVuY2UgTWFudWFsIChTUEkvSTJTKS4KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXJMaW5lYXIgdmFsdWUgTWluX0RhdGE9MHgwMiBhbmQgTWF4X0RhdGE9MHhGRi4KKyAgKiBAcGFyYW0gIFByZXNjYWxlclBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyU19QUkVTQ0FMRVJfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMlNfUFJFU0NBTEVSX1BBUklUWV9PREQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSTJTX0NvbmZpZ1ByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgUHJlc2NhbGVyTGluZWFyLCB1aW50MzJfdCBQcmVzY2FsZXJQYXJpdHkpCit7CisgIC8qIENoZWNrIHRoZSBJMlMgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJTX0FMTF9JTlNUQU5DRShTUEl4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9JMlNfUFJFU0NBTEVSX0xJTkVBUihQcmVzY2FsZXJMaW5lYXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyU19QUkVTQ0FMRVJfUEFSSVRZKFByZXNjYWxlclBhcml0eSkpOworCisgIC8qIFdyaXRlIHRvIFNQSXggSTJTUFIgKi8KKyAgTU9ESUZZX1JFRyhTUEl4LT5JMlNQUiwgU1BJX0kyU1BSX0kyU0RJViB8IFNQSV9JMlNQUl9PREQsIFByZXNjYWxlckxpbmVhciB8IChQcmVzY2FsZXJQYXJpdHkgPDwgOFUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBTUElfSTJTX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfdGltLmMgYi9TcmMvc3RtMzJnMHh4X2xsX3RpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2YxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJnMHh4X2xsX3RpbS5jCkBAIC0wLDAgKzEsMTM1MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF90aW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVElNIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF90aW0uaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFRJTTEpIHx8IGRlZmluZWQgKFRJTTIpIHx8IGRlZmluZWQgKFRJTTMpIHx8ICBkZWZpbmVkIChUSU0xNCkgfHwgIGRlZmluZWQgKFRJTTE1KSB8fCBkZWZpbmVkIChUSU0xNikgfHwgZGVmaW5lZCAoVElNMTcpIHx8IGRlZmluZWQgKFRJTTYpIHx8IGRlZmluZWQgKFRJTTcpCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0xMX1RJTV9DT1VOVEVSTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX1VQKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0RPV04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOKSkKKworI2RlZmluZSBJU19MTF9USU1fQ0xPQ0tESVZJU0lPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWNCkpCisKKyNkZWZpbmUgSVNfTExfVElNX09DTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9GUk9aRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1RPR0dMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMikpCisKKyNkZWZpbmUgSVNfTExfVElNX09DU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX09DUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1BPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfTExfVElNX09DSURMRVNUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NJRExFU1RBVEVfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DSURMRVNUQVRFX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1RJTV9BQ1RJVkVJTlBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfVFJDKSkKKworI2RlZmluZSBJU19MTF9USU1fSUNQU0MoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVYxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVY4KSkKKworI2RlZmluZSBJU19MTF9USU1fSUNfRklMVEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044KSkKKworI2RlZmluZSBJU19MTF9USU1fSUNfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX0VOQ09ERVJNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyKSkKKworI2RlZmluZSBJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX0xMX1RJTV9PU1NSX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTUl9ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NSX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX09TU0lfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NJX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NJX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX0xPQ0tfTEVWRUwoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfT0ZGKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMXzEpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF8yKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfMykpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBS19QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUtfRklMVEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX04yKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9OOCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLX0FGTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0FGTU9ERV9JTlBVVCkgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfQUZNT0RFX0JJRElSRUNUSU9OQUwpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBSzJfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLMl9QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUsyX0ZJTFRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjEpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjgpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBSzJfQUZNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0FGTU9ERV9JTlBVVCkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9BRk1PREVfQklESVJFQ1RJT05BTCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0MyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBPQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0M1Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DNkNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgSUMyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIElDM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUSU14IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IGludmFsaWQgVElNeCBpbnN0YW5jZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKFRJTXgpKTsKKworICBpZiAoVElNeCA9PSBUSU0xKQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSk7CisgIH0KKyNpZiBkZWZpbmVkKFRJTTIpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMikKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMik7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTMpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMykKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMyk7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTMpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTYpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNNikKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNik7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTYpOworICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRJTTcpCisgIGVsc2UgaWYgKFRJTXggPT0gVElNNykKKyAgeworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNNyk7CisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTcpOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNCkKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTQpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNCk7CisgIH0KKyNpZiBkZWZpbmVkKFRJTTE1KQorICBlbHNlIGlmIChUSU14ID09IFRJTTE1KQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNSk7CisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE1KTsKKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKFRJTXggPT0gVElNMTYpCisgIHsKKyAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpOworICB9CisjaWYgZGVmaW5lZChUSU0xNykKKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNykKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNyk7CisgIH0KKyNlbmRpZgorICBlbHNlCisgIHsKKyAgICByZXN1bHQgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmaWVsZHMgb2YgdGhlIHRpbWUgYmFzZSB1bml0IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgVElNX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAodGltZSBiYXNlIHVuaXQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX1N0cnVjdEluaXQoTExfVElNX0luaXRUeXBlRGVmICpUSU1fSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0luaXRTdHJ1Y3QtPlByZXNjYWxlciAgICAgICAgID0gKHVpbnQxNl90KTB4MDAwMDsKKyAgVElNX0luaXRTdHJ1Y3QtPkNvdW50ZXJNb2RlICAgICAgID0gTExfVElNX0NPVU5URVJNT0RFX1VQOworICBUSU1fSW5pdFN0cnVjdC0+QXV0b3JlbG9hZCAgICAgICAgPSAweEZGRkZGRkZGVTsKKyAgVElNX0luaXRTdHJ1Y3QtPkNsb2NrRGl2aXNpb24gICAgID0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMTsKKyAgVElNX0luaXRTdHJ1Y3QtPlJlcGV0aXRpb25Db3VudGVyID0gKHVpbnQ4X3QpMHgwMDsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggdGltZSBiYXNlIHVuaXQuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IHRpbWUgYmFzZSB1bml0IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0luaXRUeXBlRGVmICpUSU1fSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0NPVU5URVJNT0RFKFRJTV9Jbml0U3RydWN0LT5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0NMT0NLRElWSVNJT04oVElNX0luaXRTdHJ1Y3QtPkNsb2NrRGl2aXNpb24pKTsKKworICB0bXBjcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjEpOworCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjEsIChUSU1fQ1IxX0RJUiB8IFRJTV9DUjFfQ01TKSwgVElNX0luaXRTdHJ1Y3QtPkNvdW50ZXJNb2RlKTsKKyAgfQorCisgIGlmIChJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZXQgdGhlIGNsb2NrIGRpdmlzaW9uICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjEsIFRJTV9DUjFfQ0tELCBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tEaXZpc2lvbik7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMSAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IxLCB0bXBjcjEpOworCisgIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLworICBMTF9USU1fU2V0QXV0b1JlbG9hZChUSU14LCBUSU1fSW5pdFN0cnVjdC0+QXV0b3JlbG9hZCk7CisKKyAgLyogU2V0IHRoZSBQcmVzY2FsZXIgdmFsdWUgKi8KKyAgTExfVElNX1NldFByZXNjYWxlcihUSU14LCBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyKTsKKworICBpZiAoSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNldCB0aGUgUmVwZXRpdGlvbiBDb3VudGVyIHZhbHVlICovCisgICAgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKFRJTXgsIFRJTV9Jbml0U3RydWN0LT5SZXBldGl0aW9uQ291bnRlcik7CisgIH0KKworICAvKiBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQgdG8gcmVsb2FkIHRoZSBQcmVzY2FsZXIKKyAgICAgYW5kIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUgKGlmIGFwcGxpY2FibGUpIGltbWVkaWF0ZWx5ICovCisgIExMX1RJTV9HZW5lcmF0ZUV2ZW50X1VQREFURShUSU14KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgKiAgICAgICAgIHN0cnVjdHVyZSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9PQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9PQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRoZSBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fT0NfU3RydWN0SW5pdChMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NNb2RlICAgICAgID0gTExfVElNX09DTU9ERV9GUk9aRU47CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ1N0YXRlICAgICAgPSBMTF9USU1fT0NTVEFURV9ESVNBQkxFOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NOU3RhdGUgICAgID0gTExfVElNX09DU1RBVEVfRElTQUJMRTsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSA9IDB4MDAwMDAwMDBVOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NQb2xhcml0eSAgID0gTExfVElNX09DUE9MQVJJVFlfSElHSDsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5ICA9IExMX1RJTV9PQ1BPTEFSSVRZX0hJR0g7CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSAgPSBMTF9USU1fT0NJRExFU1RBVEVfTE9XOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlID0gTExfVElNX09DSURMRVNUQVRFX0xPVzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBUSU1fT0NfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fT0NfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IG91dHB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBUSU14IG91dHB1dCBjaGFubmVsIGlzIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfVElNX09DX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IEVSUk9SOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gxOgorICAgICAgcmVzdWx0ID0gT0MxQ29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gyOgorICAgICAgcmVzdWx0ID0gT0MyQ29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0gzOgorICAgICAgcmVzdWx0ID0gT0MzQ29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g0OgorICAgICAgcmVzdWx0ID0gT0M0Q29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g1OgorICAgICAgcmVzdWx0ID0gT0M1Q29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTExfVElNX0NIQU5ORUxfQ0g2OgorICAgICAgcmVzdWx0ID0gT0M2Q29uZmlnKFRJTXgsIFRJTV9PQ19Jbml0U3RydWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmaWVsZHMgb2YgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgKiAgICAgICAgIHN0cnVjdHVyZSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0lDX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAodGhlIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX0lDX1N0cnVjdEluaXQoTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5ICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCA9IExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSTsKKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIFRJTV9JQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9JQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKFRJTXggaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IG91dHB1dCBjaGFubmVsIGlzIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9JQ19Jbml0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyByZXN1bHQgPSBFUlJPUjsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMToKKyAgICAgIHJlc3VsdCA9IElDMUNvbmZpZyhUSU14LCBUSU1fSUNfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMjoKKyAgICAgIHJlc3VsdCA9IElDMkNvbmZpZyhUSU14LCBUSU1fSUNfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMzoKKyAgICAgIHJlc3VsdCA9IElDM0NvbmZpZyhUSU14LCBUSU1fSUNfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NINDoKKyAgICAgIHJlc3VsdCA9IElDNENvbmZpZyhUSU14LCBUSU1fSUNfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVElNX0VuY29kZXJJbml0U3RydWN0IGZpZWxkIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUKKyAgKiBAcGFyYW0gIFRJTV9FbmNvZGVySW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKGVuY29kZXIgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9FTkNPREVSX1N0cnVjdEluaXQoTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5FbmNvZGVyTW9kZSAgICA9IExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTE7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkgICAgPSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUFjdGl2ZUlucHV0ID0gTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlciAgID0gTExfVElNX0lDUFNDX0RJVjE7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxRmlsdGVyICAgICAgPSBMTF9USU1fSUNfRklMVEVSX0ZESVYxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlBvbGFyaXR5ICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJBY3RpdmVJbnB1dCA9IExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQcmVzY2FsZXIgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkZpbHRlciAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGVuY29kZXIgaW50ZXJmYWNlIG9mIHRoZSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9FbmNvZGVySW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKFRJTXggZW5jb2RlciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9FTkNPREVSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0VOQ09ERVJNT0RFKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+RW5jb2Rlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWV9FTkNPREVSKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUFjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWV9FTkNPREVSKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkFjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDQzEgYW5kIENDMjogUmVzZXQgdGhlIENDMUUgYW5kIENDMkUgQml0cyAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+KFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIENvbmZpZ3VyZSBUSTEgKi8KKyAgdG1wY2NtcjEgJj0gKHVpbnQzMl90KX4oVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfSUMxRiAgfCBUSU1fQ0NNUjFfSUMxUFNDKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUFjdGl2ZUlucHV0ID4+IDE2VSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFGaWx0ZXIgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlciA+PiAxNlUpOworCisgIC8qIENvbmZpZ3VyZSBUSTIgKi8KKyAgdG1wY2NtcjEgJj0gKHVpbnQzMl90KX4oVElNX0NDTVIxX0NDMlMgfCBUSU1fQ0NNUjFfSUMyRiAgfCBUSU1fQ0NNUjFfSUMyUFNDKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkFjdGl2ZUlucHV0ID4+IDhVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMkZpbHRlciA+PiA4VSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQcmVzY2FsZXIgPj4gOFUpOworCisgIC8qIFNldCBUSTEgYW5kIFRJMiBwb2xhcml0eSBhbmQgZW5hYmxlIFRJMSBhbmQgVEkyICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkpOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQb2xhcml0eSA8PCA0VSk7CisgIHRtcGNjZXIgfD0gKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFFIHwgVElNX0NDRVJfQ0MyRSk7CisKKyAgLyogU2V0IGVuY29kZXIgbW9kZSAqLworICBMTF9USU1fU2V0RW5jb2Rlck1vZGUoVElNeCwgVElNX0VuY29kZXJJbml0U3RydWN0LT5FbmNvZGVyTW9kZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjEsIHRtcGNjbXIxKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmllbGRzIG9mIHRoZSBUSU14IEhhbGwgc2Vuc29yIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEKKyAgKiAgICAgICAgIHN0cnVjdHVyZSB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKEhBTEwgc2Vuc29yIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fSEFMTFNFTlNPUl9TdHJ1Y3RJbml0KExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkgICAgICAgPSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HOworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlciAgICAgID0gTExfVElNX0lDUFNDX0RJVjE7CisgIFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxRmlsdGVyICAgICAgICAgPSBMTF9USU1fSUNfRklMVEVSX0ZESVYxOworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPkNvbW11dGF0aW9uRGVsYXkgID0gMFU7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2Ugb2YgdGhlIHRpbWVyIGluc3RhbmNlLgorICAqIEBub3RlIFRJTXggQ0gxLCBDSDIgYW5kIENIMyBpbnB1dHMgY29ubmVjdGVkIHRocm91Z2ggYSBYT1IKKyAgKiAgICAgICB0byB0aGUgVEkxIGlucHV0IGNoYW5uZWwKKyAgKiBAbm90ZSBUSU14IHNsYXZlIG1vZGUgY29udHJvbGxlciBpcyBjb25maWd1cmVkIGluIHJlc2V0IG1vZGUuCisgICAgICAgICAgU2VsZWN0ZWQgaW50ZXJuYWwgdHJpZ2dlciBpcyBUSTFGX0VELgorICAqIEBub3RlIENoYW5uZWwgMSBpcyBjb25maWd1cmVkIGFzIGlucHV0LCBJQzEgaXMgbWFwcGVkIG9uIFRSQy4KKyAgKiBAbm90ZSBDYXB0dXJlZCB2YWx1ZSBzdG9yZWQgaW4gVElNeF9DQ1IxIGNvcnJlc3BvbmQgdG8gdGhlIHRpbWUgZWxhcHNlZAorICAqICAgICAgIGJldHdlZW4gMiBjaGFuZ2VzIG9uIHRoZSBpbnB1dHMuIEl0IGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IG1vdG9yIHNwZWVkLgorICAqIEBub3RlIENoYW5uZWwgMiBpcyBjb25maWd1cmVkIGluIG91dHB1dCBQV00gMiBtb2RlLgorICAqIEBub3RlIENvbXBhcmUgdmFsdWUgc3RvcmVkIGluIFRJTXhfQ0NSMiBjb3JyZXNwb25kcyB0byB0aGUgY29tbXV0YXRpb24gZGVsYXkuCisgICogQG5vdGUgT0MyUkVGIGlzIHNlbGVjdGVkIGFzIHRyaWdnZXIgb3V0cHV0IG9uIFRSR08uCisgICogQG5vdGUgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFIG11c3Qgbm90IGJlIHVzZWQgZm9yIFRJMSB3aGVuIGl0IGlzIHVzZWQKKyAgKiAgICAgICB3aGVuIFRJTXggb3BlcmF0ZXMgaW4gSGFsbCBzZW5zb3IgaW50ZXJmYWNlIG1vZGUuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IEhBTEwgc2Vuc29yIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0hBTExTRU5TT1JfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgKlRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY3IyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDQzEgYW5kIENDMjogUmVzZXQgdGhlIENDMUUgYW5kIENDMkUgQml0cyAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+KFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjEpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBzbWNyID0gTExfVElNX1JlYWRSZWcoVElNeCwgU01DUik7CisKKyAgLyogQ29ubmVjdCBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyB0byB0aGUgVEkxIGlucHV0ICovCisgIHRtcGNyMiB8PSBUSU1fQ1IyX1RJMVM7CisKKyAgLyogT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAqLworICB0bXBjcjIgfD0gTExfVElNX1RSR09fT0MyUkVGOworCisgIC8qIENvbmZpZ3VyZSB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyICovCisgIHRtcHNtY3IgJj0gKHVpbnQzMl90KX4oVElNX1NNQ1JfVFMgfCBUSU1fU01DUl9TTVMpOworICB0bXBzbWNyIHw9IExMX1RJTV9UU19USTFGX0VEOworICB0bXBzbWNyIHw9IExMX1RJTV9TTEFWRU1PREVfUkVTRVQ7CisKKyAgLyogQ29uZmlndXJlIGlucHV0IGNoYW5uZWwgMSAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9JQzFGICB8IFRJTV9DQ01SMV9JQzFQU0MpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMUZpbHRlciA+PiAxNlUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyID4+IDE2VSk7CisKKyAgLyogQ29uZmlndXJlIGlucHV0IGNoYW5uZWwgMiAqLworICB0bXBjY21yMSAmPSAodWludDMyX3QpfihUSU1fQ0NNUjFfT0MyTSB8IFRJTV9DQ01SMV9PQzJGRSAgfCBUSU1fQ0NNUjFfT0MyUEUgIHwgVElNX0NDTVIxX09DMkNFKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShMTF9USU1fT0NNT0RFX1BXTTIgPDwgOFUpOworCisgIC8qIFNldCBDaGFubmVsIDEgcG9sYXJpdHkgYW5kIGVuYWJsZSBDaGFubmVsIDEgYW5kIENoYW5uZWwyICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QIHwgVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUG9sYXJpdHkpOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBTTUNSLCB0bXBzbWNyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ1IyICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKFRJTXgsIFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+Q29tbXV0YXRpb25EZWxheSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmaWVsZHMgb2YgdGhlIEJyZWFrIGFuZCBEZWFkIFRpbWUgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fQkRUUkluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChCcmVhayBhbmQgRGVhZCBUaW1lIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9CRFRSX1N0cnVjdEluaXQoTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0JEVFJJbml0U3RydWN0LT5PU1NSU3RhdGUgICAgICAgPSBMTF9USU1fT1NTUl9ESVNBQkxFOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPk9TU0lTdGF0ZSAgICAgICA9IExMX1RJTV9PU1NJX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+TG9ja0xldmVsICAgICAgID0gTExfVElNX0xPQ0tMRVZFTF9PRkY7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+RGVhZFRpbWUgICAgICAgID0gKHVpbnQ4X3QpMHgwMDsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha1N0YXRlICAgICAgPSBMTF9USU1fQlJFQUtfRElTQUJMRTsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha1BvbGFyaXR5ICAgPSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfTE9XOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrRmlsdGVyICAgICA9IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtBRk1vZGUgICAgID0gTExfVElNX0JSRUFLX0FGTU9ERV9JTlBVVDsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJTdGF0ZSAgICAgPSBMTF9USU1fQlJFQUsyX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyUG9sYXJpdHkgID0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1c7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyRmlsdGVyICAgID0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyQUZNb2RlICAgID0gTExfVElNX0JSRUFLMl9BRk1PREVfSU5QVVQ7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QXV0b21hdGljT3V0cHV0ID0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgQnJlYWsgYW5kIERlYWQgVGltZSBmZWF0dXJlIG9mIHRoZSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSBBcyB0aGUgYml0cyBCSzJQLCBCSzJFLCBCSzJGWzM6MF0sIEJLRlszOjBdLCBBT0UsIEJLUCwgQktFLCBPU1NJLCBPU1NSCisgICogIGFuZCBEVEdbNzowXSBjYW4gYmUgd3JpdGUtbG9ja2VkIGRlcGVuZGluZyBvbiB0aGUgTE9DSyBjb25maWd1cmF0aW9uLCBpdAorICAqICBjYW4gYmUgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSBhbGwgb2YgdGhlbSBkdXJpbmcgdGhlIGZpcnN0IHdyaXRlIGFjY2VzcyB0bworICAqICB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9CRFRSSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fQkRUUl9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUoQnJlYWsgYW5kIERlYWQgVGltZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBCcmVhayBhbmQgRGVhZCBUaW1lIGlzIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9CRFRSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGJkdHIgPSAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09TU1JfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5PU1NSU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PU1NJX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTSVN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fTE9DS19MRVZFTChUSU1fQkRUUkluaXRTdHJ1Y3QtPkxvY2tMZXZlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLX1BPTEFSSVRZKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpKTsKKworICAvKiBTZXQgdGhlIExvY2sgbGV2ZWwsIHRoZSBCcmVhayBlbmFibGUgQml0IGFuZCB0aGUgUG9sYXJpdHksIHRoZSBPU1NSIFN0YXRlLAorICB0aGUgT1NTSSBTdGF0ZSwgdGhlIGRlYWQgdGltZSB2YWx1ZSBhbmQgdGhlIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlIEJpdCAqLworCisgIC8qIFNldCB0aGUgQkRUUiBiaXRzICovCisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfRFRHLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkRlYWRUaW1lKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9MT0NLLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkxvY2tMZXZlbCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTSSwgVElNX0JEVFJJbml0U3RydWN0LT5PU1NJU3RhdGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU1IsIFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTUlN0YXRlKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0UsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktQLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrUG9sYXJpdHkpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0FPRSwgVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX01PRSwgVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpOworICBpZiAoSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBS19GSUxURVIoVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlcikpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQlJFQUtfQUZNT0RFKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtBRk1vZGUpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLRiwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlcik7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0JJRCwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0FGTW9kZSk7CisgIH0KKworICBpZiAoSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBSzJfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQlJFQUsyX1BPTEFSSVRZKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyUG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLMl9GSUxURVIoVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJGaWx0ZXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLMl9BRk1PREUoVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJBRk1vZGUpKTsKKworICAgIC8qIFNldCB0aGUgQlJFQUsyIGlucHV0IHJlbGF0ZWQgQkRUUiBiaXQtZmllbGRzICovCisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJGLCAoVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJGaWx0ZXIpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkUsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyU3RhdGUpOworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyUCwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJQb2xhcml0eSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJCSUQsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWsyQUZNb2RlKTsKKyAgfQorCisgIC8qIFNldCBUSU14X0JEVFIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIEJEVFIsIHRtcGJkdHIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAxLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAxIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIFRJTV9DQ0VSX0NDMUUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjEpOworCisgIC8qIFJlc2V0IENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICBDTEVBUl9CSVQodG1wY2NtcjEsIFRJTV9DQ01SMV9DQzFTKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMSwgVElNX0NDTVIxX09DMU0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMVAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MxRSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBQb2xhcml0eSAqLworICAgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MxTlAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5IDw8IDJVKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgU3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMU5FLCBUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSA8PCAyVSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTMSwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTMU4sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSA8PCAxVSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCAyIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzJDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NNT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSAgTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBSZXNldCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgQ0xFQVJfQklUKHRtcGNjbXIxLCBUSU1fQ0NNUjFfQ0MyUyk7CisKKyAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIE1PRElGWV9SRUcodG1wY2NtcjEsIFRJTV9DQ01SMV9PQzJNLCBUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJQLCBUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5IDw8IDRVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgNFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgUG9sYXJpdHkgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMk5QLCBUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSA8PCA2VSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJORSwgVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUgPDwgNlUpOworCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzIsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlIDw8IDJVKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzJOLCBUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUgPDwgM1UpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENSMiwgdG1wY3IyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMy4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMyBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0MzQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyOworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzNFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMik7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMiwgVElNX0NDTVIyX0NDM1MpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIyLCBUSU1fQ0NNUjJfT0MzTSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MzUCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzNFLCBUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlIDw8IDhVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFBvbGFyaXR5ICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzNOUCwgVElNX09DSW5pdFN0cnVjdC0+T0NOUG9sYXJpdHkgPDwgMTBVKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgU3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDM05FLCBUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSA8PCAxMFUpOworCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzMsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlIDw8IDRVKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzNOLCBUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUgPDwgNVUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENSMiwgdG1wY3IyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMiwgdG1wY2NtcjIpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzKFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0M0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyOworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNDogUmVzZXQgdGhlIENDNEUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzRFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMik7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMiwgVElNX0NDTVIyX0NDNFMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIyLCBUSU1fQ0NNUjJfT0M0TSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M0UCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCAxMlUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M0RSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSA8PCAxMlUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMiwgVElNX0NSMl9PSVM0LCBUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSA8PCA2VSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIyLCB0bXBjY21yMik7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDQoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA1LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA1IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzVDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjM7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNTogUmVzZXQgdGhlIENDNUUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzVFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIzIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIzID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIzLCBUSU1fQ0NNUjNfT0M1TSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M1UCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCAxNlUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M1RSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSA8PCAxNlUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9PSVM1LCBUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSA8PCA4VSk7CisKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIzLCB0bXBjY21yMyk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDUoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA2LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBvdXRwdXQgY2hhbm5lbCA2IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzZDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdG1wY2NtcjM7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzZfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgNTogUmVzZXQgdGhlIENDNkUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzZFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIzIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIzID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIzLCBUSU1fQ0NNUjNfT0M2TSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M2UCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCAyMFUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0M2RSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSA8PCAyMFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgVElNX0NSMl9PSVM2LCBUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSA8PCAxMFUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMyAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjMsIHRtcGNjbXIzKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINihUSU14LCBUSU1fT0NJbml0U3RydWN0LT5Db21wYXJlVmFsdWUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAxIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBJQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+VElNX0NDRVJfQ0MxRTsKKworICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciBhbmQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDTVIxLAorICAgICAgICAgICAgIChUSU1fQ0NNUjFfQ0MxUyB8IFRJTV9DQ01SMV9JQzFGIHwgVElNX0NDTVIxX0lDMVBTQyksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgfCBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSA+PiAxNlUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLAorICAgICAgICAgICAgIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApLAorICAgICAgICAgICAgIChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IHwgVElNX0NDRVJfQ0MxRSkpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDIuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMiBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgSUMyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWShUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpflRJTV9DQ0VSX0NDMkU7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgYW5kIHRoZSBwcmVzY2FsZXIgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ01SMSwKKyAgICAgICAgICAgICAoVElNX0NDTVIxX0NDMlMgfCBUSU1fQ0NNUjFfSUMyRiB8IFRJTV9DQ01SMV9JQzJQU0MpLAorICAgICAgICAgICAgIChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0IHwgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgfCBUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikgPj4gOFUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLAorICAgICAgICAgICAgIChUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApLAorICAgICAgICAgICAgICgoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSA8PCA0VSkgfCBUSU1fQ0NFUl9DQzJFKSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMy4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAzIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBJQzNDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzNFIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+VElNX0NDRVJfQ0MzRTsKKworICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciBhbmQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDTVIyLAorICAgICAgICAgICAgIChUSU1fQ0NNUjJfQ0MzUyB8IFRJTV9DQ01SMl9JQzNGIHwgVElNX0NDTVIyX0lDM1BTQyksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgfCBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSA+PiAxNlUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLAorICAgICAgICAgICAgIChUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApLAorICAgICAgICAgICAgICgoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSA8PCA4VSkgfCBUSU1fQ0NFUl9DQzNFKSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgNC4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCA0IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBJQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9BQ1RJVkVJTlBVVChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNQU0MoVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19GSUxURVIoVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBUSU14LT5DQ0VSICY9ICh1aW50MzJfdCl+VElNX0NDRVJfQ0M0RTsKKworICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciBhbmQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDTVIyLAorICAgICAgICAgICAgIChUSU1fQ0NNUjJfQ0M0UyB8IFRJTV9DQ01SMl9JQzRGIHwgVElNX0NDTVIyX0lDNFBTQyksCisgICAgICAgICAgICAgKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgfCBUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlciB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSA+PiA4VSk7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsCisgICAgICAgICAgICAgKFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCksCisgICAgICAgICAgICAgKChUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5IDw8IDEyVSkgfCBUSU1fQ0NFUl9DQzRFKSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFRJTTEgfHwgVElNMiB8fCBUSU0zIHx8ICBUSU0xNCB8fCBUSU0xNSB8fCBUSU0xNiB8fCBUSU0xNyB8fCBUSU02IHx8IFRJTTcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZzB4eF9sbF91Y3BkLmMgYi9TcmMvc3RtMzJnMHh4X2xsX3VjcGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ2OGYxCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF91Y3BkLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMmcweHhfbGxfdWNwZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVQ1BEIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyZzB4eF9sbF91Y3BkLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX2J1cy5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9yY2MuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQgKFVDUEQxKSB8fCBkZWZpbmVkIChVQ1BEMikKKy8qKiBAYWRkdG9ncm91cCBVQ1BEX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVDUERfTExfUHJpdmF0ZV9Db25zdGFudHMgVUNQRCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVDUERfTExfUHJpdmF0ZV9NYWNyb3MgVUNQRCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVQ1BEX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQ1BEX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFVDUEQgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgVUNQRHggdWNwZCBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiB1Y3BkIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiB1Y3BkIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9VQ1BEX0RlSW5pdChVQ1BEX1R5cGVEZWYgKlVDUER4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUNQRF9BTExfSU5TVEFOQ0UoVUNQRHgpKTsKKyAgCisgIExMX1VDUERfRGlzYWJsZShVQ1BEeCk7CisKKyAgaWYgKFVDUEQxID09IFVDUER4KQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgdWNwZCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDEpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiB1Y3BkIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQxKTsKKworICAgIC8qIERpc2JhbGUgdWNwZCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMSk7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisgIGlmIChVQ1BEMiA9PSBVQ1BEeCkKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIHVjcGQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQyKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgdWNwZCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMik7CisKKyAgICAvKiBEaXNiYWxlIHVjcGQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfVUNQRDIpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgdWNwZCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBVQ1BEX0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gdWNwZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIHVjcGQgaXMgZGlzYWJsZWQgKHVjcGRfQ1IxX1NQRSBiaXQgPTApLAorICAqICAgICAgICAgVUNQRCBwZXJpcGhlcmFsIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHBhcmFtICBVQ1BEeCBVQ1BEIEluc3RhbmNlCisgICogQHBhcmFtICBVQ1BEX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVUNQRF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBVQ1BEIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZS4gKFJldHVybiBhbHdheXMgU1VDQ0VTUykKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VDUERfSW5pdChVQ1BEX1R5cGVEZWYgKlVDUER4LCBMTF9VQ1BEX0luaXRUeXBlRGVmICpVQ1BEX0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSB1Y3BkIEluc3RhbmNlIFVDUER4Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX1VDUERfQUxMX0lOU1RBTkNFKFVDUER4KSk7CisKKyAgaWYoVUNQRDEgPT0gVUNQRHgpCisgIHsKKyAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9VQ1BEMSk7CisgIH0KKworICBpZihVQ1BEMiA9PSBVQ1BEeCkKKyAgeworICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1VDUEQyKTsKKyAgfQorCisgIExMX1VDUERfRGlzYWJsZShVQ1BEeCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVDUER4IENGRzEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKFVDUER4LT5DRkcxLAorICAgICAgICAgICAgIFVDUERfQ0ZHMV9QU0NfVUNQRENMSyB8IFVDUERfQ0ZHMV9UUkFOU1dJTiB8IFVDUERfQ0ZHMV9JRlJHQVAgfCBVQ1BEX0NGRzFfSEJJVENMS0RJViwKKyAgICAgICAgICAgICBVQ1BEX0luaXRTdHJ1Y3QtPnBzY191Y3BkY2xrIHwgKFVDUERfSW5pdFN0cnVjdC0+dHJhbnN3aW4gIDw8IFVDUERfQ0ZHMV9UUkFOU1dJTl9Qb3MpIHwKKyAgICAgICAgICAgICAoVUNQRF9Jbml0U3RydWN0LT5JZnJHYXAgPDwgVUNQRF9DRkcxX0lGUkdBUF9Qb3MpIHwgVUNQRF9Jbml0U3RydWN0LT5IYml0Q2xvY2tEaXYpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfVUNQRF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgVUNQRF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VDUERfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1VDUERfU3RydWN0SW5pdChMTF9VQ1BEX0luaXRUeXBlRGVmICpVQ1BEX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBVQ1BEX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIFVDUERfSW5pdFN0cnVjdC0+cHNjX3VjcGRjbGsgID0gTExfVUNQRF9QU0NfRElWMTsKKyAgVUNQRF9Jbml0U3RydWN0LT50cmFuc3dpbiAgICAgPSAweDc7ICAgLyogRGl2aWRlIGJ5IDggICAgICAgICAgICAgICAgICAgICAqLworICBVQ1BEX0luaXRTdHJ1Y3QtPklmckdhcCAgICAgICA9IDB4MTA7ICAvKiBEaXZpZGUgYnkgMTcgICAgICAgICAgICAgICAgICAgICovCisgIFVDUERfSW5pdFN0cnVjdC0+SGJpdENsb2NrRGl2ID0gMHgxOTsgIC8qIERpdmlkZSBieSAyNiB0byBwcm9kdWNlIEhCSVRDTEsgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChVQ1BEMSkgfHwgZGVmaW5lZCAoVUNQRDIpICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJnMHh4X2xsX3VzYXJ0LmMgYi9TcmMvc3RtMzJnMHh4X2xsX3VzYXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmcweHhfbGxfdXNhcnQuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZzB4eF9sbF91c2FydC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0FSVCBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3VzYXJ0LmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMkcweHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkgfHwgZGVmaW5lZCAoVVNBUlQyKSB8fCBkZWZpbmVkIChVU0FSVDMpIHx8IGRlZmluZWQgKFVTQVJUNCkKKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfUFJFU0NBTEVSKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYpKQorCisvKiBfX0JBVURSQVRFX18gVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBhdmFpbGFibGUKKyAqICAgICAgICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkgICAgKi8KKyNkZWZpbmUgSVNfTExfVVNBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPD0gODAwMDAwMFUpCisKKy8qIF9fVkFMVUVfXyBJbiBjYXNlIG9mIG92ZXJzYW1wbGluZyBieSAxNiBhbmQgOCwgQlJSIGNvbnRlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTZkLiAqLworI2RlZmluZSBJU19MTF9VU0FSVF9CUlJfTUlOKF9fVkFMVUVfXykgKChfX1ZBTFVFX18pID49IDE2VSkKKworLyogX19WQUxVRV9fIEJSUiBjb250ZW50IG11c3QgYmUgbG93ZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkYuICovCisjZGVmaW5lIElTX0xMX1VTQVJUX0JSUl9NQVgoX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPD0gMHgwMDAwRkZGRlUpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfRElSRUNUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9SWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9UWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfUEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BBUklUWV9FVkVOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX09ERCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfN0IpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOEIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9EQVRBV0lEVEhfOUIpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX09WRVJTQU1QTElORyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0xBU1RCSVRDTEtPVVRQVVQoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQSEFTRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEhBU0VfMUVER0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEhBU0VfMkVER0UpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0NMT0NLUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BPTEFSSVRZX0xPVykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9DTE9DS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfQ0xPQ0tfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfQ0xPQ0tfRU5BQkxFKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9TVE9QQklUUyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMF81KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18xXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzIpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0hXQ09OVFJPTChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfUlRTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX0NUUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBVU0FSVCByZWdpc3RlcnMgKFJlZ2lzdGVycyByZXN0b3JlZCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcykuCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFVTQVJUIHJlZ2lzdGVycyBhcmUgbm90IGRlLWluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9VU0FSVF9EZUluaXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0lOU1RBTkNFKFVTQVJUeCkpOworCisgIGlmIChVU0FSVHggPT0gVVNBUlQxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSk7CisgIH0KKyAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMikKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9VU0FSVDIpOworICB9CisjaWYgZGVmaW5lZChVU0FSVDMpCisgIGVsc2UgaWYgKFVTQVJUeCA9PSBVU0FSVDMpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVVNBUlQzKTsKKyAgfQorI2VuZGlmIC8qIFVTQVJUMyAqLworI2lmIGRlZmluZWQoVVNBUlQ0KQorICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQ0KQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIFVTQVJUIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQVJUNCk7CisgIH0KKyNlbmRpZiAvKiBVU0FSVDQgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBVU0FSVCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gVVNBUlRfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIEFzIHNvbWUgYml0cyBpbiBVU0FSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFVTQVJUIGlzIGRpc2FibGVkIChVU0FSVF9DUjFfVUUgYml0ID0wKSwKKyAgKiAgICAgICAgIFVTQVJUIFBlcmlwaGVyYWwgc2hvdWxkIGJlIGluIGRpc2FibGVkIHN0YXRlIHByaW9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBFUlJPUiByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIEJhdWQgcmF0ZSB2YWx1ZSBzdG9yZWQgaW4gVVNBUlRfSW5pdFN0cnVjdCBCYXVkUmF0ZSBmaWVsZCwgc2hvdWxkIGJlIHZhbGlkIChkaWZmZXJlbnQgZnJvbSAwKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVVNBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgTExfVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFVTQVJUIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKyAgdWludDMyX3QgcGVyaXBoY2xrID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisjaWYgIWRlZmluZWQoUkNDX0NDSVBSX1VTQVJUM1NFTCkmJiFkZWZpbmVkKFJDQ19DQ0lQUl9VU0FSVDRTRUwpfHwhZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorICBMTF9SQ0NfQ2xvY2tzVHlwZURlZiBSQ0NfQ2xvY2tzOworI2VuZGlmCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9QUkVTQ0FMRVIoVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JBVURSQVRFKFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9EQVRBV0lEVEgoVVNBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9TVE9QQklUUyhVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfUEFSSVRZKFVTQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfRElSRUNUSU9OKFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9IV0NPTlRST0woVVNBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZykpOworCisgIC8qIFVTQVJUIG5lZWRzIHRvIGJlIGluIGRpc2FibGVkIHN0YXRlLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGJpdHMgaW4KKyAgICAgQ1J4IHJlZ2lzdGVycyAqLworICBpZiAoTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUeCkgPT0gMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjEgKFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHksIE1vZGUgYW5kIE92ZXJzYW1wbGluZyBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBEYXRhV2lkdGg6ICAgICAgICAgIFVTQVJUX0NSMV9NIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB2YWx1ZQorICAgICAqIC0gUGFyaXR5OiAgICAgICAgICAgICBVU0FSVF9DUjFfUENFLCBVU0FSVF9DUjFfUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHZhbHVlCisgICAgICogLSBUcmFuc2ZlckRpcmVjdGlvbjogIFVTQVJUX0NSMV9URSwgVVNBUlRfQ1IxX1JFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHZhbHVlCisgICAgICogLSBPdmVyc2FtcGxpbmc6ICAgICAgIFVTQVJUX0NSMV9PVkVSOCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLAorICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8CisgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX09WRVI4KSwKKyAgICAgICAgICAgICAgIChVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggfCBVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkgfAorICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHwgVVNBUlRfSW5pdFN0cnVjdC0+T3ZlclNhbXBsaW5nKSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjIgKFN0b3AgYml0cykgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gU3RvcCBCaXRzOiAgICAgICAgICBVU0FSVF9DUjJfU1RPUCBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyB2YWx1ZS4KKyAgICAgKiAtIENMS0VOLCBDUE9MLCBDUEhBIGFuZCBMQkNMIGJpdHMgYXJlIHRvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgTExfVVNBUlRfQ2xvY2tJbml0KCkuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjMgKEhhcmR3YXJlIEZsb3cgQ29udHJvbCkgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gSGFyZHdhcmVGbG93Q29udHJvbDogVVNBUlRfQ1IzX1JUU0UsIFVTQVJUX0NSM19DVFNFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVHgsIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHJpZXZlIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBQZXJpcGhlcmFsCisgICAgICovCisgICAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMikKKyAgICB7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQyU0VMKQorICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDJfQ0xLU09VUkNFKTsKKyNlbHNlCisgICAgICAvKiBVU0FSVDIgY2xvY2sgaXMgUENMSyAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOworICAgICAgcGVyaXBoY2xrID0gUkNDX0Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7CisjZW5kaWYKKyAgICB9CisjaWYgZGVmaW5lZChVU0FSVDMpCisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMykKKyAgICB7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQzU0VMKQorICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDNfQ0xLU09VUkNFKTsKKyNlbHNlCisgICAgICAvKiBVU0FSVDMgY2xvY2sgaXMgUENMSyAqLworICAgICAgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoJlJDQ19DbG9ja3MpOworICAgICAgcGVyaXBoY2xrID0gUkNDX0Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogVVNBUlQzICovCisjaWYgZGVmaW5lZChVU0FSVDQpCisgICAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUNCkKKyAgICB7CisjaWYgZGVmaW5lZChSQ0NfQ0NJUFJfVVNBUlQ0U0VMKQorICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDRfQ0xLU09VUkNFKTsKKyNlbHNlCisgICAgICAvKiBVU0FSVDQgY2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKCZSQ0NfQ2xvY2tzKTsKKyAgICAgIHBlcmlwaGNsayA9IFJDQ19DbG9ja3MuUENMSzFfRnJlcXVlbmN5OworI2VuZGlmCisgICAgfQorI2VuZGlmIC8qIFVTQVJUNCAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvLCBhcyBlcnJvciBjb2RlIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gRVJST1IgdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEJhdWQgUmF0ZSA6CisgICAgICAgLSBwcmVzY2FsZXIgdmFsdWUgaXMgcmVxdWlyZWQKKyAgICAgICAtIHZhbGlkIGJhdWQgcmF0ZSB2YWx1ZSAoZGlmZmVyZW50IGZyb20gMCkgaXMgcmVxdWlyZWQKKyAgICAgICAtIFBlcmlwaGVyYWwgY2xvY2sgYXMgcmV0dXJuZWQgYnkgUkNDIHNlcnZpY2UsIHNob3VsZCBiZSB2YWxpZCAoZGlmZmVyZW50IGZyb20gMCkuCisgICAgKi8KKyAgICBpZiAoKHBlcmlwaGNsayAhPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTykKKyAgICAgICAgJiYgKFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlICE9IDBVKSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBTVUNDRVNTOworICAgICAgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaXBoY2xrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9Jbml0U3RydWN0LT5PdmVyU2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSk7CisKKyAgICAgIC8qIENoZWNrIEJSUiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTZkICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfQlJSX01JTihVU0FSVHgtPkJSUikpOworCisgICAgICAvKiBDaGVjayBCUlIgaXMgbG93ZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkYgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9CUlJfTUFYKFVTQVJUeC0+QlJSKSk7CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIFBSRVNDIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgVVNBUlR4IFBSRVNDIChQcmVzY2FsZXIpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFByZXNjYWxlclZhbHVlOiBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUgdmFsdWUuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUeCwgVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUpOworICB9CisgIC8qIEVuZGlmICg9PiBVU0FSVCBub3QgaW4gRGlzYWJsZWQgc3RhdGUgPT4gcmV0dXJuIEVSUk9SKSAqLworCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfVVNBUlRfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gVVNBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisKK3ZvaWQgTExfVVNBUlRfU3RydWN0SW5pdChMTF9VU0FSVF9Jbml0VHlwZURlZiAqVVNBUlRfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFVTQVJUX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIFVTQVJUX0luaXRTdHJ1Y3QtPlByZXNjYWxlclZhbHVlICAgICAgPSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgICA9IDk2MDBVOworICBVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggICAgICAgICAgID0gTExfVVNBUlRfREFUQVdJRFRIXzhCOworICBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyAgICAgICAgICAgID0gTExfVVNBUlRfU1RPUEJJVFNfMTsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5ICAgICAgICAgICAgICA9IExMX1VTQVJUX1BBUklUWV9OT05FIDsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gICA9IExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWDsKKyAgVVNBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCA9IExMX1VTQVJUX0hXQ09OVFJPTF9OT05FOworICBVU0FSVF9Jbml0U3RydWN0LT5PdmVyU2FtcGxpbmcgICAgICAgID0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2OworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgVVNBUlQgQ2xvY2sgcmVsYXRlZCBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlCisgICogICAgICAgICBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVVNBUlRfQ2xvY2tJbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFVTQVJUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgVVNBUlQgaXMgZGlzYWJsZWQgKFVTQVJUX0NSMV9VRSBiaXQgPTApLAorICAqICAgICAgICAgVVNBUlQgUGVyaXBoZXJhbCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIENsb2NrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIHJlbGF0ZWQgdG8gQ2xvY2sgc2V0dGluZ3MgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIFVTQVJUIEluc3RhbmNlIGFuZCBDbG9jayBzaWduYWwgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS09VVFBVVChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0KSk7CisKKyAgLyogVVNBUlQgbmVlZHMgdG8gYmUgaW4gZGlzYWJsZWQgc3RhdGUsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIHNvbWUgYml0cyBpbgorICAgICBDUnggcmVnaXN0ZXJzICovCisgIGlmIChMTF9VU0FSVF9Jc0VuYWJsZWQoVVNBUlR4KSA9PSAwVSkKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogSWYgQ2xvY2sgc2lnbmFsIGhhcyB0byBiZSBvdXRwdXQgKi8KKyAgICBpZiAoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja091dHB1dCA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIERlYWN0aXZhdGUgQ2xvY2sgc2lnbmFsIGRlbGl2ZXJ5IDoKKyAgICAgICAqIC0gRGlzYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gY2xlYXJlZAorICAgICAgICovCisgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5zdXJlIFVTQVJUIGluc3RhbmNlIGlzIFVTQVJUIGNhcGFibGUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpKTsKKworICAgICAgLyogQ2hlY2sgY2xvY2sgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS1BIQVNFKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0xBU1RCSVRDTEtPVVRQVVQoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSkpOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IyIChDbG9jayBzaWduYWwgcmVsYXRlZCBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICAgKiAtIEVuYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHNldAorICAgICAgICogLSBDbG9jayBQb2xhcml0eTogICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHZhbHVlCisgICAgICAgKiAtIENsb2NrIFBoYXNlOiAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgdmFsdWUKKyAgICAgICAqIC0gTGFzdCBCaXQgQ2xvY2sgUHVsc2UgT3V0cHV0OiBVU0FSVF9DUjJfTEJDTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+TGFzdEJpdENsb2NrUHVsc2UgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsCisgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSk7CisgICAgfQorICB9CisgIC8qIEVsc2UgKFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBmaWVsZCBvZiBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiB0eXBlIHN0cnVjdHVyZSB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KExMX1VTQVJUX0Nsb2NrSW5pdFR5cGVEZWYgKlVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IExMX1VTQVJUX0Nsb2NrSW5pdFN0cnVjdCBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcyAqLworICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0ICAgICAgID0gTExfVVNBUlRfQ0xPQ0tfRElTQUJMRTsKKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1VTQVJUX1BPTEFSSVRZX0xPVzsgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1VTQVJUX1BIQVNFXzFFREdFOyAgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSA9IExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQ7ICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSB8fCBVU0FSVDIgfHwgVVNBUlQzIHx8IFVTQVJUNCAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmcweHhfbGxfdXRpbHMuYyBiL1NyYy9zdG0zMmcweHhfbGxfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA4ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyZzB4eF9sbF91dGlscy5jCkBAIC0wLDAgKzEsNTU5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJnMHh4X2xsX3V0aWxzLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVUSUxTIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3V0aWxzLmgiCisjaW5jbHVkZSAic3RtMzJnMHh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMyZzB4eF9sbF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJzdG0zMmcweHhfbGxfcHdyLmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBVVElMU19NQVhfRlJFUVVFTkNZICAgICAgICAgIDY0MDAwMDAwVSAgICAgLyohPCBNYXhpbXVtIGZyZXF1ZW5jeSBmb3Igc3lzdGVtIGNsb2NrLCBpbiBIeiAqLworCisvKiBEZWZpbmVzIHVzZWQgZm9yIFBMTCByYW5nZSAqLworI2RlZmluZSBVVElMU19QTExWQ09fSU5QVVRfTUlOICAgICAgIDQwMDAwMDBVICAgICAgLyohPCBGcmVxdWVuY3kgbWluIGZvciBQTExWQ08gaW5wdXQsIGluIEh6ICAgKi8KKyNkZWZpbmUgVVRJTFNfUExMVkNPX0lOUFVUX01BWCAgICAgICA4MDAwMDAwVSAgICAgIC8qITwgRnJlcXVlbmN5IG1heCBmb3IgUExMVkNPIGlucHV0LCBpbiBIeiAgICovCisjZGVmaW5lIFVUSUxTX1BMTFZDT19PVVRQVVRfTUlOICAgICAgNjQwMDAwMDBVICAgICAvKiE8IEZyZXF1ZW5jeSBtaW4gZm9yIFBMTFZDTyBvdXRwdXQsIGluIEh6ICAqLworI2RlZmluZSBVVElMU19QTExWQ09fT1VUUFVUX01BWCAgICAgIDM0NDAwMDAwMFUgICAgLyohPCBGcmVxdWVuY3kgbWF4IGZvciBQTExWQ08gb3V0cHV0LCBpbiBIeiAgKi8KKworLyogRGVmaW5lcyB1c2VkIGZvciBIU0UgcmFuZ2UgKi8KKyNkZWZpbmUgVVRJTFNfSFNFX0ZSRVFVRU5DWV9NSU4gICAgICA0MDAwMDAwVSAgICAgIC8qITwgRnJlcXVlbmN5IG1pbiBmb3IgSFNFIGZyZXF1ZW5jeSwgaW4gSHogICAqLworI2RlZmluZSBVVElMU19IU0VfRlJFUVVFTkNZX01BWCAgICAgIDQ4MDAwMDAwVSAgICAgLyohPCBGcmVxdWVuY3kgbWF4IGZvciBIU0UgZnJlcXVlbmN5LCBpbiBIeiAgICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgRkxBU0ggbGF0ZW5jeSBhY2NvcmRpbmcgdG8gSENMSyBGcmVxdWVuY3kgKi8KKyNkZWZpbmUgVVRJTFNfU0NBTEUxX0xBVEVOQ1kxX0ZSRVEgIDI0MDAwMDAwVSAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDEgaW4gcG93ZXIgc2NhbGUgMSAgKi8KKyNkZWZpbmUgVVRJTFNfU0NBTEUxX0xBVEVOQ1kyX0ZSRVEgIDQ4MDAwMDAwVSAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDIgaW4gcG93ZXIgc2NhbGUgMSAgKi8KKyNkZWZpbmUgVVRJTFNfU0NBTEUxX0xBVEVOQ1kzX0ZSRVEgIDY0MDAwMDAwVSAgICAgICAvKiE8IEhDTEsgZnJlcXVlbmN5IHRvIHNldCBGTEFTSCBsYXRlbmN5IDMgaW4gcG93ZXIgc2NhbGUgMSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9VVElMU19TWVNDTEtfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl84KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzY0KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMjU2KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzUxMikpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfQVBCMV9ESVYoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl8xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjFfRElWXzQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl84KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfMTYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0hTSV9ESVYoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSFNJX0RJVl8xKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0hTSV9ESVZfMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19IU0lfRElWXzQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSFNJX0RJVl84KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0hTSV9ESVZfMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19IU0lfRElWXzMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSFNJX0RJVl82NCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0hTSV9ESVZfMTI4KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExNX1ZBTFVFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfMykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfNykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUExMTV9ESVZfOCkpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfUExMTl9WQUxVRShfX1ZBTFVFX18pICgoOFUgPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSA4NlUpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX1BMTFJfVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl8yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl8zKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl80KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl81KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl82KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl83KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExSX0RJVl84KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExWQ09fSU5QVVQoX19WQUxVRV9fKSAgKChVVElMU19QTExWQ09fSU5QVVRfTUlOIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gVVRJTFNfUExMVkNPX0lOUFVUX01BWCkpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfUExMVkNPX09VVFBVVChfX1ZBTFVFX18pICgoVVRJTFNfUExMVkNPX09VVFBVVF9NSU4gPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSBVVElMU19QTExWQ09fT1VUUFVUX01BWCkpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfUExMX0ZSRVFVRU5DWShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSBVVElMU19NQVhfRlJFUVVFTkNZKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0hTRV9CWVBBU1MoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IExMX1VUSUxTX0hTRUJZUEFTU19PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19TVEFURV9fKSA9PSBMTF9VVElMU19IU0VCWVBBU1NfT0ZGKSkKKworI2RlZmluZSBJU19MTF9VVElMU19IU0VfRlJFUVVFTkNZKF9fRlJFUVVFTkNZX18pICgoKF9fRlJFUVVFTkNZX18pID49IFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUlOKSAmJiAoKF9fRlJFUVVFTkNZX18pIDw9IFVUSUxTX0hTRV9GUkVRVUVOQ1lfTUFYKSkKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0Z1bmN0aW9ucyBVVElMUyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdWludDMyX3QgICAgVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KHVpbnQzMl90IFBMTF9JbnB1dEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1NldEZsYXNoTGF0ZW5jeSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSk7CitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3ksIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19QTExfSXNCdXN5KHZvaWQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVVElMU19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfRUZfREVMQVkKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgQ29ydGV4LU0gU3lzVGljayBzb3VyY2UgdG8gaGF2ZSAxbXMgdGltZSBiYXNlLgorICAqIEBub3RlICAgV2hlbiBhIFJUT1MgaXMgdXNlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIFN5c3RpY2sKKyAgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBmb3IgYSBkZWxheSB1c2UgcmF0aGVyIG9zRGVsYXkgUlRPUyBzZXJ2aWNlLgorICAqIEBwYXJhbSAgSENMS0ZyZXF1ZW5jeSBIQ0xLIGZyZXF1ZW5jeSBpbiBIegorICAqIEBub3RlICAgSENMSyBmcmVxdWVuY3kgY2FuIGJlIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIFJDQyBoZWxwZXIgbWFjcm8gb3IgZnVuY3Rpb24gQHJlZiBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9Jbml0MW1zVGljayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KQoreworICAvKiBVc2UgZnJlcXVlbmN5IHByb3ZpZGVkIGluIGFyZ3VtZW50ICovCisgIExMX0luaXRUaWNrKEhDTEtGcmVxdWVuY3ksIDEwMDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY3VyYXRlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJhc2VkCisgICogICAgICAgICBvbiBTeXNUaWNrIGNvdW50ZXIgZmxhZworICAqIEBub3RlICAgV2hlbiBhIFJUT1MgaXMgdXNlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgdXNpbmcgYmxvY2tpbmcgZGVsYXkKKyAgKiAgICAgICAgIGFuZCB1c2UgcmF0aGVyIG9zRGVsYXkgc2VydmljZS4KKyAgKiBAbm90ZSAgIFRvIHJlc3BlY3QgMW1zIHRpbWViYXNlLCB1c2VyIHNob3VsZCBjYWxsIEByZWYgTExfSW5pdDFtc1RpY2sgZnVuY3Rpb24gd2hpY2gKKyAgKiAgICAgICAgIHdpbGwgY29uZmlndXJlIFN5c3RpY2sgdG8gMW1zCisgICogQHBhcmFtICBEZWxheSBzcGVjaWZpZXMgdGhlIGRlbGF5IHRpbWUgbGVuZ3RoLCBpbiBtaWxsaXNlY29uZHMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX21EZWxheSh1aW50MzJfdCBEZWxheSkKK3sKKyAgX19JTyB1aW50MzJfdCAgdG1wID0gU3lzVGljay0+Q1RSTDsgIC8qIENsZWFyIHRoZSBDT1VOVEZMQUcgZmlyc3QgKi8KKyAgIHVpbnQzMl90IHRtcERlbGF5OyAvKiBNSVNSQUMyMDEyLVJ1bGUtMTcuOCAqLworICAvKiBBZGQgdGhpcyBjb2RlIHRvIGluZGljYXRlIHRoYXQgbG9jYWwgdmFyaWFibGUgaXMgbm90IHVzZWQgKi8KKyAgKCh2b2lkKXRtcCk7CisgIHRtcERlbGF5ICA9IERlbGF5OworICAvKiBBZGQgYSBwZXJpb2QgdG8gZ3VhcmFudHkgbWluaW11bSB3YWl0ICovCisgIGlmICh0bXBEZWxheSAgPCBMTF9NQVhfREVMQVkpCisgIHsKKyAgICB0bXBEZWxheSArKzsKKyAgfQorCisgIHdoaWxlICh0bXBEZWxheSAgIT0gMFUpCisgIHsKKyAgICBpZiAoKFN5c1RpY2stPkNUUkwgJiBTeXNUaWNrX0NUUkxfQ09VTlRGTEFHX01zaykgIT0gMFUpCisgICAgeworICAgICAgdG1wRGVsYXkgLS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVVElMU19FRl9TWVNURU0KKyAgKiAgQGJyaWVmICAgIFN5c3RlbSBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIyMjIyMgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgIFN5c3RlbSwgQUhCIGFuZCBBUEIgYnVzZXMgY2xvY2tzIGNvbmZpZ3VyYXRpb24KKworICAgICAgICAgKCspIFRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBvZiB0aGUgU1lTQ0xLLCBIQ0xLLCBQQ0xLMSBpcyA2NDAwMDAwMCBIei4KKyAgQGVuZHZlcmJhdGltCisgIEBpbnRlcm5hbAorICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UsIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBzaG91bGQgYmUKKyAgICAgICAgICAgICBhZGFwdGVkIGFjY29yZGluZ2x5OgorCisgICAgICAgICAgICAgKCsrKSAgVGFibGUgMS4gSENMSyBjbG9jayBmcmVxdWVuY3kuCisgICAgICAgICAgICAgKCsrKSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgKCsrKSAgfCBMYXRlbmN5ICAgICAgICAgfCAgICBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoTUh6KSAgICAgICB8CisgICAgICAgICAgICAgKCsrKSAgfCAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSAgfCAgICAgICAgICAgICAgICAgfCB2b2x0YWdlIHJhbmdlIDEgIHwgdm9sdGFnZSByYW5nZSAyICB8CisgICAgICAgICAgICAgKCsrKSAgfCAgICAgICAgICAgICAgICAgfCAgIDEuMDhWIC0gMS4zMlYgIHwgIDAuOSBWIC0gMS4xMFYgICB8CisgICAgICAgICAgICAgKCsrKSAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSAgfDBXUygxIENQVSBjeWNsZXMpfCAgICAgIEhDTEsgPD0gMjQgIHwgICAgICBIQ0xLIDw9IDggICB8CisgICAgICAgICAgICAgKCsrKSAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSAgfDFXUygyIENQVSBjeWNsZXMpfCAgICAgIEhDTEsgPD0gNDggIHwgICAgICBIQ0xLIDw9IDE2ICB8CisgICAgICAgICAgICAgKCsrKSAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSAgfDJXUygzIENQVSBjeWNsZXMpfCAgICAgIEhDTEsgPD0gNjQgIHwgICAgICAgIC0gICAgICAgICB8CisgICAgICAgICAgICAgKCsrKSAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisKKyAgQGVuZGludGVybmFsCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHNldHMgZGlyZWN0bHkgU3lzdGVtQ29yZUNsb2NrIENNU0lTIHZhcmlhYmxlLgorICAqIEBub3RlICAgVmFyaWFibGUgY2FuIGJlIGNhbGN1bGF0ZWQgYWxzbyB0aHJvdWdoIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIEhDTEtGcmVxdWVuY3kgSENMSyBmcmVxdWVuY3kgaW4gSHogKGNhbiBiZSBjYWxjdWxhdGVkIHRoYW5rcyB0byBSQ0MgaGVscGVyIG1hY3JvKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9TZXRTeXN0ZW1Db3JlQ2xvY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSkKK3sKKyAgLyogSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgU3lzdGVtQ29yZUNsb2NrID0gSENMS0ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgc3lzdGVtIGNsb2NrIGF0IG1heGltdW0gZnJlcXVlbmN5IHdpdGggSFNJIGFzIGNsb2NrIHNvdXJjZSBvZiB0aGUgUExMCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZCB0byBlbnN1cmUgdGhhdCBQTEwgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICogICAgICAgICAtIFBMTCBvdXRwdXQgZnJlcXVlbmN5ID0gKCgoSFNJIGZyZXF1ZW5jeSAvIFBMTE0pICogUExMTikgLyBQTExSKQorICAqICAgICAgICAgLSBQTExNOiBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1IeiAoUExMVkNPX2lucHV0ID0gSFNJIGZyZXF1ZW5jeSAvIFBMTE0pCisgICogICAgICAgICAtIFBMTE46IGVuc3VyZSB0aGF0IHRoZSBWQ08gb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6IChQTExWQ09fb3V0cHV0ID0gUExMVkNPX2lucHV0ICogUExMTikKKyAgKiAgICAgICAgIC0gUExMUjogZW5zdXJlIHRoYXQgbWF4IGZyZXF1ZW5jeSBhdCA2NDAwMDAwMCBIeiBpcyByZWFjaCAoUExMVkNPX291dHB1dCAvIFBMTFIpCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTSShMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1czsKKyAgdWludDMyX3QgcGxsZnJlcTsKKworICAvKiBDaGVjayBpZiBvbmUgb2YgdGhlIFBMTCBpcyBlbmFibGVkICovCisgIGlmIChVVElMU19QTExfSXNCdXN5KCkgPT0gU1VDQ0VTUykKKyAgeworICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV3IFBMTCBvdXRwdXQgZnJlcXVlbmN5ICovCisgICAgcGxsZnJlcSA9IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeShIU0lfVkFMVUUsIFVUSUxTX1BMTEluaXRTdHJ1Y3QpOworCisgICAgLyogRW5hYmxlIEhTSSBpZiBub3QgZW5hYmxlZCAqLworICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAxVSkKKyAgICB7CisgICAgICBMTF9SQ0NfSFNJX0VuYWJsZSgpOworICAgICAgd2hpbGUgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDFVKQorICAgICAgeworICAgICAgICAvKiBXYWl0IGZvciBIU0kgcmVhZHkgKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgUExMICovCisgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKExMX1JDQ19QTExTT1VSQ0VfSFNJLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNLCBVVElMU19QTExJbml0U3RydWN0LT5QTExOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVElMU19QTExJbml0U3RydWN0LT5QTExSKTsKKworICAgIC8qIEVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovCisgICAgc3RhdHVzID0gVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHBsbGZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEN1cnJlbnQgUExMIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBzeXN0ZW0gY2xvY2sgd2l0aCBIU0UgYXMgY2xvY2sgc291cmNlIG9mIHRoZSBQTEwKKyAgKiBAbm90ZSAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkIHRvIGVuc3VyZSB0aGF0IFBMTCBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgKiAgICAgICAgIC0gUExMIG91dHB1dCBmcmVxdWVuY3kgPSAoKChIU0UgZnJlcXVlbmN5IC8gUExMTSkgKiBQTExOKSAvIFBMTFIpCisgICogICAgICAgICAtIFBMTE06IGVuc3VyZSB0aGF0IHRoZSBWQ08gaW5wdXQgZnJlcXVlbmN5IHJhbmdlcyBmcm9tIDQgdG8gMTYgTUh6IChQTExWQ09faW5wdXQgPSBIU0UgZnJlcXVlbmN5IC8gUExMTSkKKyAgKiAgICAgICAgIC0gUExMTjogZW5zdXJlIHRoYXQgdGhlIFZDTyBvdXRwdXQgZnJlcXVlbmN5IGlzIGJldHdlZW4gNjQgYW5kIDM0NCBNSHogKFBMTFZDT19vdXRwdXQgPSBQTExWQ09faW5wdXQgKiBQTExOKQorICAqICAgICAgICAgLSBQTExSOiBlbnN1cmUgdGhhdCBtYXggZnJlcXVlbmN5IGF0IDY0MDAwMDAwIEh6IGlzIHJlYWNoZWQgKFBMTFZDT19vdXRwdXQgLyBQTExSKQorICAqIEBwYXJhbSAgSFNFRnJlcXVlbmN5IFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSA0MDAwMDAwIGFuZCBNYXhfRGF0YSA9IDQ4MDAwMDAwCisgICogQHBhcmFtICBIU0VCeXBhc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19IU0VCWVBBU1NfT0ZGCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTRSh1aW50MzJfdCBIU0VGcmVxdWVuY3ksIHVpbnQzMl90IEhTRUJ5cGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXM7CisgIHVpbnQzMl90IHBsbGZyZXE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0hTRV9GUkVRVUVOQ1koSFNFRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19IU0VfQllQQVNTKEhTRUJ5cGFzcykpOworCisgIC8qIENoZWNrIGlmIG9uZSBvZiB0aGUgUExMIGlzIGVuYWJsZWQgKi8KKyAgaWYgKFVUSUxTX1BMTF9Jc0J1c3koKSA9PSBTVUNDRVNTKQorICB7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKyAgICBwbGxmcmVxID0gVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KEhTRUZyZXF1ZW5jeSwgVVRJTFNfUExMSW5pdFN0cnVjdCk7CisKKyAgICAvKiBFbmFibGUgSFNFIGlmIG5vdCBlbmFibGVkICovCisgICAgaWYgKExMX1JDQ19IU0VfSXNSZWFkeSgpICE9IDFVKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIG5lZWQgdG8gZW5hYmxlIEhTRSBieXBhc3MgZmVhdHVyZSBvciBub3QgKi8KKyAgICAgIGlmIChIU0VCeXBhc3MgPT0gTExfVVRJTFNfSFNFQllQQVNTX09OKQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsKKyAgICAgIH0KKworICAgICAgLyogRW5hYmxlIEhTRSAqLworICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsKKyAgICAgIHdoaWxlIChMTF9SQ0NfSFNFX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgSFNFIHJlYWR5ICovCisgICAgICB9CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIFBMTCAqLworICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUyhMTF9SQ0NfUExMU09VUkNFX0hTRSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMUik7CisKKyAgICAvKiBFbmFibGUgUExMIGFuZCBzd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTCAqLworICAgIHN0YXR1cyA9IFVUSUxTX0VuYWJsZVBMTEFuZFN3aXRjaFN5c3RlbShwbGxmcmVxLCBVVElMU19DbGtJbml0U3RydWN0KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDdXJyZW50IFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0xMX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgVXBkYXRlIG51bWJlciBvZiBGbGFzaCB3YWl0IHN0YXRlcyBpbiBsaW5lIHdpdGggbmV3IGZyZXF1ZW5jeSBhbmQgY3VycmVudAorICAgICAgICAgICAgdm9sdGFnZSByYW5nZS4KKyAgKiBAcGFyYW0gIEhDTEtfRnJlcXVlbmN5ICBIQ0xLIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBMYXRlbmN5IGhhcyBiZWVuIG1vZGlmaWVkCisgICogICAgICAgICAgLSBFUlJPUjogTGF0ZW5jeSBjYW5ub3QgYmUgbW9kaWZpZWQKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19TZXRGbGFzaExhdGVuY3kodWludDMyX3QgSENMS19GcmVxdWVuY3kpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgdWludDMyX3QgbGF0ZW5jeSA9IExMX0ZMQVNIX0xBVEVOQ1lfMDsgIC8qIGRlZmF1bHQgdmFsdWUgMFdTICovCisKKyAgLyogRnJlcXVlbmN5IGNhbm5vdCBiZSBlcXVhbCB0byAwICovCisgIGlmIChIQ0xLX0ZyZXF1ZW5jeSA9PSAwVSkKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChIQ0xLX0ZyZXF1ZW5jeSA+IFVUSUxTX1NDQUxFMV9MQVRFTkNZMl9GUkVRKQorICAgIHsKKyAgICAgIC8qIDQ4IDwgSENMSyA8PSA2NCA9PiAyV1MgKDMgQ1BVIGN5Y2xlcykgKi8KKyAgICAgIGxhdGVuY3kgPSBMTF9GTEFTSF9MQVRFTkNZXzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoSENMS19GcmVxdWVuY3kgPiBVVElMU19TQ0FMRTFfTEFURU5DWTFfRlJFUSkKKyAgICAgIHsKKyAgICAgICAgLyogMjQgPCBIQ0xLIDw9IDQ4ID0+IDFXUyAoMiBDUFUgY3ljbGVzKSAqLworICAgICAgICBsYXRlbmN5ID0gTExfRkxBU0hfTEFURU5DWV8xOworICAgICAgfQorICAgICAgLyogZWxzZSBIQ0xLX0ZyZXF1ZW5jeSA8IDI0TUh6IGRlZmF1bHQgTExfRkxBU0hfTEFURU5DWV8wIDBXUyAqLworICAgIH0KKworICAgIExMX0ZMQVNIX1NldExhdGVuY3kobGF0ZW5jeSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCisgICAgICAgbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIGlmIChMTF9GTEFTSF9HZXRMYXRlbmN5KCkgIT0gbGF0ZW5jeSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBjaGVjayB0aGF0IFBMTCBjYW4gYmUgbW9kaWZpZWQKKyAgKiBAcGFyYW0gIFBMTF9JbnB1dEZyZXF1ZW5jeSAgUExMIGlucHV0IGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEByZXR2YWwgUExMIG91dHB1dCBmcmVxdWVuY3kgKGluIEh6KQorICAqLworc3RhdGljIHVpbnQzMl90IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeSh1aW50MzJfdCBQTExfSW5wdXRGcmVxdWVuY3ksIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0KQoreworICB1aW50MzJfdCBwbGxmcmVxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExNX1ZBTFVFKFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTE0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTE5fVkFMVUUoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUExMUl9WQUxVRShVVElMU19QTExJbml0U3RydWN0LT5QTExSKSk7CisKKyAgLyogQ2hlY2sgZGlmZmVyZW50IFBMTCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBSTSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gUExMTTogZW5zdXJlIHRoYXQgdGhlIFZDTyBpbnB1dCBmcmVxdWVuY3kgcmFuZ2VzIGZyb20gNCB0byAxNiBNSHouICAgKi8KKyAgcGxsZnJlcSA9IFBMTF9JbnB1dEZyZXF1ZW5jeSAvICgoKFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTE0gPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTFZDT19JTlBVVChwbGxmcmVxKSk7CisKKyAgLyogIC0gUExMTjogZW5zdXJlIHRoYXQgdGhlIFZDTyBvdXRwdXQgZnJlcXVlbmN5IGlzIGJldHdlZW4gNjQgYW5kIDM0NCBNSHouKi8KKyAgcGxsZnJlcSA9IHBsbGZyZXEgKiAoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTiAmIChSQ0NfUExMQ0ZHUl9QTExOID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExWQ09fT1VUUFVUKHBsbGZyZXEpKTsKKworICAvKiAgLSBQTExSOiBlbnN1cmUgdGhhdCBtYXggZnJlcXVlbmN5IGF0IDY0MDAwMDAwIEh6IGlzIHJlYWNoZWQgICAgICAgICAgICAgICAgICAgKi8KKyAgcGxsZnJlcSA9IHBsbGZyZXEgLyAoKChVVElMU19QTExJbml0U3RydWN0LT5QTExSID4+IFJDQ19QTExDRkdSX1BMTFJfUG9zKSArIDFVKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExfRlJFUVVFTkNZKHBsbGZyZXEpKTsKKworICByZXR1cm4gcGxsZnJlcTsKK30KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBjaGVjayB0aGF0IFBMTCBjYW4gYmUgbW9kaWZpZWQKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUExMIG1vZGlmaWNhdGlvbiBjYW4gYmUgZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IFBMTCBpcyBidXN5CisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfUExMX0lzQnVzeSh2b2lkKQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIGlmIFBMTCBpcyBidXN5Ki8KKyAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpICE9IDBVKQorICB7CisgICAgLyogUExMIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMCisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFVUSUxTX0Nsa0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBCVVMgcHJlc2NhbGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTm8gcHJvYmxlbSB0byBzd2l0Y2ggc3lzdGVtIHRvIFBMTAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gdG8gc3dpdGNoIHN5c3RlbSB0byBQTEwKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19FbmFibGVQTExBbmRTd2l0Y2hTeXN0ZW0odWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IGhjbGtfZnJlcXVlbmN5OworCisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19TWVNDTEtfRElWKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0FQQjFfRElWKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKSk7CisKKyAgLyogQ2FsY3VsYXRlIEhDTEsgZnJlcXVlbmN5ICovCisgIGhjbGtfZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19IQ0xLX0ZSRVEoU1lTQ0xLX0ZyZXF1ZW5jeSwgVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLRGl2aWRlcik7CisKKyAgLyogSW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgaGlnaGVyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKFN5c3RlbUNvcmVDbG9jayA8IGhjbGtfZnJlcXVlbmN5KQorICB7CisgICAgLyogU2V0IEZMQVNIIGxhdGVuY3kgdG8gaGlnaGVzdCBsYXRlbmN5ICovCisgICAgc3RhdHVzID0gVVRJTFNfU2V0Rmxhc2hMYXRlbmN5KGhjbGtfZnJlcXVlbmN5KTsKKyAgfQorCisgIC8qIFVwZGF0ZSBzeXN0ZW0gY2xvY2sgY29uZmlndXJhdGlvbiAqLworICBpZiAoc3RhdHVzID09IFNVQ0NFU1MpCisgIHsKKyAgICAvKiBFbmFibGUgUExMICovCisgICAgTExfUkNDX1BMTF9FbmFibGUoKTsKKyAgICBMTF9SQ0NfUExMX0VuYWJsZURvbWFpbl9TWVMoKTsKKyAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgLyogV2FpdCBmb3IgUExMIHJlYWR5ICovCisgICAgfQorCisgICAgLyogU3lzY2xrIGFjdGl2YXRpb24gb24gdGhlIG1haW4gUExMICovCisgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKTsKKyAgICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCk7CisgICAgd2hpbGUgKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSAhPSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMKQorICAgIHsKKyAgICAgIC8qIFdhaXQgZm9yIHN5c3RlbSBjbG9jayBzd2l0Y2ggdG8gUExMICovCisgICAgfQorCisgICAgLyogU2V0IEFQQjEgJiBBUEIyIHByZXNjYWxlciovCisgICAgTExfUkNDX1NldEFQQjFQcmVzY2FsZXIoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworICB9CisKKyAgLyogRGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgbG93ZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZiAoU3lzdGVtQ29yZUNsb2NrID4gaGNsa19mcmVxdWVuY3kpCisgIHsKKyAgICAvKiBTZXQgRkxBU0ggbGF0ZW5jeSB0byBsb3dlc3QgbGF0ZW5jeSAqLworICAgIHN0YXR1cyA9IFVUSUxTX1NldEZsYXNoTGF0ZW5jeShoY2xrX2ZyZXF1ZW5jeSk7CisgIH0KKworICAvKiBVcGRhdGUgU3lzdGVtQ29yZUNsb2NrIHZhcmlhYmxlICovCisgIGlmIChzdGF0dXMgPT0gU1VDQ0VTUykKKyAgeworICAgIExMX1NldFN5c3RlbUNvcmVDbG9jayhoY2xrX2ZyZXF1ZW5jeSk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvX2h0bXJlc2MvbWluaS1zdC5jc3MgYi9faHRtcmVzYy9taW5pLXN0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZiYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvX2h0bXJlc2MvbWluaS1zdC5jc3MKQEAgLTAsMCArMSwxNzAwIEBACitAY2hhcnNldCAiVVRGLTgiOworLyoKKyAgRmxhdm9yIG5hbWU6IERlZmF1bHQgKG1pbmktZGVmYXVsdCkKKyAgQXV0aG9yOiBBbmdlbG9zIENoYWxhcmlzIChjaGFsYXJhbmdlbG9AZ21haWwuY29tKQorICBNYWludGFpbmVyczogQW5nZWxvcyBDaGFsYXJpcworICBtaW5pLmNzcyB2ZXJzaW9uOiB2My4wLjAtYWxwaGEuMworKi8KKy8qCisgIEJyb3dzZXJzIHJlc2V0cyBhbmQgYmFzZSB0eXBvZ3JhcGh5LgorKi8KKy8qIENvcmUgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWZvcmUtY29sb3I6ICMxMTE7CisgIC0tc2Vjb25kYXJ5LWZvcmUtY29sb3I6ICM0NDQ7CisgIC0tYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1zZWNvbmRhcnktYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1ibG9ja3F1b3RlLWNvbG9yOiAjZjU3YzAwOworICAtLXByZS1jb2xvcjogIzE1NjVjMDsKKyAgLS1ib3JkZXItY29sb3I6ICNhYWE7CisgIC0tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1oZWFkaW5nLXJhdGlvOiAxLjE5OworICAtLXVuaXZlcnNhbC1tYXJnaW46IDAuNXJlbTsKKyAgLS11bml2ZXJzYWwtcGFkZGluZzogMC4xMjVyZW07CisgIC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXM6IDAuMTI1cmVtOworICAtLWEtbGluay1jb2xvcjogIzAyNzdiZDsKKyAgLS1hLXZpc2l0ZWQtY29sb3I6ICMwMTU3OWI7IH0KKworaHRtbCB7CisgIGZvbnQtc2l6ZTogMTRweDsgfQorCithLCBiLCBkZWwsIGVtLCBpLCBpbnMsIHEsIHNwYW4sIHN0cm9uZywgdSB7CisgIGZvbnQtc2l6ZTogMWVtOyB9CisKK2h0bWwsICogeworICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIFVidW50dSwgIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworICBsaW5lLWhlaWdodDogMS40OworICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IH0KKworKiB7CisgIGZvbnQtc2l6ZTogMXJlbTsgfQorCitib2R5IHsKKyAgbWFyZ2luOiAwOworICBjb2xvcjogdmFyKC0tZm9yZS1jb2xvcik7CisgIGJhY2tncm91bmQ6IHZhcigtLWJhY2stY29sb3IpOyB9CisKK2RldGFpbHMgeworICBkaXNwbGF5OiBibG9jazsgfQorCitzdW1tYXJ5IHsKKyAgZGlzcGxheTogbGlzdC1pdGVtOyB9CisKK2FiYnJbdGl0bGVdIHsKKyAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyB9CisKK2lucHV0IHsKKyAgb3ZlcmZsb3c6IHZpc2libGU7IH0KKworaW1nIHsKKyAgbWF4LXdpZHRoOiAxMDAlOworICBoZWlnaHQ6IGF1dG87IH0KKworaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7CisgIGxpbmUtaGVpZ2h0OiAxLjI7CisgIG1hcmdpbjogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGZvbnQtd2VpZ2h0OiA1MDA7IH0KKyAgaDEgc21hbGwsIGgyIHNtYWxsLCBoMyBzbWFsbCwgaDQgc21hbGwsIGg1IHNtYWxsLCBoNiBzbWFsbCB7CisgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS1mb3JlLWNvbG9yKTsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAtMC4yNXJlbTsgfQorCitoMSB7CisgIGZvbnQtc2l6ZTogY2FsYygxcmVtICogdmFyKC0taGVhZGluZy1yYXRpbykgKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSAqIHZhcigtLWhlYWRpbmctcmF0aW8pKTsgfQorCitoMiB7CisgIGZvbnQtc2l6ZTogY2FsYygxcmVtICogdmFyKC0taGVhZGluZy1yYXRpbykgKiB2YXIoLS1oZWFkaW5nLXJhdGlvKTsgKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tbWFyay1iYWNrLWNvbG9yKTsKKyAgZm9udC13ZWlnaHQ6IDYwMDsKKyAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07CisgIGNvbG9yOiB2YXIoLS1tYXJrLWZvcmUtY29sb3IpOyB9CisKK2gzIHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSk7CisgIHBhZGRpbmctbGVmdDogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyAKKyAgLyogYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsgKi8KKyAgICB9CisKK2g0IHsKKyAgZm9udC1zaXplOiAxcmVtOyk7CisgIHBhZGRpbmctbGVmdDogY2FsYyg0ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyAgfQorCitoNSB7CisgIGZvbnQtc2l6ZTogMXJlbTsgfQorCitoNiB7CisgIGZvbnQtc2l6ZTogY2FsYygxcmVtIC8gdmFyKC0taGVhZGluZy1yYXRpbykpOyB9CisKK3AgeworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisKK29sLCB1bCB7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIHBhZGRpbmctbGVmdDogY2FsYyg2ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisKK2IsIHN0cm9uZyB7CisgIGZvbnQtd2VpZ2h0OiA3MDA7IH0KKworaHIgeworICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKKyAgYm9yZGVyOiAwOworICBsaW5lLWhlaWdodDogMS4yNWVtOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBoZWlnaHQ6IDAuMDYyNXJlbTsKKyAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCwgdmFyKC0tYm9yZGVyLWNvbG9yKSAyMCUsIHZhcigtLWJvcmRlci1jb2xvcikgODAlLCB0cmFuc3BhcmVudCk7IH0KKworYmxvY2txdW90ZSB7CisgIGRpc3BsYXk6IGJsb2NrOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgY29sb3I6IHZhcigtLXNlY29uZGFyeS1mb3JlLWNvbG9yKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgcGFkZGluZzogY2FsYygzICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1sZWZ0OiAwLjM3NXJlbSBzb2xpZCB2YXIoLS1ibG9ja3F1b3RlLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogMCB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIDA7IH0KKyAgYmxvY2txdW90ZTpiZWZvcmUgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IGNhbGMoMHJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgbGVmdDogMDsKKyAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6IDNyZW07CisgICAgZm9udC13ZWlnaHQ6IDcwMDsKKyAgICBjb250ZW50OiAiXDIwMWMiOworICAgIGNvbG9yOiB2YXIoLS1ibG9ja3F1b3RlLWNvbG9yKTsgfQorICBibG9ja3F1b3RlW2NpdGVdOmFmdGVyIHsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7CisgICAgZm9udC1zaXplOiAwLjc1ZW07CisgICAgZm9udC13ZWlnaHQ6IDcwMDsKKyAgICBjb250ZW50OiAiXGHigJQgICIgYXR0cihjaXRlKTsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOyB9CisKK2NvZGUsIGtiZCwgcHJlLCBzYW1wIHsKKyAgZm9udC1mYW1pbHk6IE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlOworICBmb250LXNpemU6IDAuODVlbTsgfQorCitjb2RlIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2stY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCitrYmQgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1mb3JlLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWJhY2stY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCitwcmUgeworICBvdmVyZmxvdzogYXV0bzsKKyAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2stY29sb3IpOworICBwYWRkaW5nOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOworICBib3JkZXItbGVmdDogMC4yNXJlbSBzb2xpZCB2YXIoLS1wcmUtY29sb3IpOworICBib3JkZXItcmFkaXVzOiAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMDsgfQorCitzdXAsIHN1YiwgY29kZSwga2JkIHsKKyAgbGluZS1oZWlnaHQ6IDA7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOyB9CisKK3NtYWxsLCBzdXAsIHN1YiwgZmlnY2FwdGlvbiB7CisgIGZvbnQtc2l6ZTogMC43NWVtOyB9CisKK3N1cCB7CisgIHRvcDogLTAuNWVtOyB9CisKK3N1YiB7CisgIGJvdHRvbTogLTAuMjVlbTsgfQorCitmaWd1cmUgeworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisKK2ZpZ2NhcHRpb24geworICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWZvcmUtY29sb3IpOyB9CisKK2EgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KKyAgYTpsaW5rIHsKKyAgICBjb2xvcjogdmFyKC0tYS1saW5rLWNvbG9yKTsgfQorICBhOnZpc2l0ZWQgeworICAgIGNvbG9yOiB2YXIoLS1hLXZpc2l0ZWQtY29sb3IpOyB9CisgIGE6aG92ZXIsIGE6Zm9jdXMgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciB0aGUgZ3JpZCBzeXN0ZW0sIGNhcmRzIGFuZCBjb250YWluZXJzLgorKi8KKy5jb250YWluZXIgeworICBtYXJnaW46IDAgYXV0bzsKKyAgcGFkZGluZzogMCBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKworLnJvdyB7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXg6IDAgMSBhdXRvOworICBmbGV4LWZsb3c6IHJvdyB3cmFwOyB9CisKKy5jb2wtc20sCitbY2xhc3NePSdjb2wtc20tJ10sCitbY2xhc3NePSdjb2wtc20tb2Zmc2V0LSddLAorLnJvd1tjbGFzcyo9J2NvbHMtc20tJ10gPiAqIHsKKyAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgZmxleDogMCAwIGF1dG87CisgIHBhZGRpbmc6IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCisuY29sLXNtLAorLnJvdy5jb2xzLXNtID4gKiB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgZmxleC1ncm93OiAxOworICBmbGV4LWJhc2lzOiAwOyB9CisKKy5jb2wtc20tMSwKKy5yb3cuY29scy1zbS0xID4gKiB7CisgIG1heC13aWR0aDogOC4zMzMzMzMzMzMzJTsKKyAgZmxleC1iYXNpczogOC4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLW9mZnNldC0wIHsKKyAgbWFyZ2luLWxlZnQ6IDA7IH0KKworLmNvbC1zbS0yLAorLnJvdy5jb2xzLXNtLTIgPiAqIHsKKyAgbWF4LXdpZHRoOiAxNi42NjY2NjY2NjY3JTsKKyAgZmxleC1iYXNpczogMTYuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS1vZmZzZXQtMSB7CisgIG1hcmdpbi1sZWZ0OiA4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tMywKKy5yb3cuY29scy1zbS0zID4gKiB7CisgIG1heC13aWR0aDogMjUlOworICBmbGV4LWJhc2lzOiAyNSU7IH0KKworLmNvbC1zbS1vZmZzZXQtMiB7CisgIG1hcmdpbi1sZWZ0OiAxNi42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLTQsCisucm93LmNvbHMtc20tNCA+ICogeworICBtYXgtd2lkdGg6IDMzLjMzMzMzMzMzMzMlOworICBmbGV4LWJhc2lzOiAzMy4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLW9mZnNldC0zIHsKKyAgbWFyZ2luLWxlZnQ6IDI1JTsgfQorCisuY29sLXNtLTUsCisucm93LmNvbHMtc20tNSA+ICogeworICBtYXgtd2lkdGg6IDQxLjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiA0MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC00IHsKKyAgbWFyZ2luLWxlZnQ6IDMzLjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tNiwKKy5yb3cuY29scy1zbS02ID4gKiB7CisgIG1heC13aWR0aDogNTAlOworICBmbGV4LWJhc2lzOiA1MCU7IH0KKworLmNvbC1zbS1vZmZzZXQtNSB7CisgIG1hcmdpbi1sZWZ0OiA0MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLTcsCisucm93LmNvbHMtc20tNyA+ICogeworICBtYXgtd2lkdGg6IDU4LjMzMzMzMzMzMzMlOworICBmbGV4LWJhc2lzOiA1OC4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLW9mZnNldC02IHsKKyAgbWFyZ2luLWxlZnQ6IDUwJTsgfQorCisuY29sLXNtLTgsCisucm93LmNvbHMtc20tOCA+ICogeworICBtYXgtd2lkdGg6IDY2LjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiA2Ni42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC03IHsKKyAgbWFyZ2luLWxlZnQ6IDU4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tOSwKKy5yb3cuY29scy1zbS05ID4gKiB7CisgIG1heC13aWR0aDogNzUlOworICBmbGV4LWJhc2lzOiA3NSU7IH0KKworLmNvbC1zbS1vZmZzZXQtOCB7CisgIG1hcmdpbi1sZWZ0OiA2Ni42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLTEwLAorLnJvdy5jb2xzLXNtLTEwID4gKiB7CisgIG1heC13aWR0aDogODMuMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDgzLjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTkgeworICBtYXJnaW4tbGVmdDogNzUlOyB9CisKKy5jb2wtc20tMTEsCisucm93LmNvbHMtc20tMTEgPiAqIHsKKyAgbWF4LXdpZHRoOiA5MS42NjY2NjY2NjY3JTsKKyAgZmxleC1iYXNpczogOTEuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS1vZmZzZXQtMTAgeworICBtYXJnaW4tbGVmdDogODMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS0xMiwKKy5yb3cuY29scy1zbS0xMiA+ICogeworICBtYXgtd2lkdGg6IDEwMCU7CisgIGZsZXgtYmFzaXM6IDEwMCU7IH0KKworLmNvbC1zbS1vZmZzZXQtMTEgeworICBtYXJnaW4tbGVmdDogOTEuNjY2NjY2NjY2NyU7IH0KKworLmNvbC1zbS1ub3JtYWwgeworICBvcmRlcjogaW5pdGlhbDsgfQorCisuY29sLXNtLWZpcnN0IHsKKyAgb3JkZXI6IC05OTk7IH0KKworLmNvbC1zbS1sYXN0IHsKKyAgb3JkZXI6IDk5OTsgfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAuY29sLW1kLAorICBbY2xhc3NePSdjb2wtbWQtJ10sCisgIFtjbGFzc149J2NvbC1tZC1vZmZzZXQtJ10sCisgIC5yb3dbY2xhc3MqPSdjb2xzLW1kLSddID4gKiB7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBmbGV4OiAwIDAgYXV0bzsKKyAgICBwYWRkaW5nOiAwIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKworICAuY29sLW1kLAorICAucm93LmNvbHMtbWQgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleC1ncm93OiAxOworICAgIGZsZXgtYmFzaXM6IDA7IH0KKworICAuY29sLW1kLTEsCisgIC5yb3cuY29scy1tZC0xID4gKiB7CisgICAgbWF4LXdpZHRoOiA4LjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLW9mZnNldC0wIHsKKyAgICBtYXJnaW4tbGVmdDogMDsgfQorCisgIC5jb2wtbWQtMiwKKyAgLnJvdy5jb2xzLW1kLTIgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDE2LjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDE2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMSB7CisgICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLTMsCisgIC5yb3cuY29scy1tZC0zID4gKiB7CisgICAgbWF4LXdpZHRoOiAyNSU7CisgICAgZmxleC1iYXNpczogMjUlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMiB7CisgICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC00LAorICAucm93LmNvbHMtbWQtNCA+ICogeworICAgIG1heC13aWR0aDogMzMuMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogMzMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLW9mZnNldC0zIHsKKyAgICBtYXJnaW4tbGVmdDogMjUlOyB9CisKKyAgLmNvbC1tZC01LAorICAucm93LmNvbHMtbWQtNSA+ICogeworICAgIG1heC13aWR0aDogNDEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC00IHsKKyAgICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLTYsCisgIC5yb3cuY29scy1tZC02ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1MCU7CisgICAgZmxleC1iYXNpczogNTAlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtNSB7CisgICAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC03LAorICAucm93LmNvbHMtbWQtNyA+ICogeworICAgIG1heC13aWR0aDogNTguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogNTguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLW9mZnNldC02IHsKKyAgICBtYXJnaW4tbGVmdDogNTAlOyB9CisKKyAgLmNvbC1tZC04LAorICAucm93LmNvbHMtbWQtOCA+ICogeworICAgIG1heC13aWR0aDogNjYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC03IHsKKyAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLW1kLTksCisgIC5yb3cuY29scy1tZC05ID4gKiB7CisgICAgbWF4LXdpZHRoOiA3NSU7CisgICAgZmxleC1iYXNpczogNzUlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtOCB7CisgICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC0xMCwKKyAgLnJvdy5jb2xzLW1kLTEwID4gKiB7CisgICAgbWF4LXdpZHRoOiA4My4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA4My4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTkgeworICAgIG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworICAuY29sLW1kLTExLAorICAucm93LmNvbHMtbWQtMTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDkxLjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMTAgeworICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtMTIsCisgIC5yb3cuY29scy1tZC0xMiA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWJhc2lzOiAxMDAlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtMTEgeworICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtbm9ybWFsIHsKKyAgICBvcmRlcjogaW5pdGlhbDsgfQorCisgIC5jb2wtbWQtZmlyc3QgeworICAgIG9yZGVyOiAtOTk5OyB9CisKKyAgLmNvbC1tZC1sYXN0IHsKKyAgICBvcmRlcjogOTk5OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAuY29sLWxnLAorICBbY2xhc3NePSdjb2wtbGctJ10sCisgIFtjbGFzc149J2NvbC1sZy1vZmZzZXQtJ10sCisgIC5yb3dbY2xhc3MqPSdjb2xzLWxnLSddID4gKiB7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBmbGV4OiAwIDAgYXV0bzsKKyAgICBwYWRkaW5nOiAwIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7IH0KKworICAuY29sLWxnLAorICAucm93LmNvbHMtbGcgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleC1ncm93OiAxOworICAgIGZsZXgtYmFzaXM6IDA7IH0KKworICAuY29sLWxnLTEsCisgIC5yb3cuY29scy1sZy0xID4gKiB7CisgICAgbWF4LXdpZHRoOiA4LjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLW9mZnNldC0wIHsKKyAgICBtYXJnaW4tbGVmdDogMDsgfQorCisgIC5jb2wtbGctMiwKKyAgLnJvdy5jb2xzLWxnLTIgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDE2LjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDE2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMSB7CisgICAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLTMsCisgIC5yb3cuY29scy1sZy0zID4gKiB7CisgICAgbWF4LXdpZHRoOiAyNSU7CisgICAgZmxleC1iYXNpczogMjUlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMiB7CisgICAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy00LAorICAucm93LmNvbHMtbGctNCA+ICogeworICAgIG1heC13aWR0aDogMzMuMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogMzMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLW9mZnNldC0zIHsKKyAgICBtYXJnaW4tbGVmdDogMjUlOyB9CisKKyAgLmNvbC1sZy01LAorICAucm93LmNvbHMtbGctNSA+ICogeworICAgIG1heC13aWR0aDogNDEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC00IHsKKyAgICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLTYsCisgIC5yb3cuY29scy1sZy02ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1MCU7CisgICAgZmxleC1iYXNpczogNTAlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtNSB7CisgICAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy03LAorICAucm93LmNvbHMtbGctNyA+ICogeworICAgIG1heC13aWR0aDogNTguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogNTguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLW9mZnNldC02IHsKKyAgICBtYXJnaW4tbGVmdDogNTAlOyB9CisKKyAgLmNvbC1sZy04LAorICAucm93LmNvbHMtbGctOCA+ICogeworICAgIG1heC13aWR0aDogNjYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC03IHsKKyAgICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7IH0KKworICAuY29sLWxnLTksCisgIC5yb3cuY29scy1sZy05ID4gKiB7CisgICAgbWF4LXdpZHRoOiA3NSU7CisgICAgZmxleC1iYXNpczogNzUlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtOCB7CisgICAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy0xMCwKKyAgLnJvdy5jb2xzLWxnLTEwID4gKiB7CisgICAgbWF4LXdpZHRoOiA4My4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA4My4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTkgeworICAgIG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworICAuY29sLWxnLTExLAorICAucm93LmNvbHMtbGctMTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDkxLjY2NjY2NjY2NjclOworICAgIGZsZXgtYmFzaXM6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMTAgeworICAgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctMTIsCisgIC5yb3cuY29scy1sZy0xMiA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWJhc2lzOiAxMDAlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtMTEgeworICAgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctbm9ybWFsIHsKKyAgICBvcmRlcjogaW5pdGlhbDsgfQorCisgIC5jb2wtbGctZmlyc3QgeworICAgIG9yZGVyOiAtOTk5OyB9CisKKyAgLmNvbC1sZy1sYXN0IHsKKyAgICBvcmRlcjogOTk5OyB9IH0KKy8qIENhcmQgY29tcG9uZW50IENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWNhcmQtYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1jYXJkLWZvcmUtY29sb3I6ICMxMTE7CisgIC0tY2FyZC1ib3JkZXItY29sb3I6ICNkZGQ7IH0KKworLmNhcmQgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgIGFsaWduLXNlbGY6IGNlbnRlcjsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogMTAwJTsKKyAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWNhcmQtZm9yZS1jb2xvcik7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWNhcmQtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBvdmVyZmxvdzogaGlkZGVuOyB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDMyMHB4KSB7CisgICAgLmNhcmQgeworICAgICAgbWF4LXdpZHRoOiAzMjBweDsgfSB9CisgIC5jYXJkID4gLnNlY3Rpb25lIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhY2stY29sb3IpOworICAgIGNvbG9yOiB2YXIoLS1jYXJkLWZvcmUtY29sb3IpOworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgbWFyZ2luOiAwOworICAgIGJvcmRlcjogMDsKKyAgICBib3JkZXItcmFkaXVzOiAwOworICAgIGJvcmRlci1ib3R0b206IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1jYXJkLWJvcmRlci1jb2xvcik7CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgIHdpZHRoOiAxMDAlOyB9CisgICAgLmNhcmQgPiAuc2VjdGlvbmUubWVkaWEgeworICAgICAgaGVpZ2h0OiAyMDBweDsKKyAgICAgIHBhZGRpbmc6IDA7CisgICAgICAtby1vYmplY3QtZml0OiBjb3ZlcjsKKyAgICAgIG9iamVjdC1maXQ6IGNvdmVyOyB9CisgIC5jYXJkID4gLnNlY3Rpb25lOmxhc3QtY2hpbGQgeworICAgIGJvcmRlci1ib3R0b206IDA7IH0KKworLyoKKyAgQ3VzdG9tIGVsZW1lbnRzIGZvciBjYXJkIGVsZW1lbnRzLgorKi8KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDI0MHB4KSB7CisgIC5jYXJkLnNtYWxsIHsKKyAgICBtYXgtd2lkdGg6IDI0MHB4OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDQ4MHB4KSB7CisgIC5jYXJkLmxhcmdlIHsKKyAgICBtYXgtd2lkdGg6IDQ4MHB4OyB9IH0KKy5jYXJkLmZsdWlkIHsKKyAgbWF4LXdpZHRoOiAxMDAlOworICB3aWR0aDogYXV0bzsgfQorCisuY2FyZC53YXJuaW5nIHsKKy8qICAtLWNhcmQtYmFjay1jb2xvcjogI2ZmY2EyODsgKi8KKyAgLS1jYXJkLWJhY2stY29sb3I6ICNlNWI4Yjc7CisgIC0tY2FyZC1ib3JkZXItY29sb3I6ICNlOGI4MjU7IH0KKworLmNhcmQuZXJyb3IgeworICAtLWNhcmQtYmFjay1jb2xvcjogI2I3MWMxYzsKKyAgLS1jYXJkLWZvcmUtY29sb3I6ICNmOGY4Zjg7CisgIC0tY2FyZC1ib3JkZXItY29sb3I6ICNhNzFhMWE7IH0KKworLmNhcmQgPiAuc2VjdGlvbmUuZGFyayB7CisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjZTBlMGUwOyB9CisKKy5jYXJkID4gLnNlY3Rpb25lLmRvdWJsZS1wYWRkZWQgeworICBwYWRkaW5nOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIGZvcm1zIGFuZCBpbnB1dCBlbGVtZW50cy4KKyovCisvKiBJbnB1dF9jb250cm9sIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1mb3JtLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tZm9ybS1mb3JlLWNvbG9yOiAjMTExOworICAtLWZvcm0tYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWlucHV0LWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0taW5wdXQtZm9yZS1jb2xvcjogIzExMTsKKyAgLS1pbnB1dC1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0taW5wdXQtZm9jdXMtY29sb3I6ICMwMjg4ZDE7CisgIC0taW5wdXQtaW52YWxpZC1jb2xvcjogI2QzMmYyZjsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogI2UyZTJlMjsKKyAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogI2RjZGNkYzsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogIzIxMjEyMTsKKyAgLS1idXR0b24tYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgLS1idXR0b24taG92ZXItYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yOiByZ2JhKDEyNCwgMTI0LCAxMjQsIDAuNTQpOyB9CisKK2Zvcm0geworICBiYWNrZ3JvdW5kOiB2YXIoLS1mb3JtLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tZm9ybS1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZm9ybS1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIHBhZGRpbmc6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOyB9CisKK2ZpZWxkc2V0IHsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZm9ybS1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDQpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworbGVnZW5kIHsKKyAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgZGlzcGxheTogdGFibGU7CisgIG1heC13aWR0aDogMTAwJTsKKyAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKKyAgZm9udC13ZWlnaHQ6IDcwMDsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCitsYWJlbCB7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMikgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOyB9CisKKy5pbnB1dC1ncm91cCB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQorICAuaW5wdXQtZ3JvdXAuZmx1aWQgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgfQorICAgIC5pbnB1dC1ncm91cC5mbHVpZCA+IGlucHV0IHsKKyAgICAgIG1heC13aWR0aDogMTAwJTsKKyAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICAgIGZsZXgtYmFzaXM6IDBweDsgfQorICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgICAgICAuaW5wdXQtZ3JvdXAuZmx1aWQgeworICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfSB9CisgIC5pbnB1dC1ncm91cC52ZXJ0aWNhbCB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKKyAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB9CisgICAgLmlucHV0LWdyb3VwLnZlcnRpY2FsID4gaW5wdXQgeworICAgICAgbWF4LXdpZHRoOiAxMDAlOworICAgICAgZmxleC1ncm93OiAxOworICAgICAgZmxleC1iYXNpczogMHB4OyB9CisKK1t0eXBlPSJudW1iZXIiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwgW3R5cGU9Im51bWJlciJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHsKKyAgaGVpZ2h0OiBhdXRvOyB9CisKK1t0eXBlPSJzZWFyY2giXSB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkOworICBvdXRsaW5lLW9mZnNldDogLTJweDsgfQorCitbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sCitbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IH0KKworaW5wdXQ6bm90KFt0eXBlXSksIFt0eXBlPSJ0ZXh0Il0sIFt0eXBlPSJlbWFpbCJdLCBbdHlwZT0ibnVtYmVyIl0sIFt0eXBlPSJzZWFyY2giXSwKK1t0eXBlPSJwYXNzd29yZCJdLCBbdHlwZT0idXJsIl0sIFt0eXBlPSJ0ZWwiXSwgW3R5cGU9ImNoZWNrYm94Il0sIFt0eXBlPSJyYWRpbyJdLCB0ZXh0YXJlYSwgc2VsZWN0IHsKKyAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1pbnB1dC1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0taW5wdXQtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyAyKTsKKyAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorCitpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pOmhvdmVyLCBpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pOmZvY3VzLCB0ZXh0YXJlYTpob3ZlciwgdGV4dGFyZWE6Zm9jdXMsIHNlbGVjdDpob3Zlciwgc2VsZWN0OmZvY3VzIHsKKyAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnB1dC1mb2N1cy1jb2xvcik7CisgIGJveC1zaGFkb3c6IG5vbmU7IH0KK2lucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6aW52YWxpZCwgaW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKTpmb2N1czppbnZhbGlkLCB0ZXh0YXJlYTppbnZhbGlkLCB0ZXh0YXJlYTpmb2N1czppbnZhbGlkLCBzZWxlY3Q6aW52YWxpZCwgc2VsZWN0OmZvY3VzOmludmFsaWQgeworICBib3JkZXItY29sb3I6IHZhcigtLWlucHV0LWludmFsaWQtY29sb3IpOworICBib3gtc2hhZG93OiBub25lOyB9CitpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pW3JlYWRvbmx5XSwgdGV4dGFyZWFbcmVhZG9ubHldLCBzZWxlY3RbcmVhZG9ubHldIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2stY29sb3IpOyB9CisKK3NlbGVjdCB7CisgIG1heC13aWR0aDogMTAwJTsgfQorCitvcHRpb24geworICBvdmVyZmxvdzogaGlkZGVuOworICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgfQorCitbdHlwZT0iY2hlY2tib3giXSwgW3R5cGU9InJhZGlvIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKKyAgYXBwZWFyYW5jZTogbm9uZTsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBoZWlnaHQ6IGNhbGMoMXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICB3aWR0aDogY2FsYygxcmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKKyAgcGFkZGluZzogMDsKKyAgZmxleC1iYXNpczogY2FsYygxcmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMikgIWltcG9ydGFudDsKKyAgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZDpiZWZvcmUsIFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7IH0KKworW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZDpiZWZvcmUgeworICBjb250ZW50OiAnXDI3MTMnOworICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgdG9wOiBjYWxjKDByZW0gLSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBsZWZ0OiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpOyB9CisKK1t0eXBlPSJyYWRpbyJdIHsKKyAgYm9yZGVyLXJhZGl1czogMTAwJTsgfQorICBbdHlwZT0icmFkaW8iXTpjaGVja2VkOmJlZm9yZSB7CisgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKKyAgICBjb250ZW50OiAnJzsKKyAgICB0b3A6IGNhbGMoMC4wNjI1cmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgICAgbGVmdDogY2FsYygwLjA2MjVyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1mb3JlLWNvbG9yKTsKKyAgICB3aWR0aDogMC41cmVtOworICAgIGhlaWdodDogMC41cmVtOyB9CisKKzpwbGFjZWhvbGRlci1zaG93biB7CisgIGNvbG9yOiB2YXIoLS1pbnB1dC1mb3JlLWNvbG9yKTsgfQorCis6Oi1tcy1wbGFjZWhvbGRlciB7CisgIGNvbG9yOiB2YXIoLS1pbnB1dC1mb3JlLWNvbG9yKTsKKyAgb3BhY2l0eTogMC41NDsgfQorCitidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJidXR0b24iXTo6LW1vei1mb2N1cy1pbm5lciwgW3R5cGU9InJlc2V0Il06Oi1tb3otZm9jdXMtaW5uZXIsIFt0eXBlPSJzdWJtaXQiXTo6LW1vei1mb2N1cy1pbm5lciB7CisgIGJvcmRlci1zdHlsZTogbm9uZTsKKyAgcGFkZGluZzogMDsgfQorCitidXR0b24sIGh0bWwgW3R5cGU9ImJ1dHRvbiJdLCBbdHlwZT0icmVzZXQiXSwgW3R5cGU9InN1Ym1pdCJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IH0KKworYnV0dG9uIHsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIHRleHQtdHJhbnNmb3JtOiBub25lOyB9CisKK2J1dHRvbiwgW3R5cGU9ImJ1dHRvbiJdLCBbdHlwZT0ic3VibWl0Il0sIFt0eXBlPSJyZXNldCJdLAorYS5idXR0b24sIGxhYmVsLmJ1dHRvbiwgLmJ1dHRvbiwKK2Fbcm9sZT0iYnV0dG9uIl0sIGxhYmVsW3JvbGU9ImJ1dHRvbiJdLCBbcm9sZT0iYnV0dG9uIl0geworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbi1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWJ1dHRvbi1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tYnV0dG9uLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBjdXJzb3I6IHBvaW50ZXI7CisgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsgfQorICBidXR0b246aG92ZXIsIGJ1dHRvbjpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdOmhvdmVyLCBbdHlwZT0iYnV0dG9uIl06Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdOmZvY3VzLCBbdHlwZT0icmVzZXQiXTpob3ZlciwgW3R5cGU9InJlc2V0Il06Zm9jdXMsCisgIGEuYnV0dG9uOmhvdmVyLAorICBhLmJ1dHRvbjpmb2N1cywgbGFiZWwuYnV0dG9uOmhvdmVyLCBsYWJlbC5idXR0b246Zm9jdXMsIC5idXR0b246aG92ZXIsIC5idXR0b246Zm9jdXMsCisgIGFbcm9sZT0iYnV0dG9uIl06aG92ZXIsCisgIGFbcm9sZT0iYnV0dG9uIl06Zm9jdXMsIGxhYmVsW3JvbGU9ImJ1dHRvbiJdOmhvdmVyLCBsYWJlbFtyb2xlPSJidXR0b24iXTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdOmhvdmVyLCBbcm9sZT0iYnV0dG9uIl06Zm9jdXMgeworICAgIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXItY29sb3I6IHZhcigtLWJ1dHRvbi1ob3Zlci1ib3JkZXItY29sb3IpOyB9CisKK2lucHV0OmRpc2FibGVkLCBpbnB1dFtkaXNhYmxlZF0sIHRleHRhcmVhOmRpc2FibGVkLCB0ZXh0YXJlYVtkaXNhYmxlZF0sIHNlbGVjdDpkaXNhYmxlZCwgc2VsZWN0W2Rpc2FibGVkXSwgYnV0dG9uOmRpc2FibGVkLCBidXR0b25bZGlzYWJsZWRdLCAuYnV0dG9uOmRpc2FibGVkLCAuYnV0dG9uW2Rpc2FibGVkXSwgW3JvbGU9ImJ1dHRvbiJdOmRpc2FibGVkLCBbcm9sZT0iYnV0dG9uIl1bZGlzYWJsZWRdIHsKKyAgY3Vyc29yOiBub3QtYWxsb3dlZDsKKyAgb3BhY2l0eTogMC43NTsgfQorCisuYnV0dG9uLWdyb3VwIHsKKyAgZGlzcGxheTogZmxleDsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tYnV0dG9uLWdyb3VwLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorICAuYnV0dG9uLWdyb3VwID4gYnV0dG9uLCAuYnV0dG9uLWdyb3VwIFt0eXBlPSJidXR0b24iXSwgLmJ1dHRvbi1ncm91cCA+IFt0eXBlPSJzdWJtaXQiXSwgLmJ1dHRvbi1ncm91cCA+IFt0eXBlPSJyZXNldCJdLCAuYnV0dG9uLWdyb3VwID4gLmJ1dHRvbiwgLmJ1dHRvbi1ncm91cCA+IFtyb2xlPSJidXR0b24iXSB7CisgICAgbWFyZ2luOiAwOworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4OiAxIDEgYXV0bzsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgYm94LXNoYWRvdzogbm9uZTsgfQorICAuYnV0dG9uLWdyb3VwID4gOm5vdCg6Zmlyc3QtY2hpbGQpIHsKKyAgICBib3JkZXItbGVmdDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWJ1dHRvbi1ncm91cC1ib3JkZXItY29sb3IpOyB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgICAgLmJ1dHRvbi1ncm91cCB7CisgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB9CisgICAgICAuYnV0dG9uLWdyb3VwID4gOm5vdCg6Zmlyc3QtY2hpbGQpIHsKKyAgICAgICAgYm9yZGVyOiAwOworICAgICAgICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tYnV0dG9uLWdyb3VwLWJvcmRlci1jb2xvcik7IH0gfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIGZvcm1zIGFuZCBpbnB1dCBlbGVtZW50cy4KKyovCitidXR0b24ucHJpbWFyeSwgW3R5cGU9ImJ1dHRvbiJdLnByaW1hcnksIFt0eXBlPSJzdWJtaXQiXS5wcmltYXJ5LCBbdHlwZT0icmVzZXQiXS5wcmltYXJ5LCAuYnV0dG9uLnByaW1hcnksIFtyb2xlPSJidXR0b24iXS5wcmltYXJ5IHsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogIzE5NzZkMjsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogI2Y4ZjhmODsgfQorICBidXR0b24ucHJpbWFyeTpob3ZlciwgYnV0dG9uLnByaW1hcnk6Zm9jdXMsIFt0eXBlPSJidXR0b24iXS5wcmltYXJ5OmhvdmVyLCBbdHlwZT0iYnV0dG9uIl0ucHJpbWFyeTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdLnByaW1hcnk6aG92ZXIsIFt0eXBlPSJzdWJtaXQiXS5wcmltYXJ5OmZvY3VzLCBbdHlwZT0icmVzZXQiXS5wcmltYXJ5OmhvdmVyLCBbdHlwZT0icmVzZXQiXS5wcmltYXJ5OmZvY3VzLCAuYnV0dG9uLnByaW1hcnk6aG92ZXIsIC5idXR0b24ucHJpbWFyeTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdLnByaW1hcnk6aG92ZXIsIFtyb2xlPSJidXR0b24iXS5wcmltYXJ5OmZvY3VzIHsKKyAgICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjMTU2NWMwOyB9CisKK2J1dHRvbi5zZWNvbmRhcnksIFt0eXBlPSJidXR0b24iXS5zZWNvbmRhcnksIFt0eXBlPSJzdWJtaXQiXS5zZWNvbmRhcnksIFt0eXBlPSJyZXNldCJdLnNlY29uZGFyeSwgLmJ1dHRvbi5zZWNvbmRhcnksIFtyb2xlPSJidXR0b24iXS5zZWNvbmRhcnkgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjZDMyZjJmOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXIsIGJ1dHRvbi5zZWNvbmRhcnk6Zm9jdXMsIFt0eXBlPSJidXR0b24iXS5zZWNvbmRhcnk6aG92ZXIsIFt0eXBlPSJidXR0b24iXS5zZWNvbmRhcnk6Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXS5zZWNvbmRhcnk6aG92ZXIsIFt0eXBlPSJzdWJtaXQiXS5zZWNvbmRhcnk6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLnNlY29uZGFyeTpob3ZlciwgW3R5cGU9InJlc2V0Il0uc2Vjb25kYXJ5OmZvY3VzLCAuYnV0dG9uLnNlY29uZGFyeTpob3ZlciwgLmJ1dHRvbi5zZWNvbmRhcnk6Zm9jdXMsIFtyb2xlPSJidXR0b24iXS5zZWNvbmRhcnk6aG92ZXIsIFtyb2xlPSJidXR0b24iXS5zZWNvbmRhcnk6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICNjNjI4Mjg7IH0KKworYnV0dG9uLnRlcnRpYXJ5LCBbdHlwZT0iYnV0dG9uIl0udGVydGlhcnksIFt0eXBlPSJzdWJtaXQiXS50ZXJ0aWFyeSwgW3R5cGU9InJlc2V0Il0udGVydGlhcnksIC5idXR0b24udGVydGlhcnksIFtyb2xlPSJidXR0b24iXS50ZXJ0aWFyeSB7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICMzMDg3MzI7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICNmOGY4Zjg7IH0KKyAgYnV0dG9uLnRlcnRpYXJ5OmhvdmVyLCBidXR0b24udGVydGlhcnk6Zm9jdXMsIFt0eXBlPSJidXR0b24iXS50ZXJ0aWFyeTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmZvY3VzLCBbdHlwZT0ic3VibWl0Il0udGVydGlhcnk6aG92ZXIsIFt0eXBlPSJzdWJtaXQiXS50ZXJ0aWFyeTpmb2N1cywgW3R5cGU9InJlc2V0Il0udGVydGlhcnk6aG92ZXIsIFt0eXBlPSJyZXNldCJdLnRlcnRpYXJ5OmZvY3VzLCAuYnV0dG9uLnRlcnRpYXJ5OmhvdmVyLCAuYnV0dG9uLnRlcnRpYXJ5OmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0udGVydGlhcnk6aG92ZXIsIFtyb2xlPSJidXR0b24iXS50ZXJ0aWFyeTpmb2N1cyB7CisgICAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogIzI3NzUyOTsgfQorCitidXR0b24uaW52ZXJzZSwgW3R5cGU9ImJ1dHRvbiJdLmludmVyc2UsIFt0eXBlPSJzdWJtaXQiXS5pbnZlcnNlLCBbdHlwZT0icmVzZXQiXS5pbnZlcnNlLCAuYnV0dG9uLmludmVyc2UsIFtyb2xlPSJidXR0b24iXS5pbnZlcnNlIHsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogIzIxMjEyMTsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogI2Y4ZjhmODsgfQorICBidXR0b24uaW52ZXJzZTpob3ZlciwgYnV0dG9uLmludmVyc2U6Zm9jdXMsIFt0eXBlPSJidXR0b24iXS5pbnZlcnNlOmhvdmVyLCBbdHlwZT0iYnV0dG9uIl0uaW52ZXJzZTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdLmludmVyc2U6aG92ZXIsIFt0eXBlPSJzdWJtaXQiXS5pbnZlcnNlOmZvY3VzLCBbdHlwZT0icmVzZXQiXS5pbnZlcnNlOmhvdmVyLCBbdHlwZT0icmVzZXQiXS5pbnZlcnNlOmZvY3VzLCAuYnV0dG9uLmludmVyc2U6aG92ZXIsIC5idXR0b24uaW52ZXJzZTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdLmludmVyc2U6aG92ZXIsIFtyb2xlPSJidXR0b24iXS5pbnZlcnNlOmZvY3VzIHsKKyAgICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjMTExOyB9CisKK2J1dHRvbi5zbWFsbCwgW3R5cGU9ImJ1dHRvbiJdLnNtYWxsLCBbdHlwZT0ic3VibWl0Il0uc21hbGwsIFt0eXBlPSJyZXNldCJdLnNtYWxsLCAuYnV0dG9uLnNtYWxsLCBbcm9sZT0iYnV0dG9uIl0uc21hbGwgeworICBwYWRkaW5nOiBjYWxjKDAuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgY2FsYygwLjc1ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorCitidXR0b24ubGFyZ2UsIFt0eXBlPSJidXR0b24iXS5sYXJnZSwgW3R5cGU9InN1Ym1pdCJdLmxhcmdlLCBbdHlwZT0icmVzZXQiXS5sYXJnZSwgLmJ1dHRvbi5sYXJnZSwgW3JvbGU9ImJ1dHRvbiJdLmxhcmdlIHsKKyAgcGFkZGluZzogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpIGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIG5hdmlnYXRpb24gZWxlbWVudHMuCisqLworLyogTmF2aWdhdGlvbiBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0taGVhZGVyLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0taGVhZGVyLWhvdmVyLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0taGVhZGVyLWZvcmUtY29sb3I6ICM0NDQ7CisgIC0taGVhZGVyLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1uYXYtYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1uYXYtaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1uYXYtZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1uYXYtYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLW5hdi1saW5rLWNvbG9yOiAjMDI3N2JkOworICAtLWZvb3Rlci1mb3JlLWNvbG9yOiAjNDQ0OworICAtLWZvb3Rlci1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWZvb3Rlci1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tZm9vdGVyLWxpbmstY29sb3I6ICMwMjc3YmQ7CisgIC0tZHJhd2VyLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tZHJhd2VyLWhvdmVyLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tZHJhd2VyLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1kcmF3ZXItY2xvc2UtY29sb3I6ICM0NDQ7IH0KKworaGVhZGVyIHsKKyAgaGVpZ2h0OiAzLjE4NzVyZW07CisgIGJhY2tncm91bmQ6IHZhcigtLWhlYWRlci1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWhlYWRlci1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyLWJvdHRvbTogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWhlYWRlci1ib3JkZXItY29sb3IpOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpIDA7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIG92ZXJmbG93LXg6IGF1dG87CisgIG92ZXJmbG93LXk6IGhpZGRlbjsgfQorICBoZWFkZXIucm93IHsKKyAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQorICBoZWFkZXIgLmxvZ28geworICAgIGNvbG9yOiB2YXIoLS1oZWFkZXItZm9yZS1jb2xvcik7CisgICAgZm9udC1zaXplOiAxLjc1cmVtOworICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQorICBoZWFkZXIgYnV0dG9uLCBoZWFkZXIgW3R5cGU9ImJ1dHRvbiJdLCBoZWFkZXIgLmJ1dHRvbiwgaGVhZGVyIFtyb2xlPSJidXR0b24iXSB7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiBjYWxjKDByZW0gLSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KTsKKyAgICBoZWlnaHQ6IGNhbGMoMy4xODc1cmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgICAgYmFja2dyb3VuZDogdmFyKC0taGVhZGVyLWJhY2stY29sb3IpOworICAgIGxpbmUtaGVpZ2h0OiBjYWxjKDMuMTg3NXJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAqIDEuNSk7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIGNvbG9yOiB2YXIoLS1oZWFkZXItZm9yZS1jb2xvcik7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgbWFyZ2luOiAwOworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KKyAgICBoZWFkZXIgYnV0dG9uOmhvdmVyLCBoZWFkZXIgYnV0dG9uOmZvY3VzLCBoZWFkZXIgW3R5cGU9ImJ1dHRvbiJdOmhvdmVyLCBoZWFkZXIgW3R5cGU9ImJ1dHRvbiJdOmZvY3VzLCBoZWFkZXIgLmJ1dHRvbjpob3ZlciwgaGVhZGVyIC5idXR0b246Zm9jdXMsIGhlYWRlciBbcm9sZT0iYnV0dG9uIl06aG92ZXIsIGhlYWRlciBbcm9sZT0iYnV0dG9uIl06Zm9jdXMgeworICAgICAgYmFja2dyb3VuZDogdmFyKC0taGVhZGVyLWhvdmVyLWJhY2stY29sb3IpOyB9CisKK25hdiB7CisgIGJhY2tncm91bmQ6IHZhcigtLW5hdi1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLW5hdi1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tbmF2LWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorICBuYXYgKiB7CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorICBuYXYgYSwgbmF2IGE6dmlzaXRlZCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgY29sb3I6IHZhcigtLW5hdi1saW5rLWNvbG9yKTsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgICAgbmF2IGE6aG92ZXIsIG5hdiBhOmZvY3VzLCBuYXYgYTp2aXNpdGVkOmhvdmVyLCBuYXYgYTp2aXNpdGVkOmZvY3VzIHsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIGJhY2tncm91bmQ6IHZhcigtLW5hdi1ob3Zlci1iYWNrLWNvbG9yKTsgfQorICBuYXYgLnN1YmxpbmstMSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgICAgbmF2IC5zdWJsaW5rLTE6YmVmb3JlIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGxlZnQ6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC0gMSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgICB0b3A6IC0wLjA2MjVyZW07CisgICAgICBjb250ZW50OiAnJzsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLW5hdi1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLWxlZnQ6IDA7IH0KKyAgbmF2IC5zdWJsaW5rLTIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBtYXJnaW4tbGVmdDogY2FsYyg0ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorICAgIG5hdiAuc3VibGluay0yOmJlZm9yZSB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICBsZWZ0OiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAtIDMgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICAgICAgdG9wOiAtMC4wNjI1cmVtOworICAgICAgY29udGVudDogJyc7CisgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1uYXYtYm9yZGVyLWNvbG9yKTsKKyAgICAgIGJvcmRlci1sZWZ0OiAwOyB9CisKK2Zvb3RlciB7CisgIGJhY2tncm91bmQ6IHZhcigtLWZvb3Rlci1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWZvb3Rlci1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyLXRvcDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWZvb3Rlci1ib3JkZXItY29sb3IpOworICBwYWRkaW5nOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgZm9udC1zaXplOiAwLjg3NXJlbTsgfQorICBmb290ZXIgYSwgZm9vdGVyIGE6dmlzaXRlZCB7CisgICAgY29sb3I6IHZhcigtLWZvb3Rlci1saW5rLWNvbG9yKTsgfQorCitoZWFkZXIuc3RpY2t5IHsKKyAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OworICBwb3NpdGlvbjogc3RpY2t5OworICB6LWluZGV4OiAxMTAxOworICB0b3A6IDA7IH0KKworZm9vdGVyLnN0aWNreSB7CisgIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsKKyAgcG9zaXRpb246IHN0aWNreTsKKyAgei1pbmRleDogMTEwMTsKKyAgYm90dG9tOiAwOyB9CisKKy5kcmF3ZXItdG9nZ2xlOmJlZm9yZSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworICBjb250ZW50OiAnXDAwYTBcMjI2MVwwMGEwJzsKKyAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMS41ZW07IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgIC5kcmF3ZXItdG9nZ2xlOm5vdCgucGVyc2lzdGVudCkgeworICAgIGRpc3BsYXk6IG5vbmU7IH0gfQorCitbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgeworICBoZWlnaHQ6IDFweDsKKyAgd2lkdGg6IDFweDsKKyAgbWFyZ2luOiAtMXB4OworICBvdmVyZmxvdzogaGlkZGVuOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsgfQorICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICB0b3A6IDA7CisgICAgd2lkdGg6IDMyMHB4OworICAgIGhlaWdodDogMTAwdmg7CisgICAgb3ZlcmZsb3cteTogYXV0bzsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kcmF3ZXItYmFjay1jb2xvcik7CisgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZHJhd2VyLWJvcmRlci1jb2xvcik7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBtYXJnaW46IDA7CisgICAgei1pbmRleDogMTExMDsKKyAgICByaWdodDogLTMyMHB4OworICAgIHRyYW5zaXRpb246IHJpZ2h0IDAuM3M7IH0KKyAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIC5kcmF3ZXItY2xvc2UgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgdG9wOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgICAgIHJpZ2h0OiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgICAgIHotaW5kZXg6IDExMTE7CisgICAgICB3aWR0aDogMnJlbTsKKyAgICAgIGhlaWdodDogMnJlbTsKKyAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICAgIG1hcmdpbjogMDsKKyAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsgfQorICAgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiAuZHJhd2VyLWNsb3NlOmJlZm9yZSB7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBjb250ZW50OiAnXDAwRDcnOworICAgICAgICBjb2xvcjogdmFyKC0tZHJhd2VyLWNsb3NlLWNvbG9yKTsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICAgICAgZm9udC1zaXplOiAycmVtOworICAgICAgICBsaW5lLWhlaWdodDogMTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyB9CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIC5kcmF3ZXItY2xvc2U6aG92ZXIsIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZTpmb2N1cyB7CisgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRyYXdlci1ob3Zlci1iYWNrLWNvbG9yKTsgfQorICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIHsKKyAgICAgICAgd2lkdGg6IDEwMCU7IH0gfQorICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXI6Y2hlY2tlZCArICogeworICAgIHJpZ2h0OiAwOyB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgICAgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyOm5vdCgucGVyc2lzdGVudCkgKyAqIHsKKyAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CisgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICB6LWluZGV4OiAxMTAwOyB9CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXI6bm90KC5wZXJzaXN0ZW50KSArICogLmRyYXdlci1jbG9zZSB7CisgICAgICAgIGRpc3BsYXk6IG5vbmU7IH0gfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgdGhlIHJlc3BvbnNpdmUgdGFibGUgY29tcG9uZW50LgorKi8KKy8qIFRhYmxlIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMuICovCis6cm9vdCB7CisgIC0tdGFibGUtYm9yZGVyLWNvbG9yOiAjYWFhOworICAtLXRhYmxlLWJvcmRlci1zZXBhcmF0b3ItY29sb3I6ICM2NjY7CisgIC0tdGFibGUtaGVhZC1iYWNrLWNvbG9yOiAjZTZlNmU2OworICAtLXRhYmxlLWhlYWQtZm9yZS1jb2xvcjogIzExMTsKKyAgLS10YWJsZS1ib2R5LWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tdGFibGUtYm9keS1mb3JlLWNvbG9yOiAjMTExOworICAtLXRhYmxlLWJvZHktYWx0LWJhY2stY29sb3I6ICNlZWU7IH0KKwordGFibGUgeworICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOworICBib3JkZXItc3BhY2luZzogMDsKKyAgOiBtYXJnaW46IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4OiAwIDEgYXV0bzsKKyAgZmxleC1mbG93OiByb3cgd3JhcDsKKyAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICBwYWRkaW5nLXRvcDogMDsKKwltYXJnaW46IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOwl9CisgIHRhYmxlIGNhcHRpb24geworICAgIGZvbnQtc2l6ZTogMS4yNSAqIHJlbTsKKyAgICBtYXJnaW46IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKSAwOworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4OiAwIDAgMTAwJTsKKwkJdGV4dC1hbGlnbjogbGVmdDt9CisgIHRhYmxlIHRoZWFkLCB0YWJsZSB0Ym9keSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOworICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7IH0KKyAgdGFibGUgdGhlYWQgeworICAgIHotaW5kZXg6IDk5OTsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIDAgMDsKKyAgICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLXNlcGFyYXRvci1jb2xvcik7IH0KKyAgdGFibGUgdGJvZHkgeworICAgIGJvcmRlci10b3A6IDA7CisgICAgbWFyZ2luLXRvcDogY2FsYygwIC0gdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOworICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisgIHRhYmxlIHRyIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIHBhZGRpbmc6IDA7IH0KKyAgdGFibGUgdGgsIHRhYmxlIHRkIHsKKyAgICBwYWRkaW5nOiBjYWxjKDAuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisJCWZvbnQtc2l6ZTogMC45cmVtOyB9CisgIHRhYmxlIHRoIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWhlYWQtYmFjay1jb2xvcik7CisgICAgY29sb3I6IHZhcigtLXRhYmxlLWhlYWQtZm9yZS1jb2xvcik7IH0KKyAgdGFibGUgdGQgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktYmFjay1jb2xvcik7CisgICAgY29sb3I6IHZhcigtLXRhYmxlLWJvZHktZm9yZS1jb2xvcik7CisgICAgYm9yZGVyLXRvcDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7IH0KKwordGFibGU6bm90KC5ob3Jpem9udGFsKSB7CisgIG92ZXJmbG93OiBhdXRvOworICBtYXgtaGVpZ2h0OiA4NTBweDsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRoZWFkLCB0YWJsZTpub3QoLmhvcml6b250YWwpIHRib2R5IHsKKyAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgZmxleDogMCAwIDEwMCU7IH0KKyAgdGFibGU6bm90KC5ob3Jpem9udGFsKSB0ciB7CisgICAgZmxleC1mbG93OiByb3cgd3JhcDsKKyAgICBmbGV4OiAwIDAgMTAwJTsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRoLCB0YWJsZTpub3QoLmhvcml6b250YWwpIHRkIHsKKyAgICBmbGV4OiAxIDAgMCU7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRoZWFkIHsKKyAgICBwb3NpdGlvbjogc3RpY2t5OworICAgIHRvcDogMDsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRib2R5IHRyOmZpcnN0LWNoaWxkIHRkIHsKKyAgICBib3JkZXItdG9wOiAwOyB9CisKK3RhYmxlLmhvcml6b250YWwgeworICBib3JkZXI6IDA7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCwgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB7CisgICAgYm9yZGVyOiAwOworICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHsKKyAgICBvdmVyZmxvdzogYXV0bzsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgICAgZmxleDogMSAwIDA7CisgICAgbWFyZ2luLWxlZnQ6IGNhbGMoIDQgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgICAgcGFkZGluZy1ib3R0b206IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCk7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0ciB7CisgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICBmbGV4OiAxIDAgYXV0bzsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoLCB0YWJsZS5ob3Jpem9udGFsIHRkIHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLWJvdHRvbTogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7IH0KKyAgICB0YWJsZS5ob3Jpem9udGFsIHRoOm5vdCg6Zmlyc3QtY2hpbGQpLCB0YWJsZS5ob3Jpem9udGFsIHRkOm5vdCg6Zmlyc3QtY2hpbGQpIHsKKyAgICAgIGJvcmRlci10b3A6IDA7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aCB7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgYm9yZGVyLWxlZnQ6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOworICAgIGJvcmRlci1yaWdodDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1zZXBhcmF0b3ItY29sb3IpOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgeworICAgIHBhZGRpbmctbGVmdDogMDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoOmZpcnN0LWNoaWxkLCB0YWJsZS5ob3Jpem9udGFsIHRkOmZpcnN0LWNoaWxkIHsKKyAgICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQgeworICAgIGJvcmRlci1yaWdodDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7IH0KKyAgICB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQgeworICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuMjVyZW07IH0KKyAgICB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCB7CisgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4yNXJlbTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkIHsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjI1cmVtOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4yNXJlbTsgfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICB0YWJsZSwgdGFibGUuaG9yaXpvbnRhbCB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IDA7CisgICAgd2lkdGg6IDEwMCU7CisgICAgZGlzcGxheTogdGFibGU7IH0KKyAgICB0YWJsZSB0aGVhZCwgdGFibGUgdGgsIHRhYmxlLmhvcml6b250YWwgdGhlYWQsIHRhYmxlLmhvcml6b250YWwgdGggeworICAgICAgYm9yZGVyOiAwOworICAgICAgaGVpZ2h0OiAxcHg7CisgICAgICB3aWR0aDogMXB4OworICAgICAgbWFyZ2luOiAtMXB4OworICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgIHBhZGRpbmc6IDA7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICBjbGlwOiByZWN0KDAgMCAwIDApOworICAgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsgfQorICAgIHRhYmxlIHRib2R5LCB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHsKKyAgICAgIGJvcmRlcjogMDsKKyAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdy1ncm91cDsgfQorICAgIHRhYmxlIHRyLCB0YWJsZS5ob3Jpem9udGFsIHRyIHsKKyAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsKKyAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7CisgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICAgICAgbWFyZ2luLWJvdHRvbTogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisgICAgdGFibGUgdGgsIHRhYmxlIHRkLCB0YWJsZS5ob3Jpem9udGFsIHRoLCB0YWJsZS5ob3Jpem9udGFsIHRkIHsKKyAgICAgIHdpZHRoOiBhdXRvOyB9CisgICAgdGFibGUgdGQsIHRhYmxlLmhvcml6b250YWwgdGQgeworICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICBib3JkZXI6IDA7CisgICAgICB0ZXh0LWFsaWduOiByaWdodDsgfQorICAgIHRhYmxlIHRkOmJlZm9yZSwgdGFibGUuaG9yaXpvbnRhbCB0ZDpiZWZvcmUgeworICAgICAgY29udGVudDogYXR0cihkYXRhLWxhYmVsKTsKKyAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgZm9udC13ZWlnaHQ6IDYwMDsgfQorICAgIHRhYmxlIHRoOmZpcnN0LWNoaWxkLCB0YWJsZSB0ZDpmaXJzdC1jaGlsZCwgdGFibGUuaG9yaXpvbnRhbCB0aDpmaXJzdC1jaGlsZCwgdGFibGUuaG9yaXpvbnRhbCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgICBib3JkZXItdG9wOiAwOyB9CisgICAgdGFibGUgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCwgdGFibGUuaG9yaXpvbnRhbCB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgICAgIGJvcmRlci1yaWdodDogMDsgfSB9Cis6cm9vdCB7CisgIC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcjogI2VlZTsgfQorCit0YWJsZSB0cjpudGgtb2YtdHlwZSgybikgPiB0ZCB7CisgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktYWx0LWJhY2stY29sb3IpOyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDUwMHB4KSB7CisgIHRhYmxlIHRyOm50aC1vZi10eXBlKDJuKSB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcik7IH0gfQorOnJvb3QgeworICAtLXRhYmxlLWJvZHktaG92ZXItYmFjay1jb2xvcjogIzkwY2FmOTsgfQorCit0YWJsZS5ob3ZlcmFibGUgdHI6aG92ZXIsIHRhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciA+IHRkLCB0YWJsZS5ob3ZlcmFibGUgdHI6Zm9jdXMsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cyA+IHRkIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1ob3Zlci1iYWNrLWNvbG9yKTsgfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1MDBweCkgeworICB0YWJsZS5ob3ZlcmFibGUgdHI6aG92ZXIsIHRhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciA+IHRkLCB0YWJsZS5ob3ZlcmFibGUgdHI6Zm9jdXMsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cyA+IHRkIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWhvdmVyLWJhY2stY29sb3IpOyB9IH0KKy8qCisgIERlZmluaXRpb25zIGZvciBjb250ZXh0dWFsIGJhY2tncm91bmQgZWxlbWVudHMsIHRvYXN0cyBhbmQgdG9vbHRpcHMuCisqLworLyogQ29udGV4dHVhbCBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tbWFyay1iYWNrLWNvbG9yOiAjMDI3N2JkOworICAtLW1hcmstZm9yZS1jb2xvcjogI2ZhZmFmYTsgfQorCittYXJrIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tbWFyay1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLW1hcmstZm9yZS1jb2xvcik7CisgIGZvbnQtc2l6ZTogMC45NWVtOworICBsaW5lLWhlaWdodDogMWVtOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorICBtYXJrLmlubGluZS1ibG9jayB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIGZvbnQtc2l6ZTogMWVtOworICAgIGxpbmUtaGVpZ2h0OiAxLjU7CisgICAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworOnJvb3QgeworICAtLXRvYXN0LWJhY2stY29sb3I6ICM0MjQyNDI7CisgIC0tdG9hc3QtZm9yZS1jb2xvcjogI2ZhZmFmYTsgfQorCisudG9hc3QgeworICBwb3NpdGlvbjogZml4ZWQ7CisgIGJvdHRvbTogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAqIDMpOworICBsZWZ0OiA1MCU7CisgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOworICB6LWluZGV4OiAxMTExOworICBjb2xvcjogdmFyKC0tdG9hc3QtZm9yZS1jb2xvcik7CisgIGJhY2tncm91bmQ6IHZhcigtLXRvYXN0LWJhY2stY29sb3IpOworICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAqIDE2KTsKKyAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpICogMyk7IH0KKworOnJvb3QgeworICAtLXRvb2x0aXAtYmFjay1jb2xvcjogIzIxMjEyMTsKKyAgLS10b29sdGlwLWZvcmUtY29sb3I6ICNmYWZhZmE7IH0KKworLnRvb2x0aXAgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQorICAudG9vbHRpcDpiZWZvcmUsIC50b29sdGlwOmFmdGVyIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgb3BhY2l0eTogMDsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApOworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgIHRyYW5zaXRpb246IGFsbCAwLjNzOworICAgIHotaW5kZXg6IDEwMTA7CisgICAgbGVmdDogNTAlOyB9CisgIC50b29sdGlwOm5vdCguYm90dG9tKTpiZWZvcmUsIC50b29sdGlwOm5vdCguYm90dG9tKTphZnRlciB7CisgICAgYm90dG9tOiA3NSU7IH0KKyAgLnRvb2x0aXAuYm90dG9tOmJlZm9yZSwgLnRvb2x0aXAuYm90dG9tOmFmdGVyIHsKKyAgICB0b3A6IDc1JTsgfQorICAudG9vbHRpcDpob3ZlcjpiZWZvcmUsIC50b29sdGlwOmhvdmVyOmFmdGVyLCAudG9vbHRpcDpmb2N1czpiZWZvcmUsIC50b29sdGlwOmZvY3VzOmFmdGVyIHsKKyAgICBvcGFjaXR5OiAxOworICAgIGNsaXA6IGF1dG87CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDAlKTsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDAlKTsgfQorICAudG9vbHRpcDpiZWZvcmUgeworICAgIGNvbnRlbnQ6ICcnOworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworICAgIGJvcmRlcjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgc29saWQgdHJhbnNwYXJlbnQ7CisgICAgbGVmdDogY2FsYyg1MCUgLSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKyAgLnRvb2x0aXA6bm90KC5ib3R0b20pOmJlZm9yZSB7CisgICAgYm9yZGVyLXRvcC1jb2xvcjogIzIxMjEyMTsgfQorICAudG9vbHRpcC5ib3R0b206YmVmb3JlIHsKKyAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMjEyMTIxOyB9CisgIC50b29sdGlwOmFmdGVyIHsKKyAgICBjb250ZW50OiBhdHRyKGFyaWEtbGFiZWwpOworICAgIGNvbG9yOiB2YXIoLS10b29sdGlwLWZvcmUtY29sb3IpOworICAgIGJhY2tncm91bmQ6IHZhcigtLXRvb2x0aXAtYmFjay1jb2xvcik7CisgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsgfQorICAudG9vbHRpcDpub3QoLmJvdHRvbSk6YWZ0ZXIgeworICAgIG1hcmdpbi1ib3R0b206IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorICAudG9vbHRpcC5ib3R0b206YWZ0ZXIgeworICAgIG1hcmdpbi10b3A6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorCis6cm9vdCB7CisgIC0tbW9kYWwtb3ZlcmxheS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQ1KTsKKyAgLS1tb2RhbC1jbG9zZS1jb2xvcjogIzQ0NDsKKyAgLS1tb2RhbC1jbG9zZS1ob3Zlci1jb2xvcjogI2YwZjBmMDsgfQorCitbdHlwZT0iY2hlY2tib3giXS5tb2RhbCB7CisgIGhlaWdodDogMXB4OworICB3aWR0aDogMXB4OworICBtYXJnaW46IC0xcHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IHsKKyAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgdG9wOiAwOworICAgIGxlZnQ6IDA7CisgICAgZGlzcGxheTogbm9uZTsKKyAgICB3aWR0aDogMTAwdnc7CisgICAgaGVpZ2h0OiAxMDB2aDsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tb2RhbC1vdmVybGF5LWNvbG9yKTsgfQorICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIHsKKyAgICAgIG1hcmdpbjogMCBhdXRvOworICAgICAgbWF4LWhlaWdodDogNTB2aDsKKyAgICAgIG92ZXJmbG93OiBhdXRvOyB9CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2UgeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMDsKKyAgICAgICAgcmlnaHQ6IDA7CisgICAgICAgIHdpZHRoOiAxLjc1cmVtOworICAgICAgICBoZWlnaHQ6IDEuNzVyZW07CisgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgICAgICBtYXJnaW46IDA7CisgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgICAgICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZTpiZWZvcmUgeworICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAgIGNvbnRlbnQ6ICdcMDBENyc7CisgICAgICAgICAgY29sb3I6IHZhcigtLW1vZGFsLWNsb3NlLWNvbG9yKTsKKyAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgICAgICAgZm9udC1zaXplOiAxLjc1cmVtOworICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxOworICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfQorICAgICAgICBbdHlwZT0iY2hlY2tib3giXS5tb2RhbCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2U6aG92ZXIsIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZTpmb2N1cyB7CisgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbW9kYWwtY2xvc2UtaG92ZXItY29sb3IpOyB9CisgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsOmNoZWNrZWQgKyBkaXYgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleDogMCAxIGF1dG87CisgICAgei1pbmRleDogMTIwMDsgfQorICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsOmNoZWNrZWQgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlIHsKKyAgICAgIHotaW5kZXg6IDEyMTE7IH0KKworOnJvb3QgeworICAtLWNvbGxhcHNlLWxhYmVsLWJhY2stY29sb3I6ICNlOGU4ZTg7CisgIC0tY29sbGFwc2UtbGFiZWwtZm9yZS1jb2xvcjogIzIxMjEyMTsKKyAgLS1jb2xsYXBzZS1sYWJlbC1ob3Zlci1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWNvbGxhcHNlLXNlbGVjdGVkLWxhYmVsLWJhY2stY29sb3I6ICNlY2VjZWM7CisgIC0tY29sbGFwc2UtYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWNvbGxhcHNlLWNvbnRlbnQtYmFjay1jb2xvcjogI2ZhZmFmYTsKKyAgLS1jb2xsYXBzZS1zZWxlY3RlZC1sYWJlbC1ib3JkZXItY29sb3I6ICMwMjc3YmQ7IH0KKworLmNvbGxhcHNlIHsKKyAgd2lkdGg6IGNhbGMoMTAwJSAtIDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgIG9wYWNpdHk6IDE7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorICAuY29sbGFwc2UgPiBbdHlwZT0icmFkaW8iXSwgLmNvbGxhcHNlID4gW3R5cGU9ImNoZWNrYm94Il0geworICAgIGhlaWdodDogMXB4OworICAgIHdpZHRoOiAxcHg7CisgICAgbWFyZ2luOiAtMXB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWwgeworICAgIGZsZXgtZ3JvdzogMTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgaGVpZ2h0OiAxLjVyZW07CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4zczsKKyAgICBjb2xvcjogdmFyKC0tY29sbGFwc2UtbGFiZWwtZm9yZS1jb2xvcik7CisgICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFwc2UtbGFiZWwtYmFjay1jb2xvcik7CisgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY29sbGFwc2UtYm9yZGVyLWNvbG9yKTsKKyAgICBwYWRkaW5nOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKyAgICAuY29sbGFwc2UgPiBsYWJlbDpob3ZlciwgLmNvbGxhcHNlID4gbGFiZWw6Zm9jdXMgeworICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFwc2UtbGFiZWwtaG92ZXItYmFjay1jb2xvcik7IH0KKyAgICAuY29sbGFwc2UgPiBsYWJlbCArIGRpdiB7CisgICAgICBmbGV4LWJhc2lzOiBhdXRvOworICAgICAgaGVpZ2h0OiAxcHg7CisgICAgICB3aWR0aDogMXB4OworICAgICAgbWFyZ2luOiAtMXB4OworICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjNzOworICAgICAgbWF4LWhlaWdodDogMXB4OyB9CisgIC5jb2xsYXBzZSA+IDpjaGVja2VkICsgbGFiZWwgeworICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhcHNlLXNlbGVjdGVkLWxhYmVsLWJhY2stY29sb3IpOworICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWNvbGxhcHNlLXNlbGVjdGVkLWxhYmVsLWJvcmRlci1jb2xvcik7IH0KKyAgICAuY29sbGFwc2UgPiA6Y2hlY2tlZCArIGxhYmVsICsgZGl2IHsKKyAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICB3aWR0aDogMTAwJTsKKyAgICAgIGhlaWdodDogYXV0bzsKKyAgICAgIG92ZXJmbG93OiBhdXRvOworICAgICAgbWFyZ2luOiAwOworICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFwc2UtY29udGVudC1iYWNrLWNvbG9yKTsKKyAgICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWNvbGxhcHNlLWJvcmRlci1jb2xvcik7CisgICAgICBib3JkZXItdG9wOiAwOworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgICAgY2xpcDogYXV0bzsKKyAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgwJSk7CisgICAgICBjbGlwLXBhdGg6IGluc2V0KDAlKTsKKyAgICAgIG1heC1oZWlnaHQ6IDg1MHB4OyB9CisgIC5jb2xsYXBzZSA+IGxhYmVsOm5vdCg6Zmlyc3Qtb2YtdHlwZSkgeworICAgIGJvcmRlci10b3A6IDA7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6Zmlyc3Qtb2YtdHlwZSB7CisgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAwIDA7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6bGFzdC1vZi10eXBlOm5vdCg6Zmlyc3Qtb2YtdHlwZSkgeworICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisgIC5jb2xsYXBzZSA+IGxhYmVsOmxhc3Qtb2YtdHlwZTpmaXJzdC1vZi10eXBlIHsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgLmNvbGxhcHNlID4gOmNoZWNrZWQ6bGFzdC1vZi10eXBlOm5vdCg6Zmlyc3Qtb2YtdHlwZSkgKyBsYWJlbCB7CisgICAgYm9yZGVyLXJhZGl1czogMDsgfQorICAuY29sbGFwc2UgPiA6Y2hlY2tlZDpsYXN0LW9mLXR5cGUgKyBsYWJlbCArIGRpdiB7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKworLyoKKyAgQ3VzdG9tIGVsZW1lbnRzIGZvciBjb250ZXh0dWFsIGJhY2tncm91bmQgZWxlbWVudHMsIHRvYXN0cyBhbmQgdG9vbHRpcHMuCisqLworbWFyay5zZWNvbmRhcnkgeworICAtLW1hcmstYmFjay1jb2xvcjogI2QzMmYyZjsgfQorCittYXJrLnRlcnRpYXJ5IHsKKyAgLS1tYXJrLWJhY2stY29sb3I6ICMzMDg3MzI7IH0KKworbWFyay50YWcgeworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKS8yKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgIGJvcmRlci1yYWRpdXM6IDFlbTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgcHJvZ3Jlc3MgZWxlbWVudHMgYW5kIHNwaW5uZXJzLgorKi8KKy8qIFByb2dlc3MgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLXByb2dyZXNzLWJhY2stY29sb3I6ICNkZGQ7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogIzU1NTsgfQorCitwcm9ncmVzcyB7CisgIGRpc3BsYXk6IGJsb2NrOworICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgLW1vei1hcHBlYXJhbmNlOiBub25lOworICBhcHBlYXJhbmNlOiBub25lOworICBoZWlnaHQ6IDAuNzVyZW07CisgIHdpZHRoOiBjYWxjKDEwMCUgLSAyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBib3JkZXI6IDA7CisgIGJvcmRlci1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7CisgIGJhY2tncm91bmQ6IHZhcigtLXByb2dyZXNzLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcik7IH0KKyAgcHJvZ3Jlc3M6Oi13ZWJraXQtcHJvZ3Jlc3MtdmFsdWUgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXByb2dyZXNzLWZvcmUtY29sb3IpOworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7CisgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzczo6LXdlYmtpdC1wcm9ncmVzcy1iYXIgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXByb2dyZXNzLWJhY2stY29sb3IpOyB9CisgIHByb2dyZXNzOjotbW96LXByb2dyZXNzLWJhciB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcik7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOyB9CisgIHByb2dyZXNzW3ZhbHVlPSIxMDAwIl06Oi13ZWJraXQtcHJvZ3Jlc3MtdmFsdWUgeworICAgIGJvcmRlci1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7IH0KKyAgcHJvZ3Jlc3NbdmFsdWU9IjEwMDAiXTo6LW1vei1wcm9ncmVzcy1iYXIgeworICAgIGJvcmRlci1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7IH0KKyAgcHJvZ3Jlc3MuaW5saW5lIHsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB3aWR0aDogNjAlOyB9CisKKzpyb290IHsKKyAgLS1zcGlubmVyLWJhY2stY29sb3I6ICNkZGQ7CisgIC0tc3Bpbm5lci1mb3JlLWNvbG9yOiAjNTU1OyB9CisKK0BrZXlmcmFtZXMgc3Bpbm5lci1kb251dC1hbmltIHsKKyAgMCUgeworICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CisgIDEwMCUgeworICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfQorLnNwaW5uZXIgeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGJvcmRlcjogMC4yNXJlbSBzb2xpZCB2YXIoLS1zcGlubmVyLWJhY2stY29sb3IpOworICBib3JkZXItbGVmdDogMC4yNXJlbSBzb2xpZCB2YXIoLS1zcGlubmVyLWZvcmUtY29sb3IpOworICBib3JkZXItcmFkaXVzOiA1MCU7CisgIHdpZHRoOiAxLjI1cmVtOworICBoZWlnaHQ6IDEuMjVyZW07CisgIGFuaW1hdGlvbjogc3Bpbm5lci1kb251dC1hbmltIDEuMnMgbGluZWFyIGluZmluaXRlOyB9CisKKy8qCisgIEN1c3RvbSBlbGVtZW50cyBmb3IgcHJvZ3Jlc3MgYmFycyBhbmQgc3Bpbm5lcnMuCisqLworcHJvZ3Jlc3MucHJpbWFyeSB7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogIzE5NzZkMjsgfQorCitwcm9ncmVzcy5zZWNvbmRhcnkgeworICAtLXByb2dyZXNzLWZvcmUtY29sb3I6ICNkMzJmMmY7IH0KKworcHJvZ3Jlc3MudGVydGlhcnkgeworICAtLXByb2dyZXNzLWZvcmUtY29sb3I6ICMzMDg3MzI7IH0KKworLnNwaW5uZXIucHJpbWFyeSB7CisgIC0tc3Bpbm5lci1mb3JlLWNvbG9yOiAjMTk3NmQyOyB9CisKKy5zcGlubmVyLnNlY29uZGFyeSB7CisgIC0tc3Bpbm5lci1mb3JlLWNvbG9yOiAjZDMyZjJmOyB9CisKKy5zcGlubmVyLnRlcnRpYXJ5IHsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICMzMDg3MzI7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIGljb25zIC0gcG93ZXJlZCBieSBGZWF0aGVyIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKS4KKyovCitzcGFuW2NsYXNzXj0naWNvbi0nXSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgaGVpZ2h0OiAxZW07CisgIHdpZHRoOiAxZW07CisgIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTsKKyAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOworICBtYXJnaW46IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDQpOyB9CisgIHNwYW5bY2xhc3NePSdpY29uLSddLnNlY29uZGFyeSB7CisgICAgLXdlYmtpdC1maWx0ZXI6IGludmVydCgyNSUpOworICAgIGZpbHRlcjogaW52ZXJ0KDI1JSk7IH0KKyAgc3BhbltjbGFzc149J2ljb24tJ10uaW52ZXJzZSB7CisgICAgLXdlYmtpdC1maWx0ZXI6IGludmVydCgxMDAlKTsKKyAgICBmaWx0ZXI6IGludmVydCgxMDAlKTsgfQorCitzcGFuLmljb24tYWxlcnQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMTAnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nOCcgeDI9JzEyJyB5Mj0nMTInJTNFJTNDL2xpbmUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzE2JyB4Mj0nMTInIHkyPScxNiclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWJvb2ttYXJrIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00xOSAyMWwtNy01LTcgNVY1YTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1jYWxlbmRhciB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcmVjdCB4PSczJyB5PSc0JyB3aWR0aD0nMTgnIGhlaWdodD0nMTgnIHJ4PScyJyByeT0nMiclM0UlM0MvcmVjdCUzRSUzQ2xpbmUgeDE9JzE2JyB5MT0nMicgeDI9JzE2JyB5Mj0nNiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzgnIHkxPScyJyB4Mj0nOCcgeTI9JzYnJTNFJTNDL2xpbmUlM0UlM0NsaW5lIHgxPSczJyB5MT0nMTAnIHgyPScyMScgeTI9JzEwJyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tY3JlZGl0IHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NyZWN0IHg9JzEnIHk9JzQnIHdpZHRoPScyMicgaGVpZ2h0PScxNicgcng9JzInIHJ5PScyJyUzRSUzQy9yZWN0JTNFJTNDbGluZSB4MT0nMScgeTE9JzEwJyB4Mj0nMjMnIHkyPScxMCclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWVkaXQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIwIDE0LjY2VjIwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmg1LjM0JyUzRSUzQy9wYXRoJTNFJTNDcG9seWdvbiBwb2ludHM9JzE4IDIgMjIgNiAxMiAxNiA4IDE2IDggMTIgMTggMiclM0UlM0MvcG9seWdvbiUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWxpbmsgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYnJTNFJTNDL3BhdGglM0UlM0Nwb2x5bGluZSBwb2ludHM9JzE1IDMgMjEgMyAyMSA5JyUzRSUzQy9wb2x5bGluZSUzRSUzQ2xpbmUgeDE9JzEwJyB5MT0nMTQnIHgyPScyMScgeTI9JzMnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1oZWxwIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J005LjA5IDlhMyAzIDAgMCAxIDUuODMgMWMwIDItMyAzLTMgMyclM0UlM0MvcGF0aCUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMTAnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMTcnIHgyPScxMicgeTI9JzE3JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24taG9tZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMyA5bDktNyA5IDd2MTFhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6JyUzRSUzQy9wYXRoJTNFJTNDcG9seWxpbmUgcG9pbnRzPSc5IDIyIDkgMTIgMTUgMTIgMTUgMjInJTNFJTNDL3BvbHlsaW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24taW5mbyB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPScxMCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMTInIHkxPScxNicgeDI9JzEyJyB5Mj0nMTInJTNFJTNDL2xpbmUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzgnIHgyPScxMicgeTI9JzgnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1sb2NrIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NyZWN0IHg9JzMnIHk9JzExJyB3aWR0aD0nMTgnIGhlaWdodD0nMTEnIHJ4PScyJyByeT0nMiclM0UlM0MvcmVjdCUzRSUzQ3BhdGggZD0nTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbWFpbCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNNCA0aDE2YzEuMSAwIDIgLjkgMiAydjEyYzAgMS4xLS45IDItMiAySDRjLTEuMSAwLTItLjktMi0yVjZjMC0xLjEuOS0yIDItMnonJTNFJTNDL3BhdGglM0UlM0Nwb2x5bGluZSBwb2ludHM9JzIyLDYgMTIsMTMgMiw2JyUzRSUzQy9wb2x5bGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWxvY2F0aW9uIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMSAxMGMwIDctOSAxMy05IDEzcy05LTYtOS0xM2E5IDkgMCAwIDEgMTggMHonJTNFJTNDL3BhdGglM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTAnIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXBob25lIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMiAxNi45MnYzYTIgMiAwIDAgMS0yLjE4IDIgMTkuNzkgMTkuNzkgMCAwIDEtOC42My0zLjA3IDE5LjUgMTkuNSAwIDAgMS02LTYgMTkuNzkgMTkuNzkgMCAwIDEtMy4wNy04LjY3QTIgMiAwIDAgMSA0LjExIDJoM2EyIDIgMCAwIDEgMiAxLjcyIDEyLjg0IDEyLjg0IDAgMCAwIC43IDIuODEgMiAyIDAgMCAxLS40NSAyLjExTDguMDkgOS45MWExNiAxNiAwIDAgMCA2IDZsMS4yNy0xLjI3YTIgMiAwIDAgMSAyLjExLS40NSAxMi44NCAxMi44NCAwIDAgMCAyLjgxLjdBMiAyIDAgMCAxIDIyIDE2LjkyeiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXJzcyB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNNCAxMWE5IDkgMCAwIDEgOSA5JyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBkPSdNNCA0YTE2IDE2IDAgMCAxIDE2IDE2JyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PSc1JyBjeT0nMTknIHI9JzEnJTNFJTNDL2NpcmNsZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXNlYXJjaCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxMScgY3k9JzExJyByPSc4JyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPScyMScgeTE9JzIxJyB4Mj0nMTYuNjUnIHkyPScxNi42NSclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXNldHRpbmdzIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQ3BhdGggZD0nTTE5LjQgMTVhMS42NSAxLjY1IDAgMCAwIC4zMyAxLjgybC4wNi4wNmEyIDIgMCAwIDEgMCAyLjgzIDIgMiAwIDAgMS0yLjgzIDBsLS4wNi0uMDZhMS42NSAxLjY1IDAgMCAwLTEuODItLjMzIDEuNjUgMS42NSAwIDAgMC0xIDEuNTFWMjFhMiAyIDAgMCAxLTIgMiAyIDIgMCAwIDEtMi0ydi0uMDlBMS42NSAxLjY1IDAgMCAwIDkgMTkuNGExLjY1IDEuNjUgMCAwIDAtMS44Mi4zM2wtLjA2LjA2YTIgMiAwIDAgMS0yLjgzIDAgMiAyIDAgMCAxIDAtMi44M2wuMDYtLjA2YTEuNjUgMS42NSAwIDAgMCAuMzMtMS44MiAxLjY1IDEuNjUgMCAwIDAtMS41MS0xSDNhMiAyIDAgMCAxLTItMiAyIDIgMCAwIDEgMi0yaC4wOUExLjY1IDEuNjUgMCAwIDAgNC42IDlhMS42NSAxLjY1IDAgMCAwLS4zMy0xLjgybC0uMDYtLjA2YTIgMiAwIDAgMSAwLTIuODMgMiAyIDAgMCAxIDIuODMgMGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDEuODIuMzNIOWExLjY1IDEuNjUgMCAwIDAgMS0xLjUxVjNhMiAyIDAgMCAxIDItMiAyIDIgMCAwIDEgMiAydi4wOWExLjY1IDEuNjUgMCAwIDAgMSAxLjUxIDEuNjUgMS42NSAwIDAgMCAxLjgyLS4zM2wuMDYtLjA2YTIgMiAwIDAgMSAyLjgzIDAgMiAyIDAgMCAxIDAgMi44M2wtLjA2LjA2YTEuNjUgMS42NSAwIDAgMC0uMzMgMS44MlY5YTEuNjUgMS42NSAwIDAgMCAxLjUxIDFIMjFhMiAyIDAgMCAxIDIgMiAyIDIgMCAwIDEtMiAyaC0uMDlhMS42NSAxLjY1IDAgMCAwLTEuNTEgMXonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1zaGFyZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxOCcgY3k9JzUnIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQ2NpcmNsZSBjeD0nNicgY3k9JzEyJyByPSczJyUzRSUzQy9jaXJjbGUlM0UlM0NjaXJjbGUgY3g9JzE4JyBjeT0nMTknIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzguNTknIHkxPScxMy41MScgeDI9JzE1LjQyJyB5Mj0nMTcuNDknJTNFJTNDL2xpbmUlM0UlM0NsaW5lIHgxPScxNS40MScgeTE9JzYuNTEnIHgyPSc4LjU5JyB5Mj0nMTAuNDknJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1jYXJ0IHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzknIGN5PScyMScgcj0nMSclM0UlM0MvY2lyY2xlJTNFJTNDY2lyY2xlIGN4PScyMCcgY3k9JzIxJyByPScxJyUzRSUzQy9jaXJjbGUlM0UlM0NwYXRoIGQ9J00xIDFoNGwyLjY4IDEzLjM5YTIgMiAwIDAgMCAyIDEuNjFoOS43MmEyIDIgMCAwIDAgMi0xLjYxTDIzIDZINiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXVwbG9hZCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMTcgOCAxMiAzIDcgOCclM0UlM0MvcG9seWxpbmUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzMnIHgyPScxMicgeTI9JzE1JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tdXNlciB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjAgMjF2LTJhNCA0IDAgMCAwLTQtNEg4YTQgNCAwIDAgMC00IDR2MiclM0UlM0MvcGF0aCUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PSc3JyByPSc0JyUzRSUzQy9jaXJjbGUlM0UlM0Mvc3ZnJTNFIik7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHV0aWxpdGllcyBhbmQgaGVscGVyIGNsYXNzZXMuCisqLworLyogVXRpbGl0eSBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tZ2VuZXJpYy1ib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsKKyAgLS1nZW5lcmljLWJveC1zaGFkb3c6IDAgMC4yNXJlbSAwLjI1cmVtIDAgcmdiYSgwLCAwLCAwLCAwLjEyNSksIDAgMC4xMjVyZW0gMC4xMjVyZW0gLTAuMTI1cmVtIHJnYmEoMCwgMCwgMCwgMC4yNSk7IH0KKworLmhpZGRlbiB7CisgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCisudmlzdWFsbHktaGlkZGVuIHsKKyAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgIHdpZHRoOiAxcHggIWltcG9ydGFudDsKKyAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsKKyAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CisgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9CisKKy5ib3JkZXJlZCB7CisgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWdlbmVyaWMtYm9yZGVyLWNvbG9yKSAhaW1wb3J0YW50OyB9CisKKy5yb3VuZGVkIHsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpICFpbXBvcnRhbnQ7IH0KKworLmNpcmN1bGFyIHsKKyAgYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7IH0KKworLnNoYWRvd2VkIHsKKyAgYm94LXNoYWRvdzogdmFyKC0tZ2VuZXJpYy1ib3gtc2hhZG93KSAhaW1wb3J0YW50OyB9CisKKy5yZXNwb25zaXZlLW1hcmdpbiB7CisgIG1hcmdpbjogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDQpICFpbXBvcnRhbnQ7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgICAucmVzcG9uc2l2ZS1tYXJnaW4geworICAgICAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gMikgIWltcG9ydGFudDsgfSB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAgIC5yZXNwb25zaXZlLW1hcmdpbiB7CisgICAgICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pICFpbXBvcnRhbnQ7IH0gfQorCisucmVzcG9uc2l2ZS1wYWRkaW5nIHsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSAhaW1wb3J0YW50OyB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgICAgLnJlc3BvbnNpdmUtcGFkZGluZyB7CisgICAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpICFpbXBvcnRhbnQ7IH0gfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgICAucmVzcG9uc2l2ZS1wYWRkaW5nIHsKKyAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAhaW1wb3J0YW50OyB9IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgLmhpZGRlbi1zbSB7CisgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSBhbmQgKG1heC13aWR0aDogMTI3OXB4KSB7CisgIC5oaWRkZW4tbWQgeworICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgLmhpZGRlbi1sZyB7CisgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgIC52aXN1YWxseS1oaWRkZW4tc20geworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICAgIHdpZHRoOiAxcHggIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICAgIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OworICAgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApICFpbXBvcnRhbnQ7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgeworICAudmlzdWFsbHktaGlkZGVuLW1kIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKKyAgICB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsKKyAgICBtYXJnaW46IC0xcHggIWltcG9ydGFudDsKKyAgICBib3JkZXI6IDAgIWltcG9ydGFudDsKKyAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKSAhaW1wb3J0YW50OworICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgIC52aXN1YWxseS1oaWRkZW4tbGcgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICAgIHdpZHRoOiAxcHggIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICAgIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OworICAgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApICFpbXBvcnRhbnQ7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsgfSB9CisKKy8qIyBzb3VyY2VNYXBwaW5nVVJMPW1pbmktZGVmYXVsdC5jc3MubWFwICovCmRpZmYgLS1naXQgYS9faHRtcmVzYy9zdF9sb2dvLnBuZyBiL19odG1yZXNjL3N0X2xvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODAwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9faHRtcmVzYy9zdF9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCg==